使用 GitHub Actions 为 JavaScript 项目实现高级 CI/CD
自动化构建、测试和部署 (CI/CD) 是现代 JavaScript 开发中不可或缺的一部分。如果您已经掌握了 GitHub Actions 的基本流水线,那么是时候进入下一个层次了。在本文中,我们将探讨高级技术:依赖缓存、矩阵构建、并行任务执行、安全的密钥管理以及自动部署到 VPS 和 Docker。所有示例均针对 Node.js 项目。
1. 优化构建时间:缓存和条件触发
基本流水线的主要问题之一是每次运行时安装 node_modules 耗时过长。GitHub Actions 允许缓存依赖项,从而将执行时间缩短 2-4 倍。
使用 actions/cache 操作来缓存 node_modules 或 ~/.npm:
name: CI Pipelineon: [push, pull_request]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20'
- name: Cache node_modules uses: actions/cache@v3 id: npm-cache with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} restore-keys: | ${{ runner.os }}-node-
- name: Install dependencies if: steps.npm-cache.outputs.cache-hit != 'true' run: npm ci高级建议:
- 使用
hashFiles('package-lock.json')在依赖项更改时精确地使缓存失效。 - 对于单体仓库,使用
path: packages/*/node_modules分别缓存每个包。 - 添加条件触发 (
if: github.ref == 'refs/heads/main'),以便仅在推送到 main 分支时才执行繁重任务(例如构建生产版本)。
2. 矩阵构建和并行任务
矩阵策略允许使用不同参数运行同一个工作流。这对于在多个 Node.js 版本或操作系统上进行测试至关重要。
jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test对于并行执行独立任务(例如代码检查、单元测试、集成测试),请使用单独的 jobs。它们同时执行,互不阻塞:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run lint
unit-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run test:unit
integration-tests: needs: [lint, unit-tests] # 等待 lint 和 unit 完成 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run test:integration重要提示: 使用 needs 来指定依赖任务的执行顺序。这可以节省时间和资源。
3. 高级部署:使用构建产物的 Docker 和 VPS
测试成功后,需要部署应用程序。我们考虑两种常见场景:部署到 Docker 镜像和部署到 VPS。
3.1. 构建和推送 Docker 镜像
jobs: build-and-push: needs: [test] runs-on: ub