团队协作提效:GitHub Actions 实现自动化代码审查,告别低效 Review
作为一名老码农,我深知代码审查(Code Review)是保证项目质量的关键环节。但传统的代码审查方式,耗时费力,效率低下,经常让团队成员苦不堪言。特别是当团队规模扩大,代码量激增时,这种问题会更加突出。如何让代码审查更高效、更智能?我的答案是:GitHub Actions!
今天,我就以一个团队协作的场景为例,手把手教你如何使用 GitHub Actions 搭建一套自动化代码审查流程,包括代码风格检查、单元测试和安全漏洞扫描,让你的团队告别低效 Review,提升协作效率。
一、场景设定:模拟团队协作开发
假设我们有一个名为 awesome-project
的 GitHub 仓库,团队成员 John 和 Jane 负责协同开发。John 提交了一个新的 Pull Request,我们需要确保他的代码符合规范,并通过所有测试,才能将其合并到主分支。
二、GitHub Actions 工作流设计
我们的目标是创建一个 GitHub Actions 工作流,实现以下功能:
- 代码风格检查:使用 ESLint 检查 JavaScript 代码风格。
- 单元测试:运行 Jest 单元测试。
- 安全漏洞扫描:使用 Snyk 扫描依赖项中的安全漏洞。
- 自动通知:根据审查结果自动发送通知。
三、配置 GitHub Actions 工作流
创建工作流文件:在你的 GitHub 仓库中,创建一个名为
.github/workflows/code-review.yml
的文件。这个文件将定义我们的工作流。编写工作流 YAML 文件:将以下代码复制到
code-review.yml
文件中:
name: Code Review on: pull_request: branches: [ main ] jobs: code-review: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: '16' - name: Install dependencies run: npm install - name: Run ESLint run: npm run lint - name: Run Jest tests run: npm run test - name: Run Snyk security scan uses: snyk/actions/node@master env: SNYK_TOKEN: $\{\{ secrets.SNYK_TOKEN \}\} with: command: test args: --severity-threshold=high - name: Send Slack notification if: always() uses: slackapi/slack-github-action@v1.18.0 with: slack-message-payload: | { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": ":: *Code Review Result* ::\nRepository: $\{\{ github.repository \}\} \nCommit: $\{\{ github.sha \}\} \nWorkflow: $\{\{ github.workflow \}\} \nEvent Name: $\{\{ github.event_name \}\} \nActor: $\{\{ github.actor \}\} \nJob Status: $\{\{ job.status \}\} \nMore info: $\{\{ github.server_url \}\} $\{\{ github.repository \}\} /actions/runs/$\{\{ github.run_id \}\}" } } ] } env: SLACK_BOT_TOKEN: $\{\{ secrets.SLACK_BOT_TOKEN \}\}
- 解读 YAML 文件
name
:工作流的名称,这里我们命名为 “Code Review”。on
:触发工作流的事件。这里我们指定为pull_request
,并且只针对main
分支。jobs
:定义工作流中的任务。我们只有一个任务,名为code-review
。runs-on
:指定运行任务的操作系统,这里我们使用ubuntu-latest
。steps
:定义任务中的步骤。每个步骤都执行一个特定的操作。actions/checkout@v3
:检出代码。actions/setup-node@v3
:设置 Node.js 环境。npm install
:安装项目依赖。npm run lint
:运行 ESLint 代码风格检查。npm run test
:运行 Jest 单元测试。snyk/actions/node@master
:运行 Snyk 安全漏洞扫描。slackapi/slack-github-action@v1.18.0
: 发送 Slack 通知
env
:定义环境变量。SNYK_TOKEN
:Snyk API Token,用于进行安全漏洞扫描。你需要将你的 Snyk Token 存储在 GitHub Secrets 中。SLACK_BOT_TOKEN
:Slack Bot Token,用于发送 Slack 通知。你需要将你的 Slack Bot Token 存储在 GitHub Secrets 中。
secrets
:引用 GitHub Secrets 中存储的敏感信息。
配置 GitHub Secrets:
- SNYK_TOKEN:在 Snyk 官网注册账号并获取 API Token,然后在你的 GitHub 仓库的 Settings -> Secrets -> Actions 中,创建一个名为
SNYK_TOKEN
的 Secret,并将你的 Snyk API Token 填入。 - SLACK_BOT_TOKEN:创建一个 Slack App,并添加
chat:write
权限。然后生成一个 Bot User OAuth Token,并在你的 GitHub 仓库的 Settings -> Secrets -> Actions 中,创建一个名为SLACK_BOT_TOKEN
的 Secret,并将你的 Slack Bot Token 填入。
- SNYK_TOKEN:在 Snyk 官网注册账号并获取 API Token,然后在你的 GitHub 仓库的 Settings -> Secrets -> Actions 中,创建一个名为
配置 ESLint 和 Jest:
ESLint:如果你的项目还没有配置 ESLint,可以使用以下命令进行初始化:
npm install eslint --save-dev npx eslint --init 然后,在你的
package.json
文件中,添加一个名为lint
的 script:"scripts": { "lint": "eslint ." } Jest:如果你的项目还没有配置 Jest,可以使用以下命令进行安装:
npm install jest --save-dev
然后,在你的
package.json
文件中,添加一个名为test
的 script:"scripts": { "test": "jest" }
四、测试工作流
创建 Pull Request:John 创建一个新的 Pull Request,提交一些包含代码风格问题和潜在安全漏洞的代码。
观察工作流运行:GitHub Actions 会自动触发我们刚刚配置的工作流。你可以在 Pull Request 的 “Checks” 选项卡中,查看工作流的运行状态。
查看审查结果:
- 代码风格检查:如果 ESLint 发现代码风格问题,工作流会失败,并显示错误信息。John 需要根据错误信息修改代码。
- 单元测试:如果单元测试失败,工作流也会失败,并显示错误信息。John 需要修复代码中的 bug。
- 安全漏洞扫描:如果 Snyk 发现依赖项中的安全漏洞,工作流会发出警告,并提供修复建议。John 需要更新依赖项或采取其他安全措施。
- Slack 通知:无论工作流成功或失败,都会发送 Slack 通知,告知团队成员审查结果。
五、优化工作流
缓存依赖项:为了加快工作流的运行速度,可以使用
actions/cache@v3
缓存 Node.js 依赖项。- name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: $\{\{ runner.os \}\
-\{ hashFiles('/package-lock.json') }}
restore-keys:
${{ runner.os }
-\{ hashFiles('/package-lock.json') }}
```
并行运行任务:如果你的工作流包含多个耗时的任务,可以考虑并行运行这些任务,以缩短整体运行时间。
jobs: lint: runs-on: ubuntu-latest steps: ... test: runs-on: ubuntu-latest needs: lint steps: ... security: runs-on: ubuntu-latest needs: [lint, test] steps: ... 自定义通知内容:你可以根据自己的需求,自定义 Slack 通知的消息内容,使其包含更多有用的信息。
- name: Send Slack notification if: always() uses: slackapi/slack-github-action@v1.18.0 with: slack-message-payload: | { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": ":: *Code Review Result* ::\nRepository: $\{\{ github.repository \}\} \nCommit: $\{\{ github.sha \}\} \nWorkflow: $\{\{ github.workflow \}\} \nEvent Name: $\{\{ github.event_name \}\} \nActor: $\{\{ github.actor \}\} \nJob Status: $\{\{ job.status \}\} \nMore info: $\{\{ github.server_url \}\} $\{\{ github.repository \}\} /actions/runs/$\{\{ github.run_id \}\} \nErrors: $\{\{ steps.eslint.outputs.errors \}\} \nWarnings: $\{\{ steps.eslint.outputs.warnings \}\}" } } ] } env: SLACK_BOT_TOKEN: $\{\{ secrets.SLACK_BOT_TOKEN \}\}
六、总结
通过 GitHub Actions,我们可以轻松地搭建一套自动化代码审查流程,提高团队协作效率,保证项目质量。希望这篇文章能够帮助你更好地理解和使用 GitHub Actions,让你的团队开发更加高效、智能!
一些额外的思考
- 代码审查规则的制定:自动化代码审查只是辅助手段,更重要的是团队需要制定明确的代码审查规则,并严格执行。
- 持续集成/持续部署 (CI/CD):GitHub Actions 不仅可以用于代码审查,还可以用于构建、测试和部署应用程序,实现完整的 CI/CD 流程。
- 与其他工具的集成:GitHub Actions 可以与各种第三方工具集成,例如 SonarQube、Coveralls 等,进一步提升代码质量。
希望这些思考能帮助你更深入地理解 GitHub Actions 的价值,并将其应用到你的实际项目中。记住,技术只是工具,关键在于如何使用它来解决实际问题,提升团队效率,创造更大的价值!
最后,分享一些我常用的 GitHub Actions 相关的资源:
- GitHub Actions 官方文档:https://docs.github.com/en/actions
- GitHub Actions Marketplace:https://github.com/marketplace?type=actions
- Awesome Actions:https://github.com/sdras/awesome-actions
希望这些资源能帮助你更好地学习和使用 GitHub Actions!