GitHub Actions 是 GitHub 内置的 CI/CD 平台,可以在代码推送、PR 创建等事件触发时自动执行任务。本文介绍基本用法。
核心概念
- Workflow:工作流,定义在
.github/workflows/*.yml
- Event:触发条件,如
push、pull_request、schedule
- 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' 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-node 的 cache: '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 即可。