GitHub Actions 实践:CI、CD 与自动化脚本

FreeGuideOnline 最新 2026-06-12

什么是 GitHub Actions

GitHub Actions 是 GitHub 内置的持续集成与持续交付(CI/CD)平台,让你可以直接在仓库中构建、测试和部署代码。你可以通过编写 工作流文件(YAML) 定义一系列自动触发的任务,例如:推送代码时自动运行测试、合并拉取请求时构建镜像、定时执行清理脚本。

核心概念速览

  • 工作流(Workflow):在 .github/workflows/ 目录下以 YAML 文件定义的自动化过程。
  • 事件(Event):触发工作流的行为,如 pushpull_requestschedule(定时) 等。
  • 作业(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/cachesetup-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_USERNAMEDOCKER_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)将问题直接评论到代码行上。


工作流调试技巧

  1. 查看日志:作业执行界面中可逐步骤展开输出,标准输出和错误流完整保留。
  2. 启用调试模式:在仓库 Settings > Secrets and variables > Actions 中创建名为 ACTIONS_STEP_DEBUG 的秘密,值设为 true,即可获得更详细的运行日志。
  3. 本地测试:使用 act 工具在本地模拟运行 Actions,减少试错成本。
  4. 手动触发:设置 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 镜像
  • 定时执行数据采集、依赖更新等脚本
  • 将部署流程一键自动化

现在就为你的仓库添加第一个工作流文件,体验“推送即自动运行”的高效开发流程。