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-latest
  • windows-latest
  • macos-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
可写成任何你喜欢的名字,例如:

  • build
  • test
  • deploy
  • scan
  • codeql-scan

只需遵守:不用空格,小写更好。


6. job 下的 name 是干什么?

jobs:
  analyze:
    name: CodeQL Security Scan
  • analyze:内部 ID
  • name: 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 官方的 代码安全分析系统,它的工作原理:

  1. 把你的代码编译成一个可查询的数据库(存 AST、数据流、控制流图等)
  2. 使用查询规则检查潜在漏洞:
    • 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 会收费?

只有以下情况会扣费:

  1. 私有仓库超过 2000 分钟免费额度
  2. 使用 Mac runners(更贵)
  3. 使用 self-hosted runners 的某些带 GPU 设置
  4. 关闭免费额度抵扣