teamcity使用

第一部分:TeamCity 基礎(chǔ)入門

1. 什么是 CI/CD?

在介紹 TeamCity 之前,我們先快速回顧一下 CI/CD 的概念。

  • CI (Continuous Integration, 持續(xù)集成):開發(fā)人員頻繁地將代碼集成到主干。每次集成都會通過自動化的構(gòu)建和測試來驗證,從而盡早發(fā)現(xiàn)問題。
  • CD (Continuous Delivery/Deployment, 持續(xù)交付/部署):在持續(xù)集成的基礎(chǔ)上,將通過所有測試的代碼自動部署到類生產(chǎn)環(huán)境或生產(chǎn)環(huán)境。

核心目標:讓軟件的構(gòu)建、測試和發(fā)布過程變得更快、更可靠、更自動化。

2. TeamCity 是什么?

TeamCity 是由 JetBrains 公司開發(fā)的一款功能強大的持續(xù)集成和持續(xù)交付服務(wù)器。簡單來說,它就是一個“自動化管家”,可以 7x24
小時監(jiān)控你的代碼倉庫,一旦有代碼變更,它就會自動執(zhí)行你預(yù)設(shè)好的一系列指令(比如編譯、運行單元測試、打包、部署等)。

3. TeamCity 的核心概念

  • Project (項目):一個項目是構(gòu)建配置的集合,通常對應(yīng)一個軟件項目或一個團隊。項目可以嵌套,形成層級結(jié)構(gòu)。
  • Build Configuration (構(gòu)建配置):一套完整的構(gòu)建指令,告訴 TeamCity “如何做一件事”。它包含了從哪里獲取代碼、執(zhí)行哪些步驟、何時觸發(fā)等所有信息。
  • VCS Root (版本控制系統(tǒng)根):定義了如何連接到一個代碼倉庫,比如 Git、SVN 的地址和認證信息。
  • Build Step (構(gòu)建步驟):構(gòu)建過程中具體執(zhí)行的單個操作,比如“執(zhí)行一個腳本”、“運行 .NET Build”、“構(gòu)建一個 Docker 鏡像”等。一個構(gòu)建配置可以包含多個步驟。
  • Trigger (觸發(fā)器):定義了何時自動開始一個新的構(gòu)建。最常用的是 VCS Trigger,即代碼倉庫一有變更就觸發(fā)。
  • Agent (構(gòu)建代理):真正執(zhí)行構(gòu)建任務(wù)的機器。一個 TeamCity Server 可以管理多個 Agent。

4. teamcity與jenkins比較

特性 Jenkins TeamCity
開源與成本 完全開源免費479 提供免費版(功能受限,如構(gòu)建代理和配置數(shù)限制)479,商業(yè)版需付費479
維護與設(shè)置 初始設(shè)置簡單,但維護成本較高(需管理大量插件及其兼容性)16 開箱即用,設(shè)置和維護更簡單,維護成本較低136
插件與擴展 插件生態(tài)系統(tǒng)非常豐富(超過1400個插件)79,高度可定制23 插件數(shù)量較少(約300多個)79,但許多核心功能(如Git、Docker)已內(nèi)置156,減少對插件的依賴
用戶界面 功能強大但界面相對傳統(tǒng),學(xué)習(xí)曲線可能較陡79 現(xiàn)代化且直觀的UI,用戶體驗較好,易于上手136
配置方式 主要通過Groovy腳本(Jenkinsfile)進行管道配置156 支持通過UI配置基于Kotlin的DSL(類型安全,IDE支持好)156,YAML配置也在逐步支持16
安全特性 作為開源工具,其安全特性可能相對較弱,且安全更新依賴社區(qū)47 作為商業(yè)工具,通常提供更好的安全特性和更及時的專業(yè)支持4710
社區(qū)支持 擁有龐大活躍的開源社區(qū),資源豐富379 社區(qū)規(guī)模相對較小,但由JetBrains提供專業(yè)的技術(shù)支持137
分布式構(gòu)建 支持分布式構(gòu)建37 同樣支持分布式構(gòu)建37,并能與一些工具集成加速構(gòu)建過程79

