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
- 打开仓库 → Settings → Secrets and variables → Actions
- 点击"New repository secret"
- 输入名称(如
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-action | SSH远程部署 |
| codecov/codecov-action | 上传代码覆盖率 |
总结
GitHub Actions是现代软件开发工作流的核心基础设施。通过本文的学习,你已经掌握了:
- 工作流基础结构和核心概念
- Node.js和Python的完整CI/CD流程
- 密钥管理和安全实践
- 缓存优化和矩阵构建
- 定时任务和环境保护
从今天开始,为你的项目配置CI/CD流程。哪怕是最简单的自动化测试,也能显著提升代码质量和团队协作效率。随着经验积累,逐步完善你的自动化流水线,让GitHub Actions成为你最可靠的自动化助手。