在github actions中获取pull request连接等信息并推送钉钉的一种方法

近期因为某些(穷)缘由,团队机器人由travis全面切换到了github actions,因为习惯了travis机器人自动提醒,因此总但愿可以在github actions推送钉钉的过程当中更加人性化。看下最终效果:html

image.png

点击相应的连接后能够跳转到对应的pull requestgit

成功实现上述效果进行了32次提交
image.png
image.png
特此记录解决过程,但愿能对你们有所帮助。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

获取pull request相关信息

若但愿打造一个更友好的钉钉提示消息,咱们须要在
github actions中最少获取pull request名称地址提交者spring

很遗憾github actions提供的默认环境变量中并无给出友好的pull reqeuest信息,惟一可以找到一些pull reqeuest信息的环境变量为$GITHUB_REF,形式为refs/pull/:prNumber/mergejson

即便咱们能够经过$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')的方法来获取到该PR号,但仍然没法获取到PR的名称。ubuntu

若要获取到更多的信息,则须要结合使用环境变量GITHUB_EVENT_PATH
image.pngsegmentfault

官方如上说明:该变量的值是个文件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 }}

引入emoji图标字

钉钉机器人是能够接收markdown格式消息的,这也意味着咱们能够在提醒的消息上加入一些自定义的图片或是为文字增长颜色等。但更简单的方法是引入emoji图标,直接将图标复制再粘贴到对应的位置就能够了,该图标就是一个标准的文字。

😎 👩‍🦳 🍁 🍇

todo

开发一个定制的github action来简化上述步骤。