why

为什么要做、背景

最近给umi写一个机器人,用于邀请新人进 umi contributor 群,希望有更多人来参加建设。umi是个react开箱即用的开源处理计划,概况能够看官网。
PR概况看:ci: PullRequest Checker by txp1035 Pull Request #10319 umijs/umi GitHub

what

处理计划是什么样子,做好后达成什么效果

  1. 非 doc pr 被合并时,发个音讯 感谢 PR。假如有兴趣一同参加维护 Umi,可先用钉钉扫下方二维码(注明 github id)加我钉钉,然后我会拉到群里。+图片
  2. 假如已经在群里或许有库房write权限的同学就不发送音讯了

how

怎样完结的

首要是经过gitHub action来完结的。 不了解gitHub action的朋友能够看GitHub Actions 入门教程 – 阮一峰的网络日志

文件放在项目里的.github/workflows

剖析条件

非 doc pr 被合并时

这儿拆分成两个条件来处理

  1. 非 doc 提交。在umi中,文档的改变都是在docs/**里的,所以用户只改动这个文件夹里的文件忽略履行action就行了。当然也能够去判别pr的标题是不是doc: 来过滤。假如你知道欢迎评论~
  2. 被合并的时分。就是在pr封闭时,判别这个pr是不是被合并的状态。前者在on做判别,后者在jobs做判别。

发个音讯 `感谢 PR

这儿用到了一个第三方action,actions-cool/maintain-one-comment@v3。就用用来发送音讯的,装备这个需求打开设置,给机器人权限,不然会报错。

如何让github机器人自动帮你发消息

判别条件不发送音讯

不发送音讯有两个状况:

  1. 在钉钉群里的同学不发送音讯
  2. 有库房write权限的同学不发送音讯

先解第一个问题,计划是维护一个数组json文件,文件里维护群里同学的github id。然后判别提交者是否在这个数组里边,在就不发送音讯。这儿经过juliangruber/read-file-action@v1读取文件、contains方法来判别提交者(github.actor)是否在这个数组(fromJSON(needs.read-file.outputs.require-result))里边。

再解第二个问题,这儿直接经过actions-cool/check-user-permission@v2库就能知道用户是不是有权限。

详细源码如下:

name: PullRequest Checker # 姓名,随意取,契合你自动化的主题就行
on: # 满意什么条件触发
  pull_request_target: # pr封闭的时分
	types: # pr封闭的时分
	  - closed # pr封闭的时分
	paths-ignore: # docs下目录内容改变忽略
	  - 'docs/**' # docs下目录内容改变忽略
jobs:
  read-file: # 姓名,随意取,契合你自动化的主题就行
	runs-on: ubuntu-latest # 在什么渠道运转
	outputs:  # 选项
	  require-result: ${{ steps.contributors.outputs.content}} # 导出参数
	steps: # 履行什么事情
	  - name: Checkout # 姓名,随意取,契合你自动化的主题就行
		uses: actions/checkout@v1 # 检查库,不然读取不到文件
	  - name: Read contributors.json # 姓名,随意取,契合你自动化的主题就行
		id: contributors # 文件导出的字符串存储变量
		uses: juliangruber/read-file-action@v1 # 读取文件插件
		with:
		  path: ./contributors.json # 途径参数
  check-permission: # 姓名,随意取,契合你自动化的主题就行
    runs-on: ubuntu-latest # 在什么渠道运转
	outputs: # 选项
	  require-result: ${{ steps.checkUser.outputs.require-result }} # 导出参数
	steps: # 履行什么事情
	  - uses: actions-cool/check-user-permission@v2 # 权限插件获取用户插件
		id: checkUser 
		with:
		  require: 'write'
  check_merged: # 姓名,随意取,契合你自动化的主题就行
	runs-on: ubuntu-latest # 在什么渠道运转
	needs: [read-file, check-permission] # 导入参数
	if: needs.check-permission.outputs.require-result == 'false' && contains(fromJSON(needs.read-file.outputs.require-result), github.actor) == false && github.event.pull_request.merged == true # 发送音讯需求满意的条件
	steps: # 履行什么事情
	  - uses: actions-cool/maintain-one-comment@v3 # 发评论插件
		with:
		  body: 感谢 PR。假如有兴趣一同参加维护 Umi,可先用钉钉扫下方二维码(注明 github id)加我钉钉,然后我会拉到群里。<img src="https://www.6hu.cc/storage/2023/02/1676451309-42c861c9c327cfc.png" width="20%"/>

后记

github action我也不常用,所以记载一下踩坑和处理方法。

踩坑

  1. 他人action写readme的不一定合适新手, 假如依照action的README文档运用履行失利能够到库房里找找比方,或许它还依靠其他的action。并且直接看库房比方也更直观,比方在.github文件夹下面。
  2. 调试:由于我这个需求是做pr封闭来的,我自建了个库房一向经过建立pr的方法进行调试,快完结的时分反应过来了,经过push触发action更快~I’m so stupid.

如何让github机器人自动帮你发消息

处理方法和技巧

  1. 推荐在官方文档查api,输入对应关键词。
  2. 假如api都懒到不想看,能够试试谷歌。首要原因是文档不能针对action进行查询有点不友好。
  3. 假如功能杂乱能够先试试看action社区里查找下。
  4. . 由于action日志输出对象是个object,所以想知道里边是什么能够经过toJSON这个方法来转成字符串,不过这个方法也或许失灵,比方打印gihub这个上下文,详细原因还没有查,我猜里边有无法序列化的东西。我想到的只能是看api,有知道怎样能打印出来的的大佬能够告诉我~thanks

如何让github机器人自动帮你发消息

闪念

经常做需求就会给自己挖坑,脑子会蹦出一些好玩的想法。比方做这个机器人,我就想可不能够守时基于钉钉群人员姓名自动更新github共建者列表,或许经过能够@机器人添加。这个单纯是好玩的想法ROI有点低哈哈。

最终

祝我们元宵节高兴。欢迎运用umi,假如你运用过程中遇到问题能够提issue,也欢迎提pr处理。

参考

表达式 – GitHub Docs
docs.github.com/en/actions/…