GitHub Actions作为现代CI/CD流程的核心工具,其配置文件ci.yml的编写质量直接影响着项目的自动化水平。这个看似简单的YAML文件,实际上包含了构建、测试、部署全流程的精密控制逻辑。今天我们就来拆解这个"庖丁解牛"级别的技术活,看看如何打造一个高效可靠的CI流水线。
一个标准的ci.yml文件通常包含以下关键部分:
yaml复制name: CI Pipeline
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm install
- run: npm test
关键点:name定义工作流名称,on指定触发事件,jobs包含所有任务定义。每个job需要指定运行环境(runs-on)和具体步骤(steps)。
对于多环境测试场景,矩阵配置可以大幅提升效率:
yaml复制jobs:
test:
strategy:
matrix:
node-version: [12.x, 14.x, 16.x]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
合理使用缓存可以显著缩短构建时间:
yaml复制- name: Cache node modules
uses: actions/cache@v3
with:
path: |
~/.npm
node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
通过条件判断实现智能执行:
yaml复制- name: Run integration tests
if: github.ref == 'refs/heads/main'
run: npm run test:integration
敏感信息应使用GitHub Secrets:
yaml复制- name: Deploy to production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }}
run: ./deploy.sh
集成安全扫描工具:
yaml复制- name: Run security scan
uses: github/codeql-action/analyze@v2
yaml复制jobs:
unit-test:
# ...
integration-test:
needs: unit-test
# ...
e2e-test:
needs: integration-test
# ...
yaml复制jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 30
container:
image: node:16
options: --cpus 2 --memory 4g
yaml复制- name: Debug info
run: |
echo "Branch: ${{ github.ref }}"
echo "Event: ${{ github.event_name }}"
node -v
npm -v
通过job间的依赖关系实现可视化:
yaml复制jobs:
lint:
# ...
build:
needs: lint
# ...
deploy:
needs: build
# ...
在实际项目中,我通常会先建立最小可行的工作流,然后逐步添加lint检查、单元测试、集成测试等环节。每次修改后都会通过act工具在本地验证,确保不会因为配置错误阻塞团队开发。