第二部分:我們的 TeamCity 實戰(zhàn)分享

接下來,我將結(jié)合我們目前的用法,介紹一些具體的實踐經(jīng)驗。

1. 多項目管理

在我們的 TeamCity 中,大家可以看到我們創(chuàng)建了多個頂層項目,分別對應(yīng)不同的產(chǎn)品線或大的業(yè)務(wù)模塊。

  • 層級結(jié)構(gòu):在每個頂層項目下,我們又根據(jù)具體的服務(wù)或組件創(chuàng)建了子項目。這樣做的好處是權(quán)限隔離和配置復(fù)用。父項目的配置(如 VCS Root)可以被子項目繼承和使用。
image.png

2. Git 倉庫的配置與優(yōu)化

我們所有的代碼都托管在 Git 上。在 TeamCity 中,我們通過配置 VCS Root 來連接這些倉庫。

核心技巧:多任務(wù)共享 Git 倉庫(減少 Clone)

這是一個非常重要的性能優(yōu)化點。我們有很多個構(gòu)建配置,它們可能都依賴同一個龐大的代碼倉庫。如果每個任務(wù)都從頭 git clone 一遍,會非常耗時且占用大量磁盤空間。

我們的解決方案是:

  1. 在父項目級別定義一個 VCS Root:我們將公共的代碼倉庫配置在頂層的父項目中。
  2. 所有子構(gòu)建配置共享這個 VCS Root:在創(chuàng)建下游的構(gòu)建配置時,我們直接“附加”這個已經(jīng)定義好的 VCS Root,而不是新建一個。
  3. 統(tǒng)一的檢出目錄 (Checkout Directory):TeamCity Agent 會足夠智能,它會發(fā)現(xiàn)這些不同的構(gòu)建任務(wù)都指向同一個 Git 倉庫。因此,它只會在 Agent 上克隆一次代碼。后續(xù)的構(gòu)建任務(wù)都只會執(zhí)行 git fetch 或 git pull 來更新代碼,速度極快。

這個簡單的配置,為我們每次構(gòu)建節(jié)省了大量時間。

image.png

3. 靈活的構(gòu)建步驟 (Build Steps)

我們的構(gòu)建過程不僅僅是簡單的 dotnet build。很多時候需要執(zhí)行清理、版本號更新、配置文件替換等復(fù)雜邏輯。

我們主要通過“執(zhí)行腳本”來實現(xiàn)這種靈活性:

  • Runner 類型:我們最常用的 Build Step Runner 是 Command Line。
  • 執(zhí)行腳本:我們將復(fù)雜的構(gòu)建邏輯編寫成獨立的腳本文件(如 build.sh 或 build.bat),并將其也存放在代碼倉庫中。
  • Build Step 配置:在 TeamCity 的構(gòu)建步驟中,我們只需要一行簡單的命令,如 bash build.sh,就可以執(zhí)行所有預(yù)設(shè)好的復(fù)雜邏輯。

這樣做的好處:

  • 構(gòu)建邏輯版本化:構(gòu)建腳本和代碼一起被版本控制,修改有跡可循。
  • 本地可復(fù)現(xiàn):任何開發(fā)人員都可以在本地執(zhí)行同樣的腳本,確保了本地環(huán)境和 CI 環(huán)境的一致性。
  • 關(guān)注點分離:TeamCity 負責(zé)“何時做”和“在哪做”,而腳本負責(zé)“具體怎么做”。
image.png

4. 構(gòu)建目錄重定義

image.png
image.png

5. trigger使用

image.png
按周期定時觸發(fā)
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="青島紅創(chuàng)-Batch" />
<meta name="generator" content="Org Mode" />
<link rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/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

# 將原文件內(nèi)容追加到臨時文件后
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"

# 讀取文件內(nèi)容并去掉首尾的雙引號
file_content=$(sed 's/^"\(.*\)"$/\1/' "$file_path")

# 拼接字符串
combined_content="${file_content}\n [點擊鏈接查看報告詳情](${report_link})"

# 打印拼接后的內(nèi)容
echo -e "$combined_content"


# 發(fā)送消息到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單元測試結(jié)果) \n ${combined_content}  \"}
}"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容