5

近期由于某些(穷)原因,团队机器人由travis全面切换到了github actions,由于习惯了travis机器人自动提醒,所以总希望能够在github actions推送钉钉的过程中更加人性化。看下最终效果:

image.png

点击相应的链接后可以跳转到对应的pull request

成功实现上述效果进行了32次提交
image.png
image.png
特此记录解决过程,希望能对大家有所帮助。

解决方案

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
image.png

官方如上说明:该变量的值是个文件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来简化上述步骤。


潘杰
3.1k 声望238 粉丝

引用和评论

0 条评论