GitHub Actions教程:2026年项目CI/CD自动化实战

GitHub Actions教程:2026年项目CI/CD自动化实战

GitHub Actions详细教程。通过Node.js和Python实战示例,学会自动化测试、构建和部署。

2026年3月17日4分钟阅读

为什么需要CI/CD自动化?

想象一下这个场景:你的团队有10名开发者,每天提交数十次代码。如果每次合并代码都需要手动运行测试、手动构建、手动部署,不仅效率极低,而且极容易出错。这就是CI/CD(持续集成/持续部署)解决的核心问题。

GitHub Actions是GitHub提供的原生CI/CD工具,它完全免费(公开仓库不限次,私有仓库每月2000分钟免费额度),与GitHub深度集成,配置简单,功能强大。2026年,它已经成为开发团队的标准工具之一。

核心概念

概念说明
Workflow(工作流)自动化流程的完整定义,用YAML文件描述
Event(事件)触发工作流的行为(push、PR、定时等)
Job(任务)工作流中的一个执行单元,运行在独立虚拟机
Step(步骤)Job中的单个操作,可以是命令或Action
Action(动作)可复用的自动化单元,可从市场获取
Runner(运行器)执行工作流的虚拟机(GitHub托管或自托管)

你的第一个GitHub Actions工作流

工作流文件必须存放在.github/workflows/目录下,文件名可以自定义。

# .github/workflows/hello-world.yml
name: 我的第一个工作流

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  greet:
    runs-on: ubuntu-latest
    steps:
      - name: 打印问候语
        run: echo "你好,GitHub Actions!"

      - name: 查看运行环境
        run: |
          echo "操作系统: $(uname -a)"
          echo "Node.js版本: $(node --version)"
          echo "Python版本: $(python3 --version)"

Node.js项目完整CI流程

# .github/workflows/node-ci.yml
name: Node.js CI/CD

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    name: 测试
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x, 20.x, 22.x]

    steps:
      - name: 检出代码
        uses: actions/checkout@v4

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

      - name: 安装依赖
        run: npm ci

      - name: 运行代码规范检查
        run: npm run lint

      - name: 运行单元测试
        run: npm test -- --coverage

      - name: 上传覆盖率报告
        uses: codecov/codecov-action@v4
        if: matrix.node-version == '20.x'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  build:
    name: 构建
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - run: npm ci
      - run: npm run build

      - name: 上传构建产物
        uses: actions/upload-artifact@v4
        with:
          name: build-files
          path: dist/
          retention-days: 7

  deploy:
    name: 部署到生产环境
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production

    steps:
      - uses: actions/checkout@v4

      - name: 下载构建产物
        uses: actions/download-artifact@v4
        with:
          name: build-files
          path: dist/

      - name: 部署到服务器
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            npm ci --production
            pm2 restart myapp

Python项目CI流程

# .github/workflows/python-ci.yml
name: Python CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python-version: ["3.11", "3.12", "3.13"]

    steps:
      - uses: actions/checkout@v4

      - name: 设置Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: 安装依赖
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install pytest pytest-cov black flake8 mypy

      - name: 代码格式检查(black)
        run: black --check .

      - name: 代码规范检查(flake8)
        run: flake8 . --max-line-length=100

      - name: 类型检查(mypy)
        run: mypy src/

      - name: 运行测试
        run: pytest tests/ -v --cov=src --cov-report=xml

      - name: 上传覆盖率
        uses: codecov/codecov-action@v4
        if: matrix.python-version == '3.12'

  docker:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: 登录Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: 提取元数据
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: myusername/myapp
          tags: |
            type=ref,event=branch
            type=sha,prefix=sha-
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

      - name: 构建并推送Docker镜像
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Secrets(密钥)管理

敏感信息(API密钥、密码、SSH密钥等)绝不应该出现在代码中。GitHub Actions提供了安全的密钥管理机制。

添加Secrets

  1. 打开仓库 → Settings → Secrets and variables → Actions
  2. 点击"New repository secret"
  3. 输入名称(如DEPLOY_SSH_KEY)和值

在工作流中使用

steps:
  - name: 使用密钥
    env:
      API_KEY: ${{ secrets.API_KEY }}
      DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    run: |
      echo "API_KEY=$API_KEY" >> .env
      # 注意:不要在日志中打印密钥

缓存优化:加速工作流

# 缓存npm依赖
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'   # 内置缓存支持

# 或手动配置缓存
- name: 缓存node_modules
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

# Python pip缓存
- uses: actions/setup-python@v5
  with:
    python-version: '3.12'
    cache: 'pip'

合理使用缓存可以将工作流运行时间从几分钟缩短到几十秒。

矩阵构建:多环境测试

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest, macos-latest]
    node: [18, 20, 22]
    exclude:
      # 排除某些组合
      - os: windows-latest
        node: 18
  fail-fast: false  # 某个组合失败不影响其他

runs-on: ${{ matrix.os }}

定时任务

on:
  schedule:
    # 每天UTC时间0:00运行(北京时间8:00)
    - cron: '0 0 * * *'
    # 每周一UTC时间9:00运行
    - cron: '0 9 * * 1'

常见定时任务使用场景:

  • 依赖安全漏洞扫描
  • 数据备份
  • 性能基准测试
  • 定期数据同步

环境(Environments)保护规则

对于生产环境部署,可以设置审批流程:

deploy:
  environment:
    name: production
    url: https://myapp.com
  # 需要在仓库设置中配置审批人

常用Action推荐

Action用途
actions/checkout检出代码(必用)
actions/setup-node配置Node.js环境
actions/setup-python配置Python环境
actions/cache缓存依赖
actions/upload-artifact上传构建产物
docker/build-push-action构建推送Docker镜像
appleboy/ssh-actionSSH远程部署
codecov/codecov-action上传代码覆盖率

总结

GitHub Actions是现代软件开发工作流的核心基础设施。通过本文的学习,你已经掌握了:

  • 工作流基础结构和核心概念
  • Node.js和Python的完整CI/CD流程
  • 密钥管理和安全实践
  • 缓存优化和矩阵构建
  • 定时任务和环境保护

从今天开始,为你的项目配置CI/CD流程。哪怕是最简单的自动化测试,也能显著提升代码质量和团队协作效率。随着经验积累,逐步完善你的自动化流水线,让GitHub Actions成为你最可靠的自动化助手。

相关文章