引言:为什么 CI/CD 是现代 Java 开发的标准
\n在 Java 开发世界中,代码交付的速度和质量至关重要。每天团队都会提交数百次更改,如果没有自动化,集成过程将陷入混乱。CI/CD(持续集成/持续部署)解决了这个问题:代码会自动构建、测试并部署到服务器上。
\nGitHub Actions 工具是仓库中内置的 CI/CD 解决方案。它允许您使用 YAML 创建工作流(workflows),这些工作流会响应 push、pull request 或其他事件。在本文中,我们将介绍为 Java 项目配置 CI/CD 的完整流程:从基本构建到云端部署。
\n您将了解如何加速开发、避免错误并实现日常任务自动化。让我们开始吧!
\n\n1. GitHub Actions 基础:工作流结构
\n什么是 GitHub Actions?
\nGitHub Actions 是一个用于自动化工作流程的平台。工作流(Workflow)是一组在事件发生时(例如,推送到 main 分支)执行的步骤。每个工作流由以下部分组成:
\n- \n
- Event — 触发器(push、pull_request、schedule)。 \n
- Jobs — 在虚拟机(runner)上执行的任务。 \n
- Steps — 具体操作(运行脚本、安装依赖项)。 \n
对于 Java 项目,典型的工作流包括:检出代码、安装 JDK、使用 Maven/Gradle 构建、运行测试和发布工件。
\n\n为 Java 创建第一个工作流
\n在仓库根目录下创建文件夹 .github/workflows/ 和文件 ci.yml。以下是 Maven 项目的最小示例:
name: Java CI with Maven\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n - name: Set up JDK 17\n uses: actions/setup-java@v4\n with:\n java-version: '17'\n distribution: 'temurin'\n - name: Build with Maven\n run: mvn clean compile\n - name: Run tests\n run: mvn test\n此工作流在推送到 main 或向 main 发起 pull request 时触发。它会检查代码是否可以编译以及测试是否通过。如果测试失败,工作流将以错误结束,您将收到通知。
\n\n2. 高级配置:缓存、矩阵和工件
\n依赖项缓存
\nMaven 和 Gradle 每次都会重新下载依赖项——这很慢。GitHub Actions 支持缓存。添加一个使用 actions/cache 的步骤:
- name: Cache Maven packages\n uses: actions/cache@v4\n with:\n path: ~/.m2/repository\n key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}\n restore-keys: |\n ${{ runner.os }}-maven-\n缓存键基于 pom.xml 的哈希值。如果文件未更改,则从缓存恢复依赖项,构建时间可缩短 2-3 倍。
矩阵构建(Matrix Build)
\nJava 项目通常需要在多个 JDK 版本和操作系统上进行测试。使用 matrix 策略:
\njobs:\n test:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n java: [11, 17, 21]\n steps:\n - uses: actions/checkout@v4\n - name: Set up JDK ${{ matrix.java }}\n uses: actions/setup-java@v4\n with:\n java-version: ${{ matrix.java }}\n distribution: 'temurin'\n - name: Test with Maven\n run: mvn test\nGitHub 将创建 3 个并行任务——分别针对 Java 11、17 和 21。这确保了代码与不同 JDK 版本的兼容性。
\n\n保存工件
\n构建后,JAR 文件可以作为工件保存,以便手动下载或在下一个任务中使用:
\n- name: Upload JAR artifact\n uses: actions/upload-artifact@v4\n with