JavaScript 高级 CI/CD:GitHub Actions 实战

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 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                

博客

书籍推荐