第三十天:为 TeamCity 设计的 Kotlin DSL

一直以来,我们使用 TeamCity 时都是透过 Web UI 来设定,不论 Project 的 VCS、Build Configuration 都是。虽然 Web UI 可以 100% 地完成我们想做的所有设定,但这些设定都是储存在 TeamCity 的资料库里,您一定要进到 TeamCity 里才能看到。这些设定无法文件化的描述、无法做版本管理,在做类似的专案设定时也没办法快速复制或自动化。

设定即程序码(Configuration as Code)

在接触 DevOps 领域时,您一定听过 Configuration as Code,意思就是将所有的「设定」以「程序码」的方式纪录。因为是程序码,所以我们就可以用版本管理系统管理;因为是程序码,所以我们可以直接执行来达成自动化。

假如您有使用过其他 CI 服务器或服务的话,您可能会看过其他 CI 使用 YAML 来做 Configuration as Code。但 TeamCity 走跟他们不太一样的路线,其采用 Kotlin DSL 做为 Configuration as Code 的格式。DSL 全名为 Domain-Specific Language,意思是针对该应用领域的逻辑及词汇来设计的专用语言,让非程序人员也能轻松上手。而 Kotlin 因为具备不少语法糖,所以非常适合拿来做为 DSL 语言。

那为什麽 TeamCity 选择 Kotlin DSL 而不用 YAML 呢?主要有几个原因:

  1. YAML 的格式虽然简单但非常依赖缩排,只要缩排一有错误,设定档就会出错。
  2. YAML 格式本身没有型别(Type),因此 IDE 很难针对这种格式做语法提示、自动完成、语法侦错及智能修正。
  3. Kotlin DSL 本身就是 Kotlin 程序码,这代表假如今天有任何需求,开发者甚至能直接用 Kotlin 扩充功能。

开启专案支援 Kotlin DSL 设定

要让 TeamCity 专案支援 Kotlin DSL 很简单,尤其当我们的专案已经使用 Git 做版本管理时,TeamCity 可以将 Kotlin DSL 产生出来并直接 Commit 到版本管理系统内。首先进到 Shopping Cart 专案设定,点选左边侧边栏的 Versioned Settings:

在 Versioned Settings 设定页,将同步设定从原本的 Use settings from a parent project 改成 Synchronization enabled,接着设定 Project settings VCS root 为专案的 Git 来源、Settings format 选 Kotlin,其他保持预设,完成後按 Apply 套用。

TeamCity 会将目前所有的专案设定以 Kotlin DSL 的格式输出成档案,并自动将输出档 Commit & Push 到版本管理系统里。在这边要稍为注意一下的是,在开启同步设定的过程中,TeamCity 会暂时把 Web UI 转成唯读(Read-only)模式,直到完成 Commit & Push 且完成跟 TeamCity 的同步後就会恢复。

若只是想看一下 TeamCity 的 Kotlin DSL 设定档输出格式,暂时还不想开启同步设定模式的话,也可以到专案设定首页,点选右上角的 Actions 下拉式选单,选择 Download settings in Kotlin format...

TeamCity 就会把目前专案的 Kotlin DSL 设定档以 Zip 档的格式下载下来。

编辑 TeamCity Kotlin DSL

回到 IntelliJ IDEA,我们先将刚刚 TeamCity 输出 Kotlin DSL 设定档的那个 Commit 从版本管理系统 Pull 下来。我们会看到在这个 Commit 里,TeamCity 在专案原始码里加了一个 .teamcity 的资料夹,里面有 2 个档案:

  • settings.kts:包含所有专案设定的主要 Kotlin DSL 档案。
  • pom.xml:让 IDE 可以抓到编辑 Kotlin DSL 时所需要的所有相依套件,以及执行编译或运行测试所需要的工具。

为了让 IntelliJ IDEA 能真正识别这 2 个档案以及具备程序码提示等 IDE 功能,我们需要先将 .teamcity 资料夹变成一个 Module。请先点选 File > Project Structure,接着切换到 Project settings 底下的 Modules,点选 + 按钮後选择 Import Module。

在弹出式视窗里选择专案底下的 .teamcity 资料夹後按 Open 开启。再选择 Maven 做为 Module 使用的相依管理工具,接着按 Finish 关闭视窗,再按 OK 完成 Project Structure 设定。

完成 Module 设定後,IntelliJ IDEA 会花一些时间把所有需要的相依及工具载入。接着我们再打开 .teamcity/settings.kts 时,就会发现所有的程序码都已经正确上色,输入程序码时也会有自动完成的提示了!

以 Kotlin DSL 自动化设定专案

学会了输出 Kotlin DSL 的技巧後,我们也能将这个用在自动化设定专案上。也就是说,我们可以在新专案里新增一样的 TeamCity Kotlin DSL 目录结构,当我们在 TeamCity 里建立这个专案时,TeamCity 会自动抓到这个专案根目录底下 .teamcity 的内容,然後自动根据里面的 Kotlin DSL 帮我们设定。

首先我们先建立一个全新的 Kotlin 专案,完成一些功能後,依照前一步的方式新增 Module 及 .teamcity 底下的所有档案,settings.kts 里可以写一段最基本跑 Gradle Build 的 Build Step,完成後就 Commit & Push 到 VCS 上:

import jetbrains.buildServer.configs.kotlin.v2019_2.*
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle

version = "2021.1"

project {

    buildType(Build)
}

object Build : BuildType({
    name = "Build"

    vcs {
        root(DslContext.settingsRoot)
    }

    steps {
        gradle {
            tasks = "clean build"
            gradleWrapperPath = ""
        }
    }
})

接着到 TeamCity 建立新专案,以刚刚做好的专案为 Repository 来源,我们会发现 TeamCity 在抓取资料时自动发现 .teamcity 设定档已存在,会询问我们是不是直接依照设定档内容设定即可?按确定後,TeamCity 就自动完成了所有设定,我们再进到 Build Configuration 里就会看到刚设定的 Build Step 都已经自动设定好了。

小结

经过今天的介绍,相信大家都能更实际地看到 Configuration as Code 在 TeamCity 的应用,也应该更了解 TeamCity 为何选择 Kotlin DSL 做为设定档格式的原因以及在开发时的好处。若能善加利用相信对大家的开发工作也会很有帮助。

经过 30 天的练习,相信大家对 DevOps、TeamCity 都有一些基本的认识,明天会跟大家介绍一下 TeamCity 的学习资源,以及还可以深入研究的主题!

参考资料


<<:  Day20:SwiftUI—GeometryReader

>>:  [Day20] TS:用型别建立型别:当个 TypeScript 的型别魔术师

React Router

首先要安装 react router dom: npm install react-router-d...

第55天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10260...

开个六给他,让他赢庄家一百块 - 根据五档报价之期货买卖

原本想要实作根据五档挂买卖下单,发现 snapshots 没有五档买卖价格 假如我今天就是想挂某一档...

【Day 20】QGIS + OSM + folium part 2

看看昨天的图层 我们将图层输出(Export)成 GeoJSON,点开来可以看到这些 json 的文...

[Java Day24] 6.1. 继承

教材网址 https://coding104.blogspot.com/2021/06/java-i...