GitHub Actions CI/CD 配置教程:自动化构建、测试与部署
GitHub Actions 是 GitHub 内置的 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 流水线。记住:自动化不是目的,目的是让开发流程更可靠、更高效。