前言
为了优化开发体验,设想的是小伙伴每次提交 PR 的时候,能够推送消息到钉钉群,提醒大家帮忙 Review, Github 提供
丰富的 web hooks
可以做这件事
为什么不用 Web Hooks
点击钉钉 -> 群设置 -> 智能群助手 添加自定义机器人
点击 Setting -> Webhooks 配置 event 为 pull_request 即可
配置好机器人后,一切正常,但是会有两个小问题
- 不能 @所有人
- pull request 的钩子 不能精确到 pr 打开的时候才提醒,所以在 pr 打开,更新,有评论,关闭 等的时候都会收到提醒,太频繁了,体验不是很好,但是我发现 Github Action 可以做到这一点!
Github Action 和 普通 npm 包的区别
1. 文件构成
npm
- 源码
- package.json
action
- 源码
- action.yml
npm 包是通过 package.json 描述包的信息,而 action 通过 action.yml 描述,区别不大,只是形式不一样
2. 发布方式
npm
1 | npm publish |
action
3. 使用方式
npm
1 | npm install xx@0.0.1 |
action
1 | jobs: |
action 除了可以使用 release 后的具体版本号 action@x.x.x
之外,还可以直接使用源码的分支 action@main
新版本的 repo 主分支是 main
, 老 repo 是 我们熟悉的 master
, 所以这样使用也是可以的
1 | jobs: |
发送钉钉消息
现在开始编写代码,发送让万千中小学生梦中惊醒的 午夜凶 Ding,这个很简单,调用 钉钉官方的 SDK 即可,这里找到个简化了的官方 SDK 的模块 ding-robot
, 我们这里使用 @all 功能即可
1 | const DingRobot = require('ding-robot'); |
集成到 Github Action 中
1. 钉钉消息构成
一条消息,预期要有当前 PR 的标题和链接,然后是谁的 PR, 使用官方的 @actions/github
1 | const github = require('@actions/github'); |
2. 接受用户参数
在 Action 里,参数通过 with
声明,在脚本中,可以通过官方的 @actions/core
拿到,我们这里要拿到 钉钉 TOKEN
1 | const core = require('@actions/core'); |
3. 完整代码
1 | const core = require('@actions/core'); |
4. 打包源代码
使用 ncc 打包,将源码打包成单文件,提供给 Action 运行
1 | npm install /ncc |
5. 编写 action.yml
参考 官方文档 即可,复述一遍文档没啥意义,最后指定 main
为打包后的 dist/index.js
当别人使用你的 Action 时,其实就是运行的 index.js 文件
1 | # https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions |
6. 发布
发布比较简单,手动点几下就可以了,自动化的方式也有,自行搜索
最后就可以在 Github 的 Marketplace 搜索到你发布的 Action 了
使用
写完之后,我们随便找个仓库测试一下,实现编写 Action,让 PR 在打开的时候发送钉钉通知
1 | name: 🔊 PR Ding Talk Notify |
大功告成,仓库地址 https://github.com/lijinke666/ding-talk-pr-notify
参考链接
https://github.com/actions-cool
https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions