teamcity使用

第一部分:TeamCity 基础入门

1. 什么是 CI/CD?

在介绍 TeamCity 之前,我们先快速回顾一下 CI/CD 的概念。

  • CI (Continuous Integration, 持续集成):开发人员频繁地将代码集成到主干。每次集成都会通过自动化的构建和测试来验证,从而尽早发现问题。
  • CD (Continuous Delivery/Deployment, 持续交付/部署):在持续集成的基础上,将通过所有测试的代码自动部署到类生产环境或生产环境。

核心目标:让软件的构建、测试和发布过程变得更快、更可靠、更自动化。

2. TeamCity 是什么?

TeamCity 是由 JetBrains 公司开发的一款功能强大的持续集成和持续交付服务器。简单来说,它就是一个“自动化管家”,可以 7x24
小时监控你的代码仓库,一旦有代码变更,它就会自动执行你预设好的一系列指令(比如编译、运行单元测试、打包、部署等)。

3. TeamCity 的核心概念

  • Project (项目):一个项目是构建配置的集合,通常对应一个软件项目或一个团队。项目可以嵌套,形成层级结构。
  • Build Configuration (构建配置):一套完整的构建指令,告诉 TeamCity “如何做一件事”。它包含了从哪里获取代码、执行哪些步骤、何时触发等所有信息。
  • VCS Root (版本控制系统根):定义了如何连接到一个代码仓库,比如 Git、SVN 的地址和认证信息。
  • Build Step (构建步骤):构建过程中具体执行的单个操作,比如“执行一个脚本”、“运行 .NET Build”、“构建一个 Docker 镜像”等。一个构建配置可以包含多个步骤。
  • Trigger (触发器):定义了何时自动开始一个新的构建。最常用的是 VCS Trigger,即代码仓库一有变更就触发。
  • Agent (构建代理):真正执行构建任务的机器。一个 TeamCity Server 可以管理多个 Agent。

4. teamcity与jenkins比较

特性 Jenkins TeamCity
开源与成本 完全开源免费479 提供免费版(功能受限,如构建代理和配置数限制)479,商业版需付费479
维护与设置 初始设置简单,但维护成本较高(需管理大量插件及其兼容性)16 开箱即用,设置和维护更简单,维护成本较低136
插件与扩展 插件生态系统非常丰富(超过1400个插件)79,高度可定制23 插件数量较少(约300多个)79,但许多核心功能(如Git、Docker)已内置156,减少对插件的依赖
用户界面 功能强大但界面相对传统,学习曲线可能较陡79 现代化且直观的UI,用户体验较好,易于上手136
配置方式 主要通过Groovy脚本(Jenkinsfile)进行管道配置156 支持通过UI配置基于Kotlin的DSL(类型安全,IDE支持好)156,YAML配置也在逐步支持16
安全特性 作为开源工具,其安全特性可能相对较弱,且安全更新依赖社区47 作为商业工具,通常提供更好的安全特性和更及时的专业支持4710
社区支持 拥有庞大活跃的开源社区,资源丰富379 社区规模相对较小,但由JetBrains提供专业的技术支持137
分布式构建 支持分布式构建37 同样支持分布式构建37,并能与一些工具集成加速构建过程79

第二部分:我们的 TeamCity 实战分享

接下来,我将结合我们目前的用法,介绍一些具体的实践经验。

1. 多项目管理

在我们的 TeamCity 中,大家可以看到我们创建了多个顶层项目,分别对应不同的产品线或大的业务模块。

  • 层级结构:在每个顶层项目下,我们又根据具体的服务或组件创建了子项目。这样做的好处是权限隔离和配置复用。父项目的配置(如 VCS Root)可以被子项目继承和使用。
image.png

2. Git 仓库的配置与优化

我们所有的代码都托管在 Git 上。在 TeamCity 中,我们通过配置 VCS Root 来连接这些仓库。

核心技巧:多任务共享 Git 仓库(减少 Clone)

这是一个非常重要的性能优化点。我们有很多个构建配置,它们可能都依赖同一个庞大的代码仓库。如果每个任务都从头 git clone 一遍,会非常耗时且占用大量磁盘空间。

