你写了一个很棒的Kotlin项目。但如何无痛地交付更新呢?
\n\n你提交了代码,推送到GitHub,然后……开始手动仪式:构建jar包,上传到服务器,重启,检查是否一切正常。熟悉吗?如果项目不断增长,出现了测试、代码检查工具、多个环境——这些例行公事会吞噬数小时,而一个被遗忘的命令就可能让生产环境崩溃。
\n\n解决方案是——Kotlin的CI/CD流水线。这是一个自动化管道,它会在每次推送后自动构建项目、运行测试、检查代码风格并部署到服务器。在本文中,我将展示如何使用GitHub Actions和Gradle从零开始搭建这样的流水线。你将获得一个现成的模板,可以适配到你的项目——无论是Ktor服务器应用、Android应用还是库。
\n\n开始吧!🚀
\n\n什么是CI/CD,为什么Kotlin开发者需要它?
\n\nCI(持续集成)——你推送代码,系统自动构建、测试并检查质量。CD(持续交付/部署)——构建成功后,代码自动部署到服务器(或应用商店)。
\n\n对于Kotlin项目,CI/CD尤其重要:
\n- \n
- 节省时间——无需手动运行gradle build。 \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示例:
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):
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。
以下是一个最小的Kotlin的GitHub Actions工作流:
\n\nname: 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