GitHub Actions 是 GitHub 内置的 CI/CD 平台,可以在代码推送、PR 创建等事件触发时自动执行任务。本文介绍基本用法。

核心概念

  • Workflow:工作流,定义在 .github/workflows/*.yml
  • Event:触发条件,如 pushpull_requestschedule
  • Job:工作流中的一个任务,运行在独立的虚拟机上
  • Step:Job 中的单个步骤,可以是命令或 Action
  • Action:可复用的步骤单元,来自 GitHub Marketplace 或自定义

最简单的例子

1
2
3
4
5
6
7
8
9
10
name: Hello World

on: push

jobs:
greet:
runs-on: ubuntu-latest
steps:
- name: Say hello
run: echo "Hello, GitHub Actions!"

常用触发条件

1
2
3
4
5
6
7
8
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
schedule:
- cron: '0 9 * * 1' # 每周一早上 9 点
workflow_dispatch: # 手动触发

实用示例:Node.js 项目 CI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
name: CI

on:
push:
branches: [main]
pull_request:

jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]

steps:
- uses: actions/checkout@v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

- run: npm ci
- run: npm test

使用 Secrets

敏感信息(Token、密钥)存在仓库的 Settings → Secrets 中,通过 ${{ secrets.MY_SECRET }} 引用:

1
2
3
4
- name: Deploy
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
run: ./deploy.sh

缓存依赖

1
2
3
4
5
6
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-

actions/setup-nodecache: 'npm' 参数会自动处理缓存,大多数情况下不需要手动配置。

常用 Actions

Action 用途
actions/checkout 检出代码
actions/setup-node 配置 Node.js
actions/setup-python 配置 Python
actions/upload-artifact 上传构建产物
peaceiris/actions-gh-pages 部署到 GitHub Pages

小技巧

只在特定路径变更时触发:

1
2
3
4
5
on:
push:
paths:
- 'src/**'
- 'package.json'

Job 之间传递数据:

1
2
3
4
5
6
7
8
9
10
11
12
jobs:
build:
outputs:
version: ${{ steps.get-version.outputs.version }}
steps:
- id: get-version
run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT

deploy:
needs: build
steps:
- run: echo "Deploying version ${{ needs.build.outputs.version }}"

GitHub Actions 的文档很完善,遇到具体需求直接查 官方文档Marketplace 找现成的 Action 即可。