![f5b6c432-f1f1-449d-8a83-89460712bfd3-XC1[{JH]QGC82MEN~K%XCRI.jpg](/assets/uploads/files/1635085708281-f5b6c432-f1f1-449d-8a83-89460712bfd3-xc1-jh-qgc82men-k-xcri.jpg)


Karlatemp 发布的帖子
-
GitHub PullRequest 自动审核合并发布在 技术交流板块
众所周知, github actions 可以完成很多自动化任务, 比如代码持续CI, 版本发布自动化, new issue 内容检查等.
当然,github actions 也可以用作 PR 自动审查合并, 不过, 要完成这些需要一些额外的配置..
首先需要知道的是,
on: pull_request的 workflow 是只有readonly的权限的, 这也就意味着通过on: pull_request发起的 workflow 除了读取已公开的内容之外什么都干不了. 包括访问${{ secrets.XXXX }}也是不被允许的需要完成自动合并, 需要更高权限(也意味着更危险的) workflow, pull_request_target
pull_request_target与pull_request的用法基本一致, 但是主要有以下的区别actions/checkout@v2会签出到被 PR 的分支(也就是源仓库的内容), 而不是经过 PR 修改后的内容pull_request_target拥有 write 权限, 可以写入源仓库, 访问${{ secrets.XXX }}(这是pull_request所不允许的)
知道以上的主要区别之后就可以编写 PR 自动审查了
首先需要获取源仓库的内容 (当然绝对不可以直接 checkout!!!)
可以选择在当前目录来获取修改,或者创建一个新文件夹来获取修改
# Way 1 - uses: actions/checkout@v2 with: ref: pull/${{ github.event.pull_request.number }}/head path: the_pr # Way 2 - run: git fetch origin pull/$PR_NUM/head:THE_PR env: PR_NUM: ${{ github.event.pull_request.number }}然后是提取该 PR 的修改
BASE_SHA: ${{ github.event.pull_request.base.sha }} git rev-list --count "$BASE_SHA..THE_PR" > tmp/count cat tmp/count git --no-pager diff "$BASE_SHA..THE_PR" --no-color --output tmp/change-diff git --no-pager diff "$BASE_SHA..THE_PR" --name-only --output tmp/name-changed此时
tmp/name-changed存储着该 PR 修改的全部文件的文件路径tmp/change-diff则为 PR 与 base 的 diff 文件tmp/count为一个数字, 该数字代表 base 与 pr 直接相差的 commit 数量
在进行一系列 PR 审核之后, 需要将审核结果返回出去 (
Merge或者Reject(Request change))需要用到的两个 REST API 为 Create a review for a pull request, Merge a pull request
通过
Create a review for a pull request可以对一个 PR 进行自动审查, 可以是Approve或者Reject(Request changes), 亦或者只是简单的评论Comment然后就可以通过
Merge a pull request完成全自动 PR 合并了, 唯一需要给定的参数sha为 PullRequest 的最后一个 commit 的 id, 可以通过执行git rev-parse THE_PR获得该参数的值
额外话: 使用
${{ secrets.GITHUB_TOKEN }}合并后, 不会触发 workflowon: push
如果需要 merge commit 也执行on: push的, 请使用${{ secrets.PR_REVIEWER_TOKEN }}代替GITHUB_TOKEN
参考与应用
-
RE: 在插件中嵌入ktor失败?发布在 开发交流
请确定打包的插件携带了 ktor-server-netty 等必要依赖,你可能需要 https://github.com/project-mirai/mirai-slf4j-bridge 来开启全部日志
-
RE: LuckPerms - Mirai - 高级权限服务插件发布在 插件发布
/lp user是固定sub command, 并没有user=123456789, 因为数据库用户名就是 QQ号eg
/lp user 1234567890 info -
RE: 插件能用socket吗发布在 开发交流
import java.io.* fun main() { val socket = Socket("127.0.0.1", 10086) socket.getOutputStream().write("HelloWorld!".getBytes(Charsets.UTF8)) socket.getOutputStream().flush() socket.getInputStream().read() // read response }
