GitHub Actions 矩阵构建

GitBeginner
立即练习

介绍

在开发软件时,确保代码在不同环境中都能正确运行至关重要。例如,一个 Node.js 库应该在多个 Node.js 版本上进行测试(例如,v18、v20、v22)。

GitHub Actions 提供了 Matrix Strategy (矩阵策略),而不是为每个版本创建单独的 Job。这允许你定义一组变量,GitHub Actions 将自动为这些变量的每种组合创建一个 Job。

在这个 Lab 中,你将更新你的工作流 (workflow),使其能够并行地在三个不同的 Node.js 版本上运行你的测试。

这个 Lab 基于你在前几个 Lab 中创建的仓库。你将使用 github-actions-demo 仓库。

修改工作流以包含策略矩阵

strategy 关键字用于配置构建矩阵(build matrix)。我们将定义一个只包含一个键 node-version 的矩阵。

  1. 在你的 github-actions-demo 的 GitHub 仓库页面上,点击绿色的 Code 按钮。
  2. 确保选择了 HTTPS 标签页,并复制 URL。它应该看起来像 https://github.com/your-username/github-actions-demo.git
  3. 在 LabEx 环境中打开终端。默认路径是 ~/project
  4. 使用 git clone 命令下载仓库。将 your-username 替换为你实际的 GitHub 用户名。
cd ~/project
git clone https://github.com/your-username/github-actions-demo.git

示例输出:

Cloning into 'github-actions-demo'...
remote: Enumerating objects: X, done.
remote: Counting objects: 100% (X/X), done.
remote: Total X (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (X/X), done.
  1. 进入克隆的仓库目录:
cd ~/project/github-actions-demo
  1. 使用 WebIDE 编辑器创建一个新的工作流文件 .github/workflows/matrix-build.yml。你可以在左侧文件浏览器中 project/github-actions-demo/.github/workflows/ 下找到该文件。

  2. 首先创建基本的工作流结构。添加工作流名称和触发器:

name: Matrix Build

on: [push]
  1. 现在添加 jobs(任务)部分,包含一个基本的构建任务结构:
jobs:
  build:
    runs-on: ubuntu-latest
  1. 添加矩阵策略。这是启用使用多个 Node.js 版本运行任务的关键部分:
strategy:
  matrix:
    node-version: [18, 20, 22]

这定义了一个矩阵变量 node-version,它有三个值。GitHub Actions 将为每个值创建一个独立(separate)的任务。

  1. 添加 steps(步骤)部分。首先,添加 checkout 步骤:
steps:
  - uses: actions/checkout@v4
  1. 添加 Node.js 设置步骤。注意我们如何使用 ${{ matrix.node-version }} 来引用当前的矩阵值:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. 添加安装依赖的步骤:
- name: Install dependencies
  run: npm install
  1. 添加构建步骤,该步骤会创建 artifact(产物)目录:
- name: Build project
  run: |
    mkdir dist
    echo "This is the build artifact" > dist/build.txt
  1. 添加运行测试的步骤:
- name: Run tests
  run: npm test
  1. 最后,添加上传 artifact 的步骤。注意 artifact 的名称如何包含矩阵版本,以确保每个 artifact 都是唯一的:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist

完成更改后,你的完整文件现在应该如下所示:

name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

解释

  • strategy: 定义构建策略。
  • matrix: 定义矩阵变量。
  • node-version: 这是我们选择的变量名称。我们为其分配了一个值数组 [18, 20, 22]。GitHub Actions 将运行 build 任务三次,每次使用一个值。
  • ${{ matrix.node-version }}: 此语法允许你在步骤中访问当前的矩阵值。

完成更改后,保存文件(Ctrl+S 或 Cmd+S)。

更新 setup-node 和 artifact 名称以使用矩阵上下文

定义矩阵只是成功的一半;我们还需要告诉步骤如何使用矩阵中的当前值。我们通过 ${{ matrix.node-version }} 上下文来实现这一点。

我们还需要确保每个并行实验(job)上传的工件(artifact)具有唯一的名称,否则它们会相互覆盖。

  1. .github/workflows/matrix-build.yml 文件中,验证 Use Node.js 步骤使用了矩阵变量:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. 验证 Upload build artifact 步骤在工件名称中包含了矩阵版本:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist
  1. 你的完整工作流(workflow)文件应如下所示:
name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

保存文件(Ctrl+S 或 Cmd+S)。

提交、推送并观察并行作业

让我们通过将你的更改提交到 GitHub 来实际查看矩阵 (matrix) 的运行情况。

  1. 确保你在仓库目录中:
cd ~/project/github-actions-demo
  1. 暂存更改:
git add .
  1. 提交更改:
git commit -m "Add matrix strategy for Node.js versions"
  1. 将更改推送到 GitHub 上的远程仓库:
git push

关于身份验证的注意事项:
当你运行 git push 时,WebIDE 会自动提示你进行身份验证。请遵循以下详细步骤:

  1. 会弹出一个提示框,显示消息:“The extension 'GitHub' wants to sign in using GitHub.”(扩展程序 'GitHub' 希望使用 GitHub 登录。)点击 Allow(允许)。
  2. 会出现一个新的通知。点击 "Copy&Continue to GitHub"(复制并继续到 GitHub),然后在下一个提示中点击 "Open"(打开)。
  3. 在打开的浏览器窗口中登录你的 GitHub 账户,并输入被复制的授权码。确认授权后,页面将自动关闭。
  4. 等待几秒钟,你将看到终端成功完成推送操作。

隐私声明: WebIDE 会请求对你的 GitHub 账户的完全访问权限以进行身份验证。你无需担心隐私问题——在当前实验 (lab) 完成后,LabEx 虚拟机 (VM) 将立即销毁,你的凭证和授权信息不会被保留。

此身份验证过程不需要手动配置用户名或 Personal Access Token。

在 GitHub 上验证

  1. 在网页浏览器中访问你的仓库。
  2. 点击 Actions 选项卡。
  3. 点击最新的工作流运行 (workflow run)。
  4. 在左侧边栏(或主图形视图中),你现在将在 build 组下看到三个独立的任务 (jobs) 列出:
    • build (18)
    • build (20)
    • build (22)
  5. 它们将并行(或几乎并行)运行。你可以点击其中每一个,查看 Use Node.js 是否设置了请求的特定版本。
GitHub Actions matrix builds

总结

在这个实验中,你学习了如何在 GitHub Actions 中使用矩阵策略 (Matrix Strategy)。你:

  1. 使用 strategy: matrix 定义了一个包含多个 Node.js 版本的矩阵。
  2. 更新了工作流步骤,使其能够动态使用来自矩阵上下文的值 (${{ matrix.node-version }})。
  3. 确保了每个矩阵 Job 的构建产物 (artifact) 名称是唯一的。

这个强大的功能允许你用极少的代码重复,针对广泛的配置来验证你的项目。