打造专属 GitHub 项目 Bot,轻松提升开源项目档次

310 阅读4分钟

GitHub Actions 是 GitHub 提供的一种持续集成和持续交付(CI/CD)工具,可以帮助开发者自动化任务。我们可以通过自定义 GitHub Actions 工作流,构建一个类似 GitHub Actions Bot 的功能,例如自动回复 PR、分配 Issue 或者触发其他自动化任务。

在这篇博客中,我将带你一步步实现一个简单的 GitHub Actions Bot,能够自动回复 PR 并根据特定条件触发操作。


一、什么是 GitHub Actions Bot?

GitHub Actions Bot 是一种通过工作流自动执行特定任务的“虚拟用户”。你可以配置它执行以下任务:

  • 根据 PR 的标题或内容自动添加评论;
  • 识别 Issue 标签并分配相关人员;
  • 执行代码质量检查或触发构建流程。

通过 GitHub Actions,你可以轻松实现上述功能,而无需额外部署服务器。像下面这样的

image-20241117161239524.png

这个就是配置的 github-actions bot ,这个是一个GitHub官方的。 那么我们如果要实现一个类似的该如何处理。


二、准备工作

  1. 一个 GitHub 仓库:新建或使用现有仓库。这里我使用的是 rocketmq-rust 这个开源项目
  2. Personal Access Token (PAT) :如果需要通过 API 执行复杂操作(如更新 Issue 评论),需要创建一个带有合适权限的 PAT。

创建 PAT 的步骤

  • 进入 GitHub Settings
  • 点击 Generate new token,选择 repo 范围的权限。
  • 生成后保存该 token。

在这之前需要建一个作为Bot的账号

image-20241117161626848.png 然后创建Token

image-20241117161705331.png

注意: 这里使用的 Personal access tokens (classic) 类型的Token, 权限主要是仓库和action的担心就全部勾上。Fine-grained personal access tokens 这个我也试了但是提示权限不足。


  • 邀请Bot账号作为项目的Collaborator

image-20241117162005380.png

到这里就基本上完成了所有的前期准备工作了。

三、工作流配置

1. 创建工作流文件

在你的仓库中,

image-20241117162136498.png

这里我有6个,具体可以看我的Rocketmq-rust项目里面,下面我们看一个

name: Auto Comment on PR

on:
  pull_request_target:
    types: [ opened, synchronize ]
    branches: [ main ]

jobs:
  comment:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Create a comment
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.BOT_TOKEN  }}
          script: |
            const { owner, repo, number: issue_number } = context.issue;
            
            // Get PR creator's username
            const prCreator = context.payload.pull_request.user.login;
            
            const commentBody = `🚀Thanks for your contribution 🎉 @${prCreator}. CodeRabbit(AI) will review your code first 🔥`;
            github.rest.issues.createComment({
              owner,
              repo,
              issue_number,
              body: commentBody
            });
            github.rest.issues.addLabels({
                owner,
                repo,
                issue_number,
                labels: ['ready to review','waiting-review','Ai ready to review']
              });

这个主要的作用就是为了再开发人员提交了PR的时候添加评论和对应PR标签

image-20241117162809037.png

2. 配置密钥

.github/workflows/auto-comment-pr.yml 中,默认使用 secrets.GITHUB_TOKEN,这是 GitHub 提供的内置 Token。如果需要更高权限的操作,可以将你的 PAT 保存到仓库的 Settings > Secrets and variables > Actions 中,命名为 BOT_TOKEN,然后在代码中替换 secrets.GITHUB_TOKENsecrets.BOT_TOKEN

image-20241117162858871.png


四、工作流解析

1. 触发条件

on 部分指定了触发事件:

  • pull_request_target:在 PR 创建或编辑时触发。
  • issues:在 Issue 创建或被打上标签时触发。

这些Actions的整体实现的功能就是,添加评论和请求CodeReview,在code review完成后关闭PR合并代码到主分支

image.png

image.png

完成Approved后

image.png

五、优化与扩展

1. 使用社区 Action

手写 curl 可以实现基础功能,但更复杂的场景建议使用社区开发的 Actions,例如:

示例:

- name: Add Labels
  uses: actions-ecosystem/action-add-labels@v1
  with:
    labels: 'bug, high-priority'
    github_token: ${{ secrets.GITHUB_TOKEN }}

2. 响应更复杂的事件

可以通过自定义脚本实现更复杂的条件逻辑,例如:

  • 使用 nodepython 编写脚本;
  • 集成更高级的 GitHub API 功能。

3. 定时任务

GitHub Actions 还支持定时触发,例如每日检查未关闭的 Issue 并提醒负责人:

on:
  schedule:
    - cron: '0 9 * * *' # 每天 9 点触发

六、总结

通过 GitHub Actions 和 GitHub API,我们可以轻松构建一个类似 GitHub Actions Bot 的自动化工具,无需额外服务器。本文示例仅展示了基础功能,实际应用中可以根据项目需求扩展复杂逻辑,比如自动化部署、代码检查、测试通知等。

欢迎在评论区分享你的 GitHub Actions 用例或问题!