介绍
在开发软件时,确保代码在不同环境中都能正确运行至关重要。例如,一个 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 的矩阵。
- 在你的
github-actions-demo的 GitHub 仓库页面上,点击绿色的 Code 按钮。 - 确保选择了 HTTPS 标签页,并复制 URL。它应该看起来像
https://github.com/your-username/github-actions-demo.git。 - 在 LabEx 环境中打开终端。默认路径是
~/project。 - 使用
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.
- 进入克隆的仓库目录:
cd ~/project/github-actions-demo
使用 WebIDE 编辑器创建一个新的工作流文件
.github/workflows/matrix-build.yml。你可以在左侧文件浏览器中project/github-actions-demo/.github/workflows/下找到该文件。首先创建基本的工作流结构。添加工作流名称和触发器:
name: Matrix Build
on: [push]
- 现在添加
jobs(任务)部分,包含一个基本的构建任务结构:
jobs:
build:
runs-on: ubuntu-latest
- 添加矩阵策略。这是启用使用多个 Node.js 版本运行任务的关键部分:
strategy:
matrix:
node-version: [18, 20, 22]
这定义了一个矩阵变量 node-version,它有三个值。GitHub Actions 将为每个值创建一个独立(separate)的任务。
- 添加
steps(步骤)部分。首先,添加 checkout 步骤:
steps:
- uses: actions/checkout@v4
- 添加 Node.js 设置步骤。注意我们如何使用
${{ matrix.node-version }}来引用当前的矩阵值:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- 添加安装依赖的步骤:
- name: Install dependencies
run: npm install
- 添加构建步骤,该步骤会创建 artifact(产物)目录:
- name: Build project
run: |
mkdir dist
echo "This is the build artifact" > dist/build.txt
- 添加运行测试的步骤:
- name: Run tests
run: npm test
- 最后,添加上传 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)具有唯一的名称,否则它们会相互覆盖。
- 在
.github/workflows/matrix-build.yml文件中,验证Use Node.js步骤使用了矩阵变量:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- 验证
Upload build artifact步骤在工件名称中包含了矩阵版本:
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: build-assets-${{ matrix.node-version }}
path: dist
- 你的完整工作流(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) 的运行情况。
- 确保你在仓库目录中:
cd ~/project/github-actions-demo
- 暂存更改:
git add .
- 提交更改:
git commit -m "Add matrix strategy for Node.js versions"
- 将更改推送到 GitHub 上的远程仓库:
git push
关于身份验证的注意事项:
当你运行 git push 时,WebIDE 会自动提示你进行身份验证。请遵循以下详细步骤:
- 会弹出一个提示框,显示消息:“The extension 'GitHub' wants to sign in using GitHub.”(扩展程序 'GitHub' 希望使用 GitHub 登录。)点击 Allow(允许)。
- 会出现一个新的通知。点击 **"Copy&Continue to GitHub"**(复制并继续到 GitHub),然后在下一个提示中点击 **"Open"**(打开)。
- 在打开的浏览器窗口中登录你的 GitHub 账户,并输入被复制的授权码。确认授权后,页面将自动关闭。
- 等待几秒钟,你将看到终端成功完成推送操作。
隐私声明: WebIDE 会请求对你的 GitHub 账户的完全访问权限以进行身份验证。你无需担心隐私问题——在当前实验 (lab) 完成后,LabEx 虚拟机 (VM) 将立即销毁,你的凭证和授权信息不会被保留。
此身份验证过程不需要手动配置用户名或 Personal Access Token。
在 GitHub 上验证
- 在网页浏览器中访问你的仓库。
- 点击 Actions 选项卡。
- 点击最新的工作流运行 (workflow run)。
- 在左侧边栏(或主图形视图中),你现在将在
build组下看到三个独立的任务 (jobs) 列出:build (18)build (20)build (22)
- 它们将并行(或几乎并行)运行。你可以点击其中每一个,查看
Use Node.js是否设置了请求的特定版本。

总结
在这个实验中,你学习了如何在 GitHub Actions 中使用**矩阵策略 (Matrix Strategy)**。你:
- 使用
strategy: matrix定义了一个包含多个 Node.js 版本的矩阵。 - 更新了工作流步骤,使其能够动态使用来自矩阵上下文的值 (
${{ matrix.node-version }})。 - 确保了每个矩阵 Job 的构建产物 (artifact) 名称是唯一的。
这个强大的功能允许你用极少的代码重复,针对广泛的配置来验证你的项目。



