⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

11.2.1 Workflow 配置:触发条件与执行环境

一句话破题

GitHub Actions 的 Workflow 是用 YAML 定义的自动化流程,通过指定触发条件执行步骤来实现 CI/CD。

核心价值

理解 Workflow 配置能让你:

  • 在代码提交时自动运行检查
  • 在 PR 合并前强制通过测试
  • 在发布时自动部署到生产环境

文件结构

.github/
└── workflows/
    ├── ci.yml        # 持续集成
    ├── deploy.yml    # 部署流程
    └── release.yml   # 发布流程

快速上手

触发条件配置

yaml
name: CI

on:
  # 推送到指定分支时触发
  push:
    branches: [main, develop]
    paths:
      - 'src/**'           # 只在 src 目录变更时触发
      - '!src/**/*.test.ts' # 忽略测试文件变更
  
  # PR 针对指定分支时触发
  pull_request:
    branches: [main]
  
  # 定时触发(北京时间每天 8:00)
  schedule:
    - cron: '0 0 * * *'
  
  # 手动触发
  workflow_dispatch:
    inputs:
      environment:
        description: '部署环境'
        required: true
        default: 'staging'

执行环境配置

yaml
jobs:
  build:
    runs-on: ubuntu-latest  # 运行环境
    
    strategy:
      matrix:
        node-version: [18, 20]  # 多版本测试
    
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'  # 缓存 npm 依赖
      
      - run: npm ci
      - run: npm test

Job 依赖与并行

yaml
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

  build:
    needs: [lint, test]  # 依赖 lint 和 test 都成功
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build

常用触发事件

事件说明示例场景
push推送代码主分支构建
pull_requestPR 操作代码审查前检查
release发布 Release自动部署
schedule定时任务每日安全扫描
workflow_dispatch手动触发紧急部署

条件执行

yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    # 只在 main 分支且不是 PR 时执行
    if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
    steps:
      - run: echo "Deploying to production"

避坑指南

新手最容易犯的错

  1. YAML 缩进错误导致配置解析失败
  2. 忘记配置 actions/checkout 导致没有代码
  3. 不缓存依赖导致每次都重新下载
  4. 敏感信息直接写在配置文件中