近期由于某些(穷)原因,团队机器人由travis
全面切换到了github actions
,由于习惯了travis
机器人自动提醒,所以总希望能够在github actions
推送钉钉的过程中更加人性化。看下最终效果:
点击相应的链接后可以跳转到对应的pull request
。
成功实现上述效果进行了32次提交
特此记录解决过程,希望能对大家有所帮助。
解决方案
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信息添加到环境变量中。具体解决历程如下:
获取pull request相关信息
若希望打造一个更友好的钉钉提示消息,我们需要在github actions
中最少获取pull request
的名称、地址、提交者。
很遗憾github actions
提供的默认环境变量中并没有给出友好的pull reqeuest
信息,唯一能够找到一些pull reqeuest
信息的环境变量为$GITHUB_REF
,形式为refs/pull/:prNumber/merge
。
即使我们可以通过$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
的方法来获取到该PR号,但仍然无法获取到PR的名称。
若要获取到更多的信息,则需要结合使用环境变量GITHUB_EVENT_PATH
官方如上说明:该变量的值是个文件path,该文件记录了本次webhook的完整信息。打印环境变量:
- 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 }}
。
引入emoji图标字
钉钉机器人是可以接收markdown
格式消息的,这也意味着我们可以在提醒的消息上加入一些自定义的图片或是为文字增加颜色等。但更简单的方法是引入emoji图标,直接将图标复制再粘贴到对应的位置就可以了,该图标就是一个标准的文字。
😎 👩🦳 🍁 🍇
todo
开发一个定制的github action
来简化上述步骤。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。