第1节:GitHub Actions 概述:它到底是什么?
GitHub Actions,说白了就是 GitHub 帮你内置的一套自动化流水线工具。你写代码、提 PR、打标签……这些动作都能触发它干活——比如跑测试、打包、部署。我刚开始接触 CI/CD 时总觉得这类工具都差不多,但用上 Actions 之后才发现,它最大的优势是跟仓库“长”在一起,不用额外搭 Jenkins 或者 GitLab Runner。
为什么会这样?因为 Actions 直接跑在 GitHub 的虚拟环境里,配置文件就放在仓库的 .github/workflows/ 目录下。你想想看,所有东西都在一个地方,维护成本自然就低了。
工作流程:一次事件触发的任务链
一个工作流(workflow)就是一组自动化作业的集合。它由 事件 启动,然后按顺序或并行执行多个 作业,每个作业里又包含若干 步骤。步骤里具体干什么?可以跑 shell 命令,也可以调用现成的 动作(action)。
我见过不少新手把“作业”和“步骤”搞混。记住一条:作业运行在不同的机器上,步骤运行在同一台机器上。举个例子,你可以让“测试”和“构建”两个作业并行跑,但“构建”里的“安装依赖”和“编译代码”必须按先后顺序。
| 概念 | 含义 | 我的经验 |
|---|---|---|
| 工作流 | 一个 .yml 文件,定义整个自动化流程 | 一个仓库可以有多个工作流文件,互不干扰 |
| 事件 | 触发工作流运行的条件 | 比如 push、pull_request、定时 cron |
| 作业 | 一组步骤,运行在同一个 runner 上 | 默认并行,也可以用 needs 控制依赖 |
| 步骤 | 作业内的最小执行单元 | 可以是命令,也可以是引用 action |
| 动作 | 可复用的步骤模板 | GitHub Marketplace 里有现成的,也可以自己写 |
事件:谁喊醒了工作流?
事件就是 GitHub 平台上的各种操作。最常见的:push(你提交代码)、pull_request(别人给你提 PR)、release(你发版)。
你还可以用 workflow_dispatch 事件,在 GitHub 页面手动点按钮触发——这个我经常用在临时调试场景。曾经有个坑:某次我把 push 事件写成了 pushs,结果工作流死活不跑,查了半天才发现是拼写错误……别笑,yml 文件里的 spell check 不会帮你纠错。
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
作业:把任务拆开跑
一个工作流可以包含多个作业。默认情况下它们并行执行——这能节省大量时间。但有些时候,你需要一个作业依赖另一个作业的结果,比如“先测试,测试通过再部署”。用 needs 关键字搞定。
步骤:每个作业里的细节
步骤是命令的具体执行单元。你可以直接在 run 字段里写 bash 命令,也可以用 uses 引用一个现成的 action。
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run tests
run: npm test
注意:每一步都会在同一个 runner 的同一个工作目录下执行,所以上一步生成的文件下一步还能用。
动作:别重复造轮子
动作就是封装好的步骤。GitHub 官方和社区已经贡献了成千上万个动作,比如 actions/checkout(拉取代码)、actions/setup-node(配置 Node.js)、actions/upload-artifact(上传构建产物)。
我曾经自己写过几个内部动作,封装了公司私有的证书获取逻辑。后来发现直接发布到 Marketplace 反而更方便——当然,你完全可以在仓库内用相对路径引用本地 action。
完整工作流示例
name: CI Pipeline
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install
- run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install
- run: npm test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
needs 写成了 need,结果作业全部并行执行,test 还没跑完 build 就开始了,报错说找不到 node_modules —— 那叫一个惨。记住,yml 里 needs 是复数。
GitHub Actions 核心架构
下面这张图展示了事件如何触发工作流,工作流如何分解为作业和步骤,以及动作如何被复用。看完你应该对整个脉络有个清晰的印象。
看完这张图,你应该能明白:事件进来,工作流启动,里面拆成多个作业,每个作业又一堆步骤,步骤里可以用现成的动作。这就是 GitHub Actions 的全部骨架。