GitHub 工作流(GitHub Actions)
1. 什么是 GitHub 工作流(GitHub Actions)?
GitHub Actions 是 GitHub 提供的「自动化运行环境」,当仓库中发生指定事件(如 push、pull request、定时任务等)时,它会自动运行你写的工作流(workflow)。
🧠 工作流是什么?
- 工作流是一个
.yml文件,放在.github/workflows/目录下。 - 它描述了「什么时候触发」以及「触发时要执行哪些自动化任务」。
常见用途包括:
- 自动运行测试(go test、pytest 等)
- CodeQL 安全扫描
- 自动构建 / 部署项目
- 自动生成构建产物(binary、release、Docker image)
2. 工作流跑在哪里?
工作流默认运行在 GitHub 提供的云服务器(GitHub-hosted runner) 上。
可选环境包括:
ubuntu-latestwindows-latestmacos-latest
你也可以自己提供服务器(Self-hosted runner),但一般不需要。
3. GitHub Actions 免费吗?
简要说明:
- 公共仓库(public)基本完全免费
- 私有仓库(private)每月有 2,000 分钟免费额度
- 用超才收费
4. 工作流的基本结构
name: My Workflow
on:
push:
branches: [main]
jobs:
myjob:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run tests
run: go test ./...
组成部分:
- on: 触发条件
- jobs: 定义要做的任务
- runs-on: 指定运行操作系统
- steps: 每个 job 的步骤(顺序执行)
5. jobs: 下的第二层是什么?
jobs:
analyze:
...
这里的 analyze 不是关键字,是你定义的 job ID。
可写成任何你喜欢的名字,例如:
buildtestdeployscancodeql-scan
只需遵守:不用空格,小写更好。
6. job 下的 name 是干什么?
jobs:
analyze:
name: CodeQL Security Scan
analyze:内部 IDname: CodeQL Security Scan:GitHub Actions 页面上显示给人看的名字
7. 常见 job 可写的字段(关键字)
| 字段 | 作用 | 示例 |
|---|---|---|
runs-on |
指定运行环境 | ubuntu-latest |
steps |
指定任务步骤 | 見下節 |
name |
显示给用户看的 job 名 | "Lint and Test" |
needs |
依赖其他 job | needs: build |
if |
条件执行 | if: github.ref == 'refs/heads/main' |
env |
设置环境变量 | env: { GOFLAGS: "-v" } |
permissions |
权限设置 | security-events: write |
strategy |
並行矩陣構建 | matrix: { go: ["1.21", "1.22"] } |
timeout-minutes |
job 超時限制 | timeout-minutes: 20 |
8. steps 是按顺序执行的吗?
✔ 是的,严格顺序执行:
Step1 → Step2 → Step3
❗ 注意:
如果 某个 step 报错(即退出码非 0):
- 默认:停止执行后续 steps
- job 标记为失败
- workflow 也可能失败(取决于是否有多job)
如果你希望「失败也继续」,可用:
continue-on-error
- name: Might fail
run: exit 1
continue-on-error: true
always()
- name: Always run
if: ${{ always() }}
run: echo "This will run anyway"
9. job 之间的依赖 needs
例子:
jobs:
analyze:
runs-on: ubuntu-latest
test:
needs: analyze
runs-on: ubuntu-latest
解释:
test会等待analyze成功(绿勾)后执行- 如果
analyze失败,test默认不会执行
多个依赖:
needs: [build, lint]
10. CodeQL 是什么?
CodeQL 是 GitHub 官方的 代码安全分析系统,它的工作原理:
- 把你的代码编译成一个可查询的数据库(存 AST、数据流、控制流图等)
- 使用查询规则检查潜在漏洞:
- SQL 注入
- XSS
- 不安全函数调用
- 错误未检查
- Go 语言不安全模式等
工作流示例:
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: go
- uses: github/codeql-action/analyze@v3
11. 什么时候 Actions 会收费?
只有以下情况会扣费:
- 私有仓库超过 2000 分钟免费额度
- 使用 Mac runners(更贵)
- 使用 self-hosted runners 的某些带 GPU 设置
- 关闭免费额度抵扣