我们的解决方案是:

  1. 在父项目级别定义一个 VCS Root:我们将公共的代码仓库配置在顶层的父项目中。
  2. 所有子构建配置共享这个 VCS Root:在创建下游的构建配置时,我们直接“附加”这个已经定义好的 VCS Root,而不是新建一个。
  3. 统一的检出目录 (Checkout Directory):TeamCity Agent 会足够智能,它会发现这些不同的构建任务都指向同一个 Git 仓库。因此,它只会在 Agent 上克隆一次代码。后续的构建任务都只会执行 git fetch 或 git pull 来更新代码,速度极快。

这个简单的配置,为我们每次构建节省了大量时间。

image.png

3. 灵活的构建步骤 (Build Steps)

我们的构建过程不仅仅是简单的 dotnet build。很多时候需要执行清理、版本号更新、配置文件替换等复杂逻辑。

我们主要通过“执行脚本”来实现这种灵活性:

  • Runner 类型:我们最常用的 Build Step Runner 是 Command Line。
  • 执行脚本:我们将复杂的构建逻辑编写成独立的脚本文件(如 build.sh 或 build.bat),并将其也存放在代码仓库中。
  • Build Step 配置:在 TeamCity 的构建步骤中,我们只需要一行简单的命令,如 bash build.sh,就可以执行所有预设好的复杂逻辑。

这样做的好处:

  • 构建逻辑版本化:构建脚本和代码一起被版本控制,修改有迹可循。
  • 本地可复现:任何开发人员都可以在本地执行同样的脚本,确保了本地环境和 CI 环境的一致性。
  • 关注点分离:TeamCity 负责“何时做”和“在哪做”,而脚本负责“具体怎么做”。
image.png

4. 构建目录重定义

image.png
image.png

5. trigger使用

image.png
按周期定时触发
image.png
image.png

其他

  1. 在mac上
    命令行里获取时间,用时间做变量
#!/bin/bash
ls -l target
datetime=`date +'%%Y%%m%%d%%H%%M%%S'`
reportname=batch-api-test-rpt-$datetime.zip
emacs -batch -l  ~/.emacs.d/elpa-29.2/htmlize-20210825.2150/htmlize.el target/Batch测试报告.org -f org-html-export-to-html --kill

# 切换到目标目录
cd target || { echo "Directory not found: chutian-front/target"; exit 1; }

# zip -r $reportname *
mv Batch测试报告.html index.html
report_link="http://192.168.0.134:8110/batch/api/$datetime/index.html"

html_head='
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Batch-API测试报告</title>
<meta name="author" content="青岛红创-Batch" />
<meta name="generator" content="Org Mode" />
<link rel="stylesheet" type="text/css" href="https://hcapplet.3vyd.com/org-theme/src/readtheorg_theme/css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="https://hcapplet.3vyd.com/org-theme/src/readtheorg_theme/css/readtheorg.css"/>
<script src="https://hcapplet.3vyd.com/org-theme/src/lib/js/jquery.min.js"></script>
<script src="https://hcapplet.3vyd.com/org-theme/src/lib/js/bootstrap.min.js"></script>
<script type="text/javascript" src="https://hcapplet.3vyd.com/org-theme/src/lib/js/jquery.stickytableheaders.min.js"></script>
<script type="text/javascript" src="https://hcapplet.3vyd.com/org-theme/src/readtheorg_theme/js/readtheorg.js"></script>
</head>
'

# 将新文本写入临时文件
echo "$html_head" > temp_file.html

# 将原文件内容追加到临时文件后
cat index.html >> temp_file.html

# 用临时文件替换原文件
mv temp_file.html index.html

mkdir -p /Users/a123/Downloads/test-report/batch/api/$datetime
cp -r * /Users/a123/Downloads/test-report/batch/api/$datetime/

# 定义文件路径
file_path="ding-msg.edn"

# 读取文件内容并去掉首尾的双引号
file_content=$(sed 's/^"\(.*\)"$/\1/' "$file_path")

# 拼接字符串
combined_content="${file_content}\n [点击链接查看报告详情](${report_link})"

# 打印拼接后的内容
echo -e "$combined_content"


# 发送消息到DingTalk
curl --location 'https://oapi.dingtalk.com/robot/send?access_token=43d9635c7a20220071dbf0cfee918f1baddaf08039719bd14190b9db0996450f' \
--header 'Content-Type: application/json' \
--data "{
    \"msgtype\": \"markdown\",
    \"at\": {\"isAtAll\": true},
    \"markdown\": {\"title\": \"楚天Batch API测试报告\",
                   \"text\": \"## 楚天Batch(API单元测试结果) \n ${combined_content}  \"}
}"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容