Kotlin的CI/CD:从零开始为真实项目搭建流水线

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

你写了一个很棒的Kotlin项目。但如何无痛地交付更新呢?

\n\n

你提交了代码,推送到GitHub,然后……开始手动仪式:构建jar包,上传到服务器,重启,检查是否一切正常。熟悉吗?如果项目不断增长,出现了测试、代码检查工具、多个环境——这些例行公事会吞噬数小时,而一个被遗忘的命令就可能让生产环境崩溃。

\n\n

解决方案是——Kotlin的CI/CD流水线。这是一个自动化管道,它会在每次推送后自动构建项目、运行测试、检查代码风格并部署到服务器。在本文中,我将展示如何使用GitHub Actions和Gradle从零开始搭建这样的流水线。你将获得一个现成的模板,可以适配到你的项目——无论是Ktor服务器应用、Android应用还是库。

\n\n

开始吧!🚀

\n\n

什么是CI/CD,为什么Kotlin开发者需要它?

\n\n

CI(持续集成)——你推送代码,系统自动构建、测试并检查质量。CD(持续交付/部署)——构建成功后,代码自动部署到服务器(或应用商店)。

\n\n

对于Kotlin项目,CI/CD尤其重要:

\n
    \n
  • 节省时间——无需手动运行gradle build。
  • \n
  • 代码质量——每次提交都会触发测试和代码检查。
  • \n
  • 安全性——仅当流水线通过时,生产环境才会更新。
  • \n
  • 透明度——整个团队都能看到构建状态。
  • \n
\n\n

今天,我们将在GitHub Actions上构建一个完整的Kotlin CI/CD流水线。这对于公共仓库是免费的,并且非常灵活。

\n\n

步骤1:准备Kotlin项目

\n\n

在编写流水线之前,请确保你的项目已准备好进行CI/CD。我将使用一个典型的Gradle(Kotlin DSL)项目结构。

\n\n

以下是一个简单控制台应用的build.gradle.kts示例:

\n\n
plugins {\n    kotlin("jvm") version "1.9.22"\n    application\n}\n\napplication {\n    mainClass.set("com.example.MainKt")\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation(kotlin("stdlib"))\n    testImplementation("org.jetbrains.kotlin:kotlin-test")\n}\n\ntasks.test {\n    useJUnitPlatform()\n}
\n\n

重要提示:至少添加一个测试,这样流水线才有意义。

\n\n

测试示例(src/test/kotlin/com/example/AppTest.kt):

\n\n
import kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass AppTest {\n    @Test\n    fun testGreeting() {\n        assertEquals("Hello, Kotlin!", getGreeting())\n    }\n}
\n\n

现在,将项目提交并推送到GitHub。

\n\n

步骤2:创建第一个CI流水线:构建与测试

\n\n

在仓库根目录下创建文件夹.github/workflows,并在其中创建文件ci.yml。

\n\n

以下是一个最小的Kotlin的GitHub Actions工作流:

\n\n
name: CI Pipeline for Kotlin\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: 'temurin'\n\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n\n      - name: Build with Gradle\n        run: ./gradlew build\n\n      - name: Run tests\n        run: ./gradlew test\n\n      - name: Archive test results\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: test-results\n          path: build/reports/tests/
\n\n

这里发生了什么:

\n
    \n
  • 触发器:push

博客

书籍推荐