GitHub Actions、自动化测试流水线与部署策略
CI/CD(Continuous Integration / Continuous Deployment)是现代软件开发的核心实践,它通过自动化构建、测试和部署流程,大幅提升开发效率和发布质量。从个人项目到大型团队,CI/CD已成为标配。本指南将从概念到实战,帮助你建立完整的CI/CD知识体系。
CI(持续集成,Continuous Integration):开发者频繁将代码合并到主分支,每次合并自动触发构建和测试,尽早发现问题。
CD(持续交付/部署,Continuous Delivery/Deployment):在CI通过后,自动将代码部署到预发布或生产环境。持续交付需要人工确认,持续部署完全自动化。
GitHub Actions是目前最流行的CI/CD工具之一,与GitHub深度集成,配置简单。
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
# 作业1:测试
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Run lint
run: npm run lint
- name: Run tests
run: npm test -- --coverage
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
# 作业2:构建
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
docker push myapp:${{ github.sha }}
# 作业3:部署(仅main分支)
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Deploy to server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull myapp:${{ github.sha }}
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp -p 3000:3000 myapp:${{ github.sha }}
| Action | 用途 |
|---|---|
| actions/checkout | 检出代码仓库 |
| actions/setup-node | 安装Node.js环境 |
| actions/setup-python | 安装Python环境 |
| actions/cache | 缓存依赖,加速构建 |
| codecov/codecov-action | 上传测试覆盖率 |
| appleboy/ssh-action | SSH远程部署 |
| peaceiris/actions-gh-pages | 部署到GitHub Pages |
维护两套完全相同的环境(蓝和绿),新版本部署到空闲环境验证后切换流量。优点是回滚速度快(切换回旧环境即可),缺点是需要双倍资源。
先将新版本推送给少量用户(如5%),观察错误率、响应时间等指标,确认无问题后逐步扩大范围(25% → 50% → 100%)。适合对稳定性要求高的场景。
逐步替换旧版本实例,每次替换一部分。Kubernetes的默认部署策略就是滚动更新。
| 工具 | 特点 | 适用场景 |
|---|---|---|
| GitHub Actions | 与GitHub集成,免费额度充足 | GitHub项目首选 |
| GitLab CI | 与GitLab集成,功能全面 | GitLab项目首选 |
| Jenkins | 插件生态丰富,自建服务器 | 大型企业、定制化需求 |
| CircleCI | 速度快,配置简洁 | 追求速度的团队 |
| Travis CI | 老牌CI,开源项目免费 | 开源项目 |
访问 ToolSnap 获取Base64编解码、URL编解码、JSON格式化等在线开发者工具。
CI(持续集成)是开发者频繁将代码合并到主分支,每次合并自动触发构建和测试。CD(持续部署/交付)是在CI通过后自动将代码部署到生产环境。目标是减少人工操作、快速发现问题、加快发布节奏。
GitHub Actions与GitHub深度集成,配置简单,免费额度充足。Jenkins功能更强大但需要自建服务器。GitLab CI与GitLab深度集成。CircleCI速度快但免费额度有限。
蓝绿部署维护两套环境(蓝/绿),新版本部署到空闲环境验证后切换流量。金丝雀发布是先将新版本推送给少量用户(如5%),观察无问题后逐步扩大范围。两者都是为了降低部署风险。