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) 名称是唯一的。

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