GitHub Actions 实践:CI、CD 与自动化脚本
什么是 GitHub Actions
GitHub Actions 是 GitHub 内置的持续集成与持续交付(CI/CD)平台,让你可以直接在仓库中构建、测试和部署代码。你可以通过编写 工作流文件(YAML) 定义一系列自动触发的任务,例如:推送代码时自动运行测试、合并拉取请求时构建镜像、定时执行清理脚本。
核心概念速览
- 工作流(Workflow):在
.github/workflows/目录下以 YAML 文件定义的自动化过程。 - 事件(Event):触发工作流的行为,如
push、pull_request、schedule(定时) 等。 - 作业(Job):工作流中独立运行的一组步骤,默认并行执行。
- 步骤(Step):作业里的单个操作,可以是运行命令或调用 动作(Action)。
- 动作(Action):可复用的代码单元,通常由社区或官方提供,例如
actions/checkout用于拉取代码。 - 运行器(Runner):托管工作流执行的虚拟机,GitHub 提供 Ubuntu、Windows、macOS 三种环境。
第一个工作流:推送代码时自动运行测试
以 Node.js 项目为例,我们创建一个会在每次 push 到仓库时安装依赖并执行测试的工作流。
创建工作流文件
在仓库根目录新建 .github/workflows/test.yml:
name: Run Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
工作流解读
on.push:当向main分支推送代码时触发,同时监听pull_request以便在 PR 阶段也能运行检查。runs-on: ubuntu-latest:使用最新的 Ubuntu 运行器。actions/checkout@v4将仓库代码克隆到运行器。actions/setup-node@v4安装指定版本的 Node.js。run指令直接在运行器中执行 shell 命令。
提交该文件后,每次推送都会自动触发测试,结果会在 GitHub 仓库的 Actions 页签中展示。
持续集成(CI)最佳实践
多版本矩阵测试
当你的库需要兼容多个 Node.js 版本或操作系统时,可以使用矩阵策略并行测试。
jobs:
test:
strategy:
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
这样会生成 6 个并行作业(3 × 2),快速覆盖全部环境。
缓存依赖加速构建
利用 actions/cache 或 setup-node 自带的缓存功能,避免每次重新下载 node_modules:
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
此配置会自动根据 package-lock.json 的哈希缓存 ~/.npm 目录,显著减少安装时间。
持续交付(CD):自动构建并发布 Docker 镜像
假设你的项目是一个容器化应用,希望在推送 main 分支时自动构建 Docker 镜像并推送到 Docker Hub。
添加 Docker Hub 凭据到 Secrets
在仓库的 Settings > Secrets and variables > Actions 中,添加 DOCKER_USERNAME 和 DOCKER_PASSWORD 两个加密变量。
工作流文件
.github/workflows/docker-publish.yml:
name: Build and Publish Docker Image
on:
push:
branches: [ main ]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/my-app:latest
关键动作说明
docker/login-action完成 Docker Hub 认证。docker/build-push-action负责构建镜像并推送,tags可以设为latest,也可加入 Git SHA 作为版本标签。
推送后,你的 Docker Hub 仓库就会自动出现最新镜像。
自动化脚本场景
定时执行数据抓取
使用 schedule 事件+ cron 表达式,可以让工作流定时运行。例如,每天 UTC 时间 0 点抓取天气数据并提交到仓库:
name: Daily Data Scraping
on:
schedule:
- cron: '0 0 * * *' # 每天 UTC 0:00
workflow_dispatch: # 允许手动触发
jobs:
scrape:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install requests
- name: Run scraper
run: python scraper.py
- name: Commit and push if changed
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add data.csv
git diff --staged --quiet || git commit -m "Auto-update data [skip ci]"
git push
代码质量检查
将 Lint、格式检查等工具集成到 CI 中,防止低质量代码合入。
- name: Run ESLint
run: npx eslint . --ext .js,.ts
- name: Check formatting with Prettier
run: npx prettier --check "src/**/*.{js,ts,json}"
可以结合 Pull Request 注解(例如使用 reviewdog/action-eslint)将问题直接评论到代码行上。
工作流调试技巧
- 查看日志:作业执行界面中可逐步骤展开输出,标准输出和错误流完整保留。
- 启用调试模式:在仓库
Settings > Secrets and variables > Actions中创建名为ACTIONS_STEP_DEBUG的秘密,值设为true,即可获得更详细的运行日志。 - 本地测试:使用 act 工具在本地模拟运行 Actions,减少试错成本。
- 手动触发:设置
workflow_dispatch事件,可从 GitHub UI 手动执行工作流。
常用社区动作推荐
- 代码检查:
actions/checkout@v4,actions/cache@v4 - 语言环境:
actions/setup-node@v4,actions/setup-python@v5,actions/setup-java@v4 - 构建发布:
docker/build-push-action@v5,docker/login-action@v3 - 部署集成:
peaceiris/actions-gh-pages(发布到 GitHub Pages),appleboy/ssh-action(远程 SSH 执行命令) - 通知:
slackapi/slack-github-action(发送 Slack 消息),8398a7/action-slack等
在 GitHub Marketplace 可以检索更多动作,注意审查代码和版本。
小结
GitHub Actions 把 CI/CD 和自动化脚本统一到同一平台,配置即代码、高度可拓展。通过组合社区动作与自定义脚本,你可以轻松实现:
- 代码推送时自动测试与 Lint 检查
- 合并到主分支后构建并推送 Docker 镜像
- 定时执行数据采集、依赖更新等脚本
- 将部署流程一键自动化
现在就为你的仓库添加第一个工作流文件,体验“推送即自动运行”的高效开发流程。