引言:为什么 CI/CD 对 Kotlin 项目至关重要
现代 Kotlin 开发——无论是基于 Spring Boot 的后端、Android 应用,还是跨平台项目——都需要快速可靠的交付周期。手动构建和测试过程不仅耗时,而且容易出错。这时,CI/CD(持续集成/持续部署)就派上了用场。
GitHub Actions 是一个内置的自动化系统,允许你直接在仓库中运行工作流。对 Kotlin 项目来说,这是一个理想的选择:它可以轻松集成 Gradle,支持依赖缓存,并允许你在任何平台上部署应用程序。
在本文中,我们将详细讲解如何使用 GitHub Actions 为 Kotlin 项目搭建一个完整的 CI/CD 流水线:从基本构建到自动部署。
1. GitHub Actions 基础:工作流结构
GitHub Actions 中的每个工作流都是一个位于 .github/workflows/ 目录下的 YAML 文件。我们以 Kotlin 项目为例,看看其基本组成部分。
1.1. 触发器 (on)
工作流由特定事件触发:推送到分支、创建拉取请求或按计划(cron)执行。
1.2. 作业与步骤
作业是在一个虚拟环境中执行的一组步骤。步骤可以运行命令、脚本或市场中的现成操作。
1.3. 最小工作流示例
让我们为基于 Gradle 的 Kotlin 项目创建一个文件 .github/workflows/ci.yml:
name: CI for Kotlin
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4
- name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'
- name: Setup Gradle uses: gradle/actions/setup-gradle@v3
- name: Build with Gradle run: ./gradlew build
- name: Run tests run: ./gradlew test这个流水线将在每次推送到 main/develop 分支或向其发起 PR 时运行构建和测试。
2. CI 优化:缓存与并行作业
没有优化,每次运行都会从头下载 Gradle 依赖。对于 Kotlin 项目,这可能需要 2–5 分钟。解决方案是缓存。
2.1. 缓存 Gradle 缓存
GitHub Actions 允许你缓存 ~/.gradle/caches 目录:
- name: Cache Gradle packages uses: actions/cache@v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle-首次运行后,后续运行将使用缓存——速度提升 2–3 倍。
2.2. 为不同任务设置并行作业
你可以将测试、代码检查(Linting)和构建拆分为并行运行的独立作业:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run detekt run: ./gradlew detekt
test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run tests run: ./gradlew test
build: needs: [lint, test] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build JAR run: ./gradlew bootJar这里,build 只有在代码检查和测试都成功通过后才会启动。
3. Kotlin 项目的高级场景
让我们来看看 Kotlin 的 CI/CD 中经常遇到的一些实际任务。
3.1. 将制品发布到 GitHub Packages
如果你正在开发