引言:从基础流水线到工业级解决方案
为 Java 项目设置基础的 CI/CD 流水线固然不错。但在实际开发中,当项目扩展到数十个模块,且团队由多名开发者组成时,简单的 `mvn clean test` 已无法满足需求。随之而来的问题是:如何加速构建?如何在不同 JDK 版本上进行测试?如何组织并行测试?如何自动将制品发布到 Docker Hub?
在本文中,我们将深入探讨 Java 项目 GitHub Actions 的高级配置技巧。您将学习如何将您的流水线从线性的步骤序列转变为一个强大、并行且优化的持续集成与交付系统。
1. 矩阵构建:在多个 JDK 和操作系统上进行测试
CI 的关键任务之一是确保您的 Java 代码在所有支持的平台上都能运行。在 Windows、macOS 和 Linux 上手动运行不同 JDK 版本(11、17、21)的测试是一种奢侈。`GitHub Actions` 提供了一个优雅的解决方案:矩阵构建 (matrix builds)。
工作原理
您定义一个参数矩阵(JDK 版本、操作系统),GitHub 会自动为每个组合创建一个独立的作业。所有作业并行运行。
配置示例
name: Java CI Matrixon: [push, pull_request]
jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] java: [11, 17, 21] exclude: - os: windows-latest java: 21 # 如果 Windows 不支持 JDK 21,则排除此组合 fail-fast: false # 一个作业失败时,不停止其他作业
steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v4 with: java-version: ${{ matrix.java }} distribution: 'temurin' - name: Build with Maven run: mvn -B clean verify --file pom.xml关键点:
strategy.matrix— 定义参数组合。exclude— 允许排除已知不可行或不必要的组合。fail-fast: false— 如果一个作业失败,其余作业继续运行。这能提供完整的兼容性视图。
2. 依赖缓存:将构建速度提升 2-3 倍
每次流水线运行都从一个干净的环境开始。Maven 或 Gradle 会重新从仓库下载所有依赖。这可能需要 3-5 分钟。缓存 通过保存 `~/.m2/repository`(对于 Maven)或 `~/.gradle/caches`(对于 Gradle)文件夹,在运行之间重用它们来解决这个问题。
GitHub Actions 提供了内置的 `actions/cache` 操作。缓存键基于依赖文件(`pom.xml`)生成。如果文件未更改,缓存将立即恢复。
Maven 示例
steps: - uses: actions/checkout@v4
- name: Cache Maven dependencies uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: | ${{ runner.os }}-maven-
- name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'
- name: Build with Maven run: mvn -B clean verify --file pom.xml重要提示: 缓存步骤必须在构建步骤 之前 执行。键 `hashFiles('**/pom.xml')` 确保仅在依赖项更改时才更新缓存。
3. 并行执行测试与构建制品
当您的项目包含数百或数千个测试时,并且