近期因为某些(穷)缘由,团队机器人由travis
全面切换到了github actions
,因为习惯了travis
机器人自动提醒,因此总但愿可以在github actions
推送钉钉的过程当中更加人性化。看下最终效果:html
点击相应的连接后能够跳转到对应的pull request
。git
成功实现上述效果进行了32次提交
特此记录解决过程,但愿能对你们有所帮助。github
name: get pull request info for Dingding on: pull_request: jobs: spring-boot: runs-on: ubuntu-latest timeout-minutes: 10 steps: - name: checkout uses: actions/checkout@v2 # 此处省略具体的业务代码 # 获取PR信息并将其添加到环境变量 - name: set PR_INFO run: | echo PR_NUMBER=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') >> $GITHUB_ENV echo PR_TITLE=$(jq --raw-output .pull_request.title "$GITHUB_EVENT_PATH") >> $GITHUB_ENV echo PR_URL=$(jq --raw-output .pull_request.html_url "$GITHUB_EVENT_PATH") >> $GITHUB_ENV echo PR_USER=$(jq --raw-output .pull_request.user.login "$GITHUB_EVENT_PATH") >> $GITHUB_ENV # 打印环境变量 - name: print env run: printenv # 发送钉钉消息 - name: build success if: ${{ success() }} uses: fifsky/dingtalk-action@master with: url: https://oapi.dingtalk.com/robot/send?access_token=这里写钉钉机器人的token type: markdown content: | # 💯👨💻 Success 🎉🎉🎉 > Maven Build of [# ${{ env.PR_TITLE }}](${{ env.PR_URL }}) by ${{ env.PR_USER }} success > ^_^ from github action message - name: maven build failure if: ${{ failure() }} uses: fifsky/dingtalk-action@master with: url: https://oapi.dingtalk.com/robot/send?access_token=${{ env.DING_TOKEN}}若是是公有项目则应该在github项目中依次点击settings -> secret 添加一个DING_TOKEN,并设置为本身的钉钉机器人token type: markdown content: | # 💤🤷♀️ failure 🙅♂️💣 > Maven Build of [# ${{ env.PR_TITLE }}](${{ env.PR_URL }}) by ${{ env.PR_USER }} failure > (⋟﹏⋞) from github action message
解决过的主要精力在于获取PR信息,以及若是将获取到的PR信息添加到环境变量中。具体解决历程以下:web
若但愿打造一个更友好的钉钉提示消息,咱们须要在github actions
中最少获取pull request
的名称、地址、提交者。spring
很遗憾github actions
提供的默认环境变量中并无给出友好的pull reqeuest
信息,惟一可以找到一些pull reqeuest
信息的环境变量为$GITHUB_REF
,形式为refs/pull/:prNumber/merge
。json
即便咱们能够经过$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
的方法来获取到该PR号,但仍然没法获取到PR的名称。ubuntu
若要获取到更多的信息,则须要结合使用环境变量GITHUB_EVENT_PATH
segmentfault
官方如上说明:该变量的值是个文件path,该文件记录了本次webhook的完整信息。打印环境变量:api
- name: print env run: printenv
显示为:安全
GITHUB_EVENT_PATH=/home/runner/work/_temp/_github_workflow/event.json
接着显示该文件中的内容:
- name: print event run: more /home/runner/work/_temp/_github_workflow/event.json
此时咱们便获取到一个完整的信息,在此我去除掉大部分本次没有用的信息,展现一些有用的信息以下:
{ "action": "synchronize", "number": 356, "pull_request": { "html_url": "https://github.com/yunzhiclub/questionnaire/pull/356", "title": "Update maven.yml", "user": { "login": "teacherpan", } }, "repository": { "description": "问卷系统", } }
想要的信息有了之后就可使用jq
命令由json文件中获取到相应的信息了:
好比使用$(jq --raw-output .pull_request.title "$GITHUB_EVENT_PATH")
来获取PR的标题。
github actions
的环境变量设置好像仅仅可以设置静态的值,好比:
jobs: weekday_job: runs-on: ubuntu-latest env: DAY_OF_WEEK: Mon
但没法将一些执行语句的返回值设置给某个环境变量,最终使用的是将特定的值写入$GITHUB_ENV
的方法:
- name: set PR_INFO run: | echo PR_NUMBER=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') >> $GITHUB_ENV echo PR_TITLE=$(jq --raw-output .pull_request.title "$GITHUB_EVENT_PATH") >> $GITHUB_ENV echo PR_URL=$(jq --raw-output .pull_request._links.html.href "$GITHUB_EVENT_PATH") >> $GITHUB_ENV echo PR_USER=$(jq --raw-output .pull_request.user.login "$GITHUB_EVENT_PATH") >> $GITHUB_ENV
在系统变量中有了相关的PR信息,发送消息即是最简单的一环了。在github actions 市场中以Ding ding为关键字能够找到不少相关的actions。咱们使用的是fifsky/dingtalk-action
。
- name: build success if: ${{ success() }} uses: fifsky/dingtalk-action@master with: url: https://oapi.dingtalk.com/robot/send?access_token=这里写钉钉机器人的token type: markdown content: | # 💯👨💻 Success 🎉🎉🎉 > Maven Build of [# ${{ env.PR_TITLE }}](${{ env.PR_URL }}) by ${{ env.PR_USER }} success > ^_^ from github action message
由于GITHUB ACTIONS
的IP应该不是静态不变的,因此钉钉机器人的认证方式只能采用关键字
的方式。若是你的项目是公有项目,则须要注意隐藏掉钉钉TOKEN。不然哪天你的钉钉莫名的接收到一些广告的话,就不要奇怪了。
隐藏TOKEN的方式是在GITHUB对应的项目中,依次点 设置 -> 安全 -> token,而后创建一个DING_TOKEN
。最后使用access_token=${{ DING_TOKEN }}
。
钉钉机器人是能够接收markdown
格式消息的,这也意味着咱们能够在提醒的消息上加入一些自定义的图片或是为文字增长颜色等。但更简单的方法是引入emoji图标,直接将图标复制再粘贴到对应的位置就能够了,该图标就是一个标准的文字。
😎 👩🦳 🍁 🍇
开发一个定制的github action
来简化上述步骤。