GitHub Actions CI/CD 配置教程:自动化构建、测试与部署

GitHub ActionsGitHub 内置的 CI/CD(持续集成/持续部署)平台。它让你在代码仓库中直接定义自动化工作流——每次代码推送时自动构建、测试和部署应用。

一、CI/CD 基本概念

什么是 CI/CD

CI(持续集成):代码变更后自动构建和测试
  → 每次 Push/Pull Request 触发
  → 确保代码质量,尽早发现问题

CD(持续部署):通过测试后自动部署到生产环境
  → 合并到主分支后触发
  → 自动化发布流程

二、GitHub Actions 基础

2.1 核心概念

术语 说明
Workflow(工作流) 自动化的流程定义
Job(任务) 工作流中的一个执行单元
Step(步骤) 任务中的具体操作
Action(动作) 可复用的功能模块
Runner(运行器) 执行工作流的服务器

2.2 工作流文件结构

# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run tests
        run: npm test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to server
        run: |
          echo "Deploying..."

三、实战:Node.js 项目 CI/CD

3.1 完整的 Node.js CI/CD 工作流

name: Node.js CI/CD

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

jobs:
  # Job 1: 代码质量检查
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      - run: npm ci
      - run: npm run lint

  # Job 2: 测试
  test:
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      - run: npm ci
      - run: npm test
      - name: Upload coverage
        uses: actions/upload-artifact@v3
        with:
          name: coverage
          path: coverage/

  # Job 3: 构建并部署
  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm ci
      - run: npm run build
      
      - name: Deploy to VPS
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          source: "dist/"
          target: "/var/www/app/"
      
      - name: Restart server
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/app
            docker-compose up -d --build

四、SSH 部署配置

4.1 设置 Secrets

在 GitHub 仓库 Settings → Secrets and variables → Actions 中添加:

SERVER_HOST: 服务器 IP
SERVER_USER: SSH 用户名
SSH_PRIVATE_KEY: SSH 私钥

4.2 服务器端准备

# 服务器上的 docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    restart: always

五、常用 Actions 市场

Action 用途
actions/checkout 检出代码
actions/setup-node 设置 Node.js
actions/setup-python 设置 Python
appleboy/scp-action SCP 传输文件
appleboy/ssh-action SSH 执行命令
docker/build-push-action 构建推送 Docker 镜像
peaceiris/actions-gh-pages 部署到 GitHub Pages

六、其他语言 CI/CD 示例

PHP (Laravel)

name: Laravel CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: test
        ports:
          - 3306:3306

    steps:
      - uses: actions/checkout@v3
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: mbstring, pdo_mysql
      
      - run: composer install -q --no-ansi --no-interaction
      - run: cp .env.example .env
      - run: php artisan key:generate
      - run: php artisan migrate --force
      - run: php artisan test

Python (Django)

name: Django CI

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      
      - run: pip install -r requirements.txt
      - run: python manage.py test

七、最佳实践

1. 工作流拆分:
   - 轻量检查(lint)在 PR 时运行
   - 完整测试在合并前运行
   - 部署仅在主分支触发

2. 缓存依赖:
   - 使用 actions/cache 缓存 node_modules
   - 大幅减少构建时间

3. 条件执行:
   - 只有特定分支变更才触发部署
   - 跳过文档变更时的测试

4. 通知:
   - 失败时发送 Slack/Discord 通知
   - 部署成功时通知团队成员

5. 安全:
   - 使用 Secrets 存储敏感信息
   - 不要在日志中打印 Secrets
   - 限制 Actions 的权限范围

八、总结

GitHub Actions 让 CI/CD 变得前所未有的简单。与 GitHub 仓库的深度整合意味着无需额外的 CI 服务器,配置都在代码仓库中。从简单的 Lint + Test 开始,逐步增加部署步骤,最终实现完整的自动化 DevOps 流水线。记住:自动化不是目的,目的是让开发流程更可靠、更高效