使用act本地调试github action

前言

今年git-ops应该是比较流行的概念了。很多新兴创业公司尤其是本身需要开源的更加会重度依赖github提供的CI能力。使用github action是git-ops中不可缺少的环节,今天就分享一款开源工具act,它可以帮助我们在本地调试github action。本地调试github action的好处主要是快速的反馈。如果通过git push代码再触发github action,那么测试的流程就会变得比较长,push的代码还会污染仓库。

基本原理

Act 的执行原理如下:

  1. 首先,act 解析你的 .github/workflows 目录中的工作流程文件,并找到要执行的工作流程。它可以解析多个工作流程文件,包括 yaml 和 json 格式的文件。
  2. 接下来,act 创建一个与 GitHub Actions 中的 Runner 类似的容器环境。这个容器环境可以在本地运行,并与你的代码仓库同步。它使用 Docker 技术创建一个运行环境,该环境包含了所有需要的依赖项和配置。
  3. 一旦容器环境准备就绪,act 开始按照工作流程中定义的步骤执行任务。它会模拟 GitHub Actions 中的事件触发,并执行工作流程中的每个步骤。act 支持各种类型的步骤,包括运行命令、检出代码、设置环境变量等。
  4. 在执行每个步骤时,act 将显示步骤的输出,并记录执行的状态和结果。它还会处理步骤之间的依赖关系,确保它们按照正确的顺序执行。
  5. 当所有步骤完成后,act 将显示工作流程的总体状态和结果,并提供有关执行过程的详细信息。它还会生成 GitHub Actions 类似的日志和报告。

基本命令

在.github的同级目录可以执行如下命令:

1
2
3
4
5
## 列出workflow
act -l
## act dryrun模式,列出执行顺序,但是不真正执行
act -n

使用案例

很多项目都会依赖数据库,这次我们引入一个bytebase的github action来对数据库的表结构做一些规范约束。

配置github action

~/github/workflows/sql-review.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
on: [pull_request]

jobs:
sql-review:
runs-on: ubuntu-latest
name: SQL Review
steps:
- uses: actions/checkout@v3
- name: Check SQL
# You can change it to a specific version like bytebase/sql-review-action@0.0.4
# We suggest using the latest version through the tag. Check it at https://github.com/Bytebase/sql-review-action/tags
uses: bytebase/sql-review-action@main
with:
# 可以直接使用bytebase预定义好的SQL REVIEW规则:https://www.bytebase.com/sql-review-guide/?templateId=bb.sql-review.prod
template-id: "bb.sql-review.dev"
database-type: "MYSQL"

准备违反sql规则的文件

默认的规则要求一个表必须包含update_ts字段,我们随便建一个sql文件,包含的表不包含这个字段即可。
image.png

本地环境变量准备

在使用 act 运行 GitHub Actions workflow 时,需要提供mock的secrets信息来模拟 GitHub 环境,否则会有如下报错:
image.png
act依赖的github token等secrets信息需要定义在一个文件中,例如我们可以定义到.idea/act_secrets文件中,使得act运行时可以正常clone bytebase的仓库。这个可以在自己的github账户下创建一个github token

1
GITHUB_TOKEN=

确认本地workflow并执行

act -n可以查看待执行的workflow,我本地虽然有CI/CD的workflow,但是被ignore了,所以直接执行act来验证sql-review这个workflow的执行:
image.png
运行执行命令:

1
2
3
4
5
## mac m1上执行需要加额外参数指定架构
## 需要指定secret file
act --container-architecture linux/amd64 --secret-file=./.idea/act_secrets
## 也可以直接通过-s 来指定GITHUB_TOKEN
act --container-architecture linux/amd64 -s GITHUB_TOKEN=xxxx

运行结果报错

1
2
3
4
5
6
7
8
9
10
11
12
[sql-review.yml/SQL Review]   🐳  docker cp src=/Users/wanshao/.cache/act/umani-changed-files@v3.3.0/ dst=/var/run/act/actions/umani-changed-files@v3.3.0/
[sql-review.yml/SQL Review] 🐳 docker exec cmd=[node /var/run/act/actions/umani-changed-files@v3.3.0/dist/index.js] user= workdir=
[sql-review.yml/SQL Review] ❗ ::error::Could not get pull request from context, exiting
[sql-review.yml/SQL Review] ❌ Failure - Main Get changed files
[sql-review.yml/SQL Review] exitcode '1': failure
[sql-review.yml/SQL Review] ❌ Failure - Main Check SQL
[sql-review.yml/SQL Review] exitcode '1': failure
[sql-review.yml/SQL Review] ⭐ Run Post Check SQL
[sql-review.yml/SQL Review] 🐳 docker cp src=/Users/wanshao/.cache/act/bytebase-sql-review-action@main/ dst=/var/run/act/actions/bytebase-sql-review-action@main/
[sql-review.yml/SQL Review] ✅ Success - Post Check SQL
[sql-review.yml/SQL Review] 🏁 Job failed

主要原因在于sql review这个github action本身实现依赖umani-changed-files这个action,这个action强依赖git pr event触发地context,这个context act本地模拟的时候是模拟不出来的,因此导致失败。

总结

act本身是个不错的项目,但是当前也并非支持所有的github action本地调试,例如这次使用的bytebase sql review插件