第七天:加装 Build Agent

简单来说,TeamCity 的运作方式是 Server + Agent 的架构。平常我们看到的 TeamCity 操作画面是 Server 端,它负责提供 UI 跟使用者互动、储存所有设定、定期去检查 Repository 的更新,当它发现有变更时,就会把要做的任务放到 Queue 里。TeamCity 的 Agent 就是 Worker 的概念,这些 Agent 会等待 Server 配发任务给它执行。换言之,真正在执行 Build 的是 Agent。当 Agent 完成任务时,会把执行任务的 Log 及 Artifact 回传给 Server 储存起来。

这样的设计有几个好处:

  1. 架构上分工明确,要扩充时也更具弹性
  2. 当建置工作量增加而造成等待时间变长时,只要增加更多的 Agent 即可消化更多的任务
  3. 可依据专案建置的需求准备特殊能力的 Agent,比方说要建置 iOS App 时,可以在一台 macOS 上安装 Build Agent,TeamCity Server 就会把该任务指派给有建置 iOS 能力的 Agent 执行

不论您是使用软件包或是 Docker 安装 TeamCity,预设只会启动 TeamCity Server 及 1 个 Build Agent。若想要提升消化工作的效率,可以安装更多 Build Agent 来加速。今天就来跟大家介绍如何加装更多的 Build Agent 来加快消化建置任务的速度。

取得 Build Agent 安装档

首先点选 TeamCity 画面上的 Agent 连结,进到 Agent 设定页,接着点选 Install agent 的按钮,选择其中一个版本下载安装档。

本文将以 Minimal ZIP file distribution 的版本示范安装及启动流程。

安装/设定 Build Agent

将上一步下载到的 buildAgent.zip 压缩档放到目标机器(比方说放到一台 Linux 主机)上的安装位置(比方说 /opt 底下),然後将 Build Agent 资料夹里的 conf/buildAgent.dist.properties 重新命名成 conf/buildAgent.properties

用文字编辑器打开 buildAgent.properties,修改里面的 serverUrl 成 TeamCity 的路径(应该已经预先设定好,没有的话再手动改),以及在 name 栏位设定 Build Agent 的名字(本文示范使用 myBuildAgent1),完成後存档关闭。

启动/关闭 Build Agent

接着用随附的控制脚本启动 Build Agent:

$ ./<AGENT_DIRECTORY>\bin\agent.sh start

Build Agent 启动後会自动与 Server 连线,完成後就可以在 TeamCity 的 Agent 页面看到新增的 Build Agent。在导览列上的 Agent 数字也会增加。

若要关闭 Build Agent,一样使用随附的控制脚本:

$ ./<AGENT_DIRECTORY>\bin\agent.sh stop

依照以上的步骤,就能在 TeamCity 上面增加更多的 Build Agent,加快建置专案任务的消化速度喔!

贴心提醒

  1. TeamCity 的 Build Agent 也是用 Java/Kotlin 写的,在安装前别忘了准备 JDK 8 的执行环境喔!或是改用 Docker 封装好的版本。
  2. TeamCity 的免费额度支援 3 个 Build Agent,可以好好利用!

最佳实践

本文示范的方式是在同一台机器上同时安装 TeamCity Server 及 Build Agent,不过请注意这 并非最佳实践 喔!比较好的作法是用独立的一台机器当 TeamCity Server,然後视团队需求准备足够数量及对应能力的 Build Agent,才能在安全性、执行任务效率及 HA 上有绝佳的表现喔!

笔者内心话:想偷懒的话,用 TeamCity Cloud 就是最佳解啦!

参考资料


<<:  如何把Spotify搜寻框加到自己网站?

>>:  Day 11 - BOM (Browser Object Model)

Day05_客倌~要不要来一块小叮当的翻译蒟蒻XD"

阿~今天的笔记,真心觉得,给我来一口翻译蒟蒻吧,很多硬梆邦的东西,记不起来XD" ▉条文是...

Flutter体验 Day 29-flame Collidable

flame Collidable 有开发过游戏的人应该都有听过碰撞侦测这名词,程序使用碰撞侦测的演算...

[Day 12] 从 tensorflow.keras 开始的 MobileNet 生活

0. 进度条 模型 进度 VGG Net 完成 ResNet 完成 DensNet 完成 Mobil...

JS 陈述式 v.s 表达式 DAY51

陈述式 v.s 表达式 陈述式 JS 的语句类型,用於命令执行指定的一系列操作 最大特徵是不会回传结...

[Day1] Reactive Programming 简介与前言

Reactive Programming 序 两年前在JCConf 2019,欣赏了Josh Lon...