GitHub Actions 上 Kotlin 项目的高级 CI/CD
自动化构建、测试和部署是现代 Kotlin 应用开发中至关重要的环节。如果您已经掌握了基本的 CI/CD 配置,那么是时候进阶到高级技术了。本文将深入探讨如何充分利用 GitHub Actions 来优化 Kotlin 项目:矩阵构建、智能缓存、并行测试以及灵活的部署。
1. 矩阵构建:在多个版本和操作系统上进行测试
GitHub Actions 最强大的功能之一就是矩阵策略(strategy.matrix)。它允许您使用不同的参数运行同一个工作流。对于 Kotlin 来说,如果您需要支持多个 JVM 版本或目标平台(例如 JVM + Native),这项功能不可或缺。
Kotlin Multiplatform 项目的矩阵构建示例:
name: Matrix Build Kotlinon: [push, pull_request]
jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] java: [11, 17, 21] kotlin-version: [1.9.22, 2.0.0] 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: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v2
- name: Build with Gradle run: ./gradlew build -Dkotlin.version=${{ matrix.kotlin-version }}建议:
- 使用
fail-fast: false,这样即使某个组合失败,也不会丢失其他组合的结果。 - 仅将矩阵限制为相关的版本,以避免浪费不必要的 Actions 运行时间。
- 对于 Windows,请务必配置正确的 Gradle 路径,并检查换行符(CRLF)。
2. Gradle 和依赖项的智能缓存
基于 Gradle 的 Kotlin 项目在每次运行 CI 时可能会下载数十兆字节的依赖项。如果没有缓存,构建将需要 5-10 分钟,而有了缓存,只需 30-40 秒。请使用内置的缓存操作。
steps: - uses: actions/cache@v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper build/ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle-
- name: Build with Gradle run: ./gradlew build --build-cache --no-daemon高级技巧:
- 将
gradle.lockfile的哈希值添加到缓存键中(如果您使用--write-locks)——这可以确保在依赖项版本更改时缓存失效。 - 使用 Gradle 提供的
gradle-build-action(操作:gradle/gradle-build-action@v3)——它会自动管理缓存并支持--build-cache。 - 不要缓存
~/.gradle/daemon——这可能会导致不同守护进程版本之间的冲突。
3. 并行测试与动态分片
对于包含数百个测试的大型项目,执行时间可能成为瓶颈。GitHub Actions 允许通过将测试分成多个分片来并行运行。这对于 Kotlin + JUnit 5 尤其有用。
按分片划分测试的示例:
jobs: test: runs-on: ubuntu-latest strategy: matrix: shard: [1, 2, 3, 4] # 4 个并行分片 steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'