在上一篇中我们学会了如何用 Workflow 定义基础的 CI 流水线。当项目需要支持多版本运行时如 Node.js 14/16/18、多操作系统Linux/Windows/macOS或者需要部署到 dev/staging/prod 多个环境时简单的顺序执行已经不够用了。本文深入讲解 GitHub Actions 的三大进阶能力矩阵构建Matrix Strategy 实现并行测试、依赖缓存Caching 加速构建、以及多环境部署Environments 实现环境隔离与安全审批。掌握这些技术你的流水线将从“能用”走向“高效、安全、可扩展”。一、矩阵构建Matrix Strategy一次定义并行执行矩阵策略允许你定义一组变量GitHub Actions 会为这些变量的每一种组合创建一个独立的 Job 并并行执行。它特别适合多语言版本测试如 Python 3.8/3.9/3.10多操作系统兼容性测试如 ubuntu/windows/macos多浏览器或多数据库版本的集成测试1.1 基础矩阵配置以下示例展示了如何针对三个 Node.js 版本在两个操作系统上运行测试共生成 3 × 2 6 个并行 Jobname:Matrix Teston:[push,pull_request]jobs:test:runs-on:${{matrix.os}}strategy:matrix:node-version:[18,20,22]os:[ubuntu-latest,windows-latest]steps:-uses:actions/checkoutv4-name:Use Node.js ${{matrix.node-version}}uses:actions/setup-nodev4with:node-version:${{matrix.node-version}}-run:npm ci-run:npm test矩阵中的每个组合都是独立的 Job互不影响。如果某个组合失败其他组合仍会继续执行除非设置了 fail-fast: false。1.2 高级矩阵控制排除特定组合当某些组合没有意义时如 Windows 上不需要测试某个旧版本可以使用 exclude 排除strategy:matrix:node-version:[18,20,22]os:[ubuntu-latest,windows-latest]exclude:-os:windows-latestnode-version:18# 不在 Windows 上测试 Node 18包含额外组合使用 include 添加不在矩阵组合中的额外 Jobstrategy:matrix:node-version:[18,20]os:[ubuntu-latest]include:-os:windows-latestnode-version:22# 额外在 Windows 上测试 Node 22控制失败传播设置 fail-fast: false 可以让所有矩阵 Job 都运行完毕即使其中某些失败strategy:fail-fast:falsematrix:node-version:[18,20,22]1.3 将矩阵输出用于后续 Job矩阵 Job 产生的构建产物如测试报告、JAR 包可以通过 upload-artifact 保存后续 Job 通过 download-artifact 汇总jobs:test:runs-on:ubuntu-lateststrategy:matrix:node-version:[18,20,22]steps:-run:npm test----coverage-name:Upload coverage reportuses:actions/upload-artifactv4with:name:coverage-report-node-${{matrix.node-version}}path:coverage/merge-reports:runs-on:ubuntu-latestneeds:teststeps:-name:Download all coverage reportsuses:actions/download-artifactv4with:path:all-reports/-run:./merge-coverage.sh all-reports/二、依赖缓存Caching让构建快如闪电每次 Workflow 运行时如果都要重新下载所有依赖如 Maven 的 .m2、npm 的 node_modules不仅耗时而且浪费带宽。缓存Caching 允许你将依赖目录保存下来在后续的 Workflow 运行中复用。2.1 使用语言内置缓存最简方式大多数官方 setup-* Action 都内置了缓存支持这是最简单的方式-uses:actions/setup-nodev4with:node-version:20cache:npm# 自动缓存 ~/.npmyaml-uses:actions/setup-javav4with:distribution:temurinjava-version:17cache:maven# 自动缓存 ~/.m2/repository2.2 使用 actions/cache 手动控制当需要更精细的缓存控制时可以使用 actions/cache-name:Cache Maven dependenciesuses:actions/cachev4with:path:~/.m2/repositorykey:${{runner.os}}-m2-${{hashFiles(**/pom.xml)}}restore-keys:|${{ runner.os }}-m2-key缓存的唯一标识。当 pom.xml 变化时hashFiles 会生成新的哈希值自动创建新的缓存。restore-keys如果精确的 key 未命中按顺序尝试恢复部分匹配的缓存。 最佳实践对于 Maven 项目建议先执行 mvn dependency:go-offline 下载依赖再执行 mvn package这样缓存能覆盖所有依赖。2.3 缓存的限制与注意事项GitHub 的缓存总大小限制为 10GB每个仓库。缓存的有效期为 7 天未被访问的缓存会被自动清理。缓存 Key 的设计要合理太粗如只用 runner.os会导致缓存频繁被覆盖太细如包含所有源码的哈希会导致缓存几乎无法命中。三、多环境部署Environments环境隔离与安全审批GitHub Environments 是一个强大的部署管理功能它允许你为不同的部署目标如 dev、staging、prod配置独立的环境变量、密钥Secrets 和保护规则Protection Rules 。当一个 Job 引用某个环境时它必须通过该环境的所有保护规则才能执行或访问环境密钥。3.1 创建环境在 GitHub 仓库中进入 Settings → Environments点击 New environment输入名称如 production配置保护规则Required reviewers指定需要审批的人员或团队最多 6 人Wait timer部署前等待指定时间如 5 分钟Branch restrictions限制只有特定分支才能部署到该环境3.2 在 Workflow 中使用环境name:Multi-Environment Deploymenton:push:branches:[main,develop]jobs:deploy-dev:runs-on:ubuntu-latestenvironment:dev# 引用 dev 环境steps:-run:echo 部署到开发环境-run:echo DB_HOST:${{secrets.DB_HOST}}# 使用环境密钥deploy-staging:runs-on:ubuntu-latestenvironment:stagingif:github.ref refs/heads/develop# 仅 develop 分支触发steps:-run:echo 部署到预发布环境deploy-prod:runs-on:ubuntu-latestenvironment:production# 引用 production 环境if:github.ref refs/heads/mainsteps:-run:echo 部署到生产环境3.3 环境审批Required Reviewers的工作流程当 Job 引用了一个配置了 Required reviewers 的环境时Job 启动后会自动暂停状态变为 Waiting for approval。被指定为审批人的用户或团队成员会收到通知。审批人点击 Review deployments 并批准后Job 才会继续执行。如果被拒绝Job 失败并停止。3.4 环境级别的密钥与变量每个环境可以独立配置 Secrets 和 Variables在 Workflow 中环境密钥的引用方式与普通 Secrets 相同${{ secrets.API_KEY }}。Job 引用的环境决定了使用哪一组密钥。四、完整实战矩阵构建 缓存 多环境部署下面是一个综合示例展示了如何将矩阵构建、依赖缓存和多环境部署整合到一条完整的 CI/CD 流水线中name:CI/CD Pipelineon:push:branches:[main,develop]pull_request:branches:[main]env:REGISTRY:ghcr.ioIMAGE_NAME:${{github.repository}}jobs:# Job 1: 矩阵测试 test:name:Test on ${{matrix.os}}/ Node ${{matrix.node-version}}runs-on:${{matrix.os}}strategy:matrix:node-version:[18,20]os:[ubuntu-latest,windows-latest]fail-fast:falsesteps:-uses:actions/checkoutv4-uses:actions/setup-nodev4with:node-version:${{matrix.node-version}}cache:npm-run:npm ci-run:npm test-name:Upload test reportif:always()uses:actions/upload-artifactv4with:name:test-report-${{matrix.os}}-${{matrix.node-version}}path:test-results/# Job 2: 构建镜像仅 main 分支 build:runs-on:ubuntu-latestneeds:testif:github.ref refs/heads/mainsteps:-uses:actions/checkoutv4-name:Cache Maven dependenciesuses:actions/cachev4with:path:~/.m2/repositorykey:${{runner.os}}-m2-${{hashFiles(**/pom.xml)}}restore-keys:${{runner.os}}-m2--name:Build with Mavenrun:mvn package-name:Build Docker imagerun:docker build-t ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{github.sha}}.# Job 3: 部署到开发环境develop 分支自动 deploy-dev:runs-on:ubuntu-latestneeds:buildif:github.ref refs/heads/developenvironment:name:devurl:https://dev.myapp.example.comsteps:-run:echo 部署到开发环境-run:echo DB:${{secrets.DB_HOST}}# Job 4: 部署到生产环境main 分支需审批 deploy-prod:runs-on:ubuntu-latestneeds:buildif:github.ref refs/heads/mainenvironment:name:productionurl:https://myapp.example.comsteps:-run:echo 部署到生产环境需审批-run:echo DB:${{secrets.DB_HOST}}五、小结矩阵构建通过 strategy.matrix 一次定义、并行执行多版本/多平台测试依赖缓存使用 actions/cache 或语言内置缓存大幅减少构建时间多环境部署通过 environment 关键字实现环境隔离配合 Required reviewers 实现审批门禁