第31章|GitHub Actions 入门:workflow、job、step 与 runner

GitHub Actions 把 CI/CD 写进仓库:一个 workflow 是一本书, job 是章节,step 是段落;真正干活的是跑在 runner 上的进程。 搞懂这四层 + on: 触发器,你就能读懂九成 YAML,也能避开「fork PR 偷密钥」这类坑。

Hierarchy

四层结构

  • workflow:.github/workflows/*.yml
  • job:并行或 needs 编排
  • step:同一 job 内顺序执行
  • action:可复用步骤单元
Trigger

事件驱动

  • push / pull_request / schedule
  • workflow_dispatch 手动
  • workflow_run 链式触发
Runner

在哪执行

  • GitHub-hosted:ubuntu/windows/macos
  • self-hosted:自有机器
  • 权限与网络面不同

1. 最小 workflow 长什么样?

根目录 .github/workflows/ci.yml 里通常包含:nameon(何时跑)、jobs。 每个 job 指定 runs-on,下面是一串 step:uses 引用现成 action,或 run 直接跑 shell。

记忆:同一 job 内 step 共享文件系统与环境变量;不同 job 默认隔离,要靠 artifact 或缓存传递产物。

2. 事件(on):谁在按门铃?

事件 → Workflow → Jobs 编排 push 可并行多 job;needs 表达依赖 DAG on: push workflow ci.yml concurrency optional job: lint job: test job: build needs: [lint, test] job: deploy needs build
图 1:一次 push 触发 workflow;lint 与 test 可并行,build 依赖二者,deploy 再依赖 build(DAG)。

3. Job 与 Step:同一台 runner 上的顺序剧本

每个 job 分配到一台 runner(一个虚拟机或容器环境)。该 job 内 step 从上到下执行,前一个 step 的目录与 env 对后续可见(除非 step 用了隔离容器)。 常用模式:checkout → setup 语言 → 缓存 → 测试 → 上传 artifact。

单个 Job:runner 上顺序执行 Step uses 引用 action;run 执行 shell;失败则后续 step 默认跳过(除非 if:) runs-on: ubuntu-latest step 1: actions/checkout@v4 step 2: setup-python / setup-node step 3: cache restore step 4: run: pytest / npm test working-directory 与 env 在 job 级可继承
图 2:同一 job 内 step 顺序执行,共享 workspace;常用「检出 → 工具链 → 缓存 → 测试」流水线。

4. Runner:hosted 与 self-hosted 的取舍

安全:对 self-hosted,务必用 pull_request_target 等高级触发前理解风险;默认应对不可信 fork 使用 hosted runner + 最小权限。

5. GITHUB_TOKEN 与 permissions

每个 workflow run 会注入 GITHUB_TOKEN。默认权限较宽的历史行为已收紧趋势:应在 workflow 顶或 job 级写 permissions: 按需最小化(contents: read 等)。 Secrets 仅在受信任上下文可用;fork PR 工作流不能读取仓库 secrets(设计如此)。

权限模型:同一 workflow,上下文不同能力不同 fork PR:secrets 不可读;token 能力受限 same-repo PR / push secrets OK (scoped) permissions: minimal fork PR no repo secrets token read-only to fork permissions example contents: read pull-requests: write (if needed) avoid *: write by default 详细触发与分支保护见下一章;此处先建立「上下文决定权限」直觉。
图 3:同一条 workflow 语法,在「同仓」与「fork PR」下 secrets 与 token 能力不同;permissions 应显式最小化。

6. 最小清单

  1. 每个仓库至少一条 CI workflow:on: pull_request + push main。
  2. 并行 lint/test job,合并前 required checks。
  3. 写明 permissions,勿把 secrets 打印到 log。
  4. 需要矩阵多版本时用 strategy.matrix(下一章可深化)。
← 上一章:Pipeline as Product 下一章:GitHub Actions 触发与权限 →