本篇教程主要講解基於容器服務搭建TeamCity服務,並且完成內部項目的CI流程配置。教程中也分享了一個簡單的CI、CD流程,僅作探討。不過由於篇幅有限,完整的DevOps,我們后續獨立探討。
為了降低容器的使用門檻以及便於大家將容器技術應用於開發和實踐,當前教程大部分線上實踐結合TKE(騰訊雲容器服務)來進行講解和實踐。當本系列內容講解完成后,筆者將再單獨講解Kubernetes(k8s)。
最后,長沙技術社區第一次線下交流會將在2019年3月10日下午2點開始,有興趣的朋友可以參與交流。名額有限,詳見《長沙.NET技術社區活動通知》。
目錄
-
使用TeamCity來完成內部CI、CD流程1
-
一個簡單的CI、CD流程1
-
關於TeamCity2
-
官方鏡像4
-
使用騰訊雲容器服務(TKV)搭建和托管TeamCity4
-
創建TeamCity Server容器服務4
-
創建Teamcity Agent代理服務7
-
連接和配置Agent9
-
創建項目以及配置CI10
使用TeamCity來完成內部CI、CD流程
本篇教程主要講解基於容器服務搭建TeamCity服務,並且完成內部項目的CI流程配置。至於完整的DevOps,我們后續獨立探討。
一個簡單的CI、CD流程
以下分享一個簡單的CI、CD流程(僅供參考):
注意
本流程需要使用git進行代碼版本管理,推薦使用TFS搭建自己的代碼版本庫。自動部署推薦使用騰訊雲鏡像觸發器實現,此步驟也可以使用腳本實現,如果是普通的.NET代碼,推薦編寫webdeploy命令腳本來完成自動部署。通知推薦大家使用釘釘機器人。
本流程僅作參考,后續筆者會獨立一篇來講解整個DevOps流程,以及項目(產品)渠道消息集成這塊,這里僅作拋磚引玉,同時大家也可以更易於理解,容器技術大大簡化CI、CD流程!
關於TeamCity
TeamCity是一款成熟的CI服務器,來自JetBrains公司。JetBrains已經在軟件開發世界中建立了權威,他們的工具如WebStorm和ReSharper正被全球的開發者所使用。
TeamCity在它的免費版本中提供了所有功能,但僅限於20個配置和3個構建代理。額外的構建代理和構建配置需要購買,你可以在這里找到價格。
TeamCity安裝后即可使用,可以在多種不同的平台上工作,並支持各種各樣的工具和框架。 能夠支持JetBrains和第三方公司開發的公開的插件。盡管是基於Java的解決方案,TeamCity在眾多的持續集成工具中提供了最好的.NET支持。TeamCity也有多種企業軟件包,可以按所需代理的數量進行擴展。
TeamCity分為專業版和企業版,專業版免費,支持100個構建配置,允許完全訪問產品的所有功能,足夠小團隊小公司來完成自己的CI流程的構建了。
下載地址:
https://www.jetbrains.com/teamcity/download/#section=section-get
TeamCity可以通過執行文件安裝,也可以在Docker容器中運行。本篇教程主要講解通過騰訊雲容器服務(TKV)來搭建和托管TeamCity環境。
官方鏡像
官方鏡像地址:
https://hub.docker.com/r/jetbrains/teamcity-server
如果小伙伴們需要在本地測試,也可以使用以下命令在本地運行:
docker run -it --name teamcity-server-instance \
-v <path to data directory>:/data/teamcity_server/datadir \
-v <path to logs directory>:/opt/teamcity/logs \
-p <port on host>:8111 \
jetbrains/teamcity-server
此命令需要映射對應的數據目錄和日志目錄以及端口。鏡像名稱為jetbrains/teamcity-server。
在本地運行,我們主要用於學習和測試,接下來我們還是回到主題,繼續搭建線上的TeamCity服務。
使用騰訊雲容器服務(TKE)搭建和托管TeamCity
創建TeamCity Server容器服務
在TKE創建服務的部分細節在之前的教程中我們講述過,這里主要講解一些主要的點。由於TeamCity這邊需要使用到數據卷做持久化,那么在TKE中,我們如果實現容器服務的持久化呢?
騰訊雲容器服務是基於 Kubernetes 編排系統搭建的,創建服務時可以設置以下類型的數據卷:
· 本地硬盤:將容器所在宿主機的文件目錄掛載到容器的指定路徑中(對應Kubernetes的HostPath), 也可以不填寫源路徑(對應Kubernetes的EmptyDir),不填寫時將分配主機的臨時目錄掛載到容器的掛載點,指定源路徑的本地硬盤數據卷適用於將數據持久化存儲到容器所在宿主機,EmptyDir適用於容器的臨時存儲。
· 雲硬盤:騰訊雲基於CBS擴展的Kubernetes的塊存儲插件。可以指定一塊騰訊雲的 CBS 雲硬盤掛載到容器的某一路徑下,容器的遷移,雲硬盤會跟隨遷移,使用雲硬盤數據卷適用於數據的持久化保存,可用於Mysql等有狀態服務,設置雲硬盤數據卷的服務,實例數量最大為 1。
· NFS盤:可以使用騰訊雲的文件存儲CFS, 也可使用自建的文件存儲NFS, 只需要填寫NFS路徑,使用NFS數據卷適用於多讀多寫的持久化存儲,適用於大數據分析、媒體處理、內容管理等場景。
· 配置項:將配置項中指定 key 映射到容器中(key作為文件名),使用配置項數據卷主要用於業務配置文件的掛載,可以用於掛載配置文件到指定容器目錄。
使用數據卷時有以下注意事項:
1.創建數據卷后需要設置容器的掛載點。
2.同一個服務下數據卷的名稱和容器設置的掛載點不能重復。
3.本地硬盤數據卷源路徑為空時,系統分配臨時目錄在
/var/lib/kubelet/pods/pod_name/volumes/kubernetes.io~empty-dir.
使用臨時的數據卷的生命周期與實例的生命周期保持一致。
4.數據卷掛載需要設置權限,默認設置為讀寫權限。
了解了這些,接下來的實踐我們使用本地硬盤和雲硬盤來實現我們雲端的數據持久化。
創建TeamCity Server容器服務主要分為以下幾個步驟:
1. 創建服務,設置鏡像
鏡像名稱為:jetbrains/teamcity-server,如下圖所示(注意是直接輸入):
2. 配置數據卷。
數據卷我們這里選擇雲硬盤,其中“vol”為硬盤命名:
這里我們需要在雲硬盤控制台添加好相應的雲硬盤:
3. 添加掛載點,以保存數據和日志內容,如下圖所示:
其中“vol”為剛創建的數據卷名稱,中間部分為容器內的路徑,右側部分為設置該路徑的權限。
4. 配置端口映射
TeamCity Server的默認端口為8111,我們可以這么來配置:
如果我們需要將8111映射為80端口,我們可以這么配置:
5. 點擊【創建服務】按鈕,創建服務
創建完成后,可以在服務列表看到我們所創建的服務:
注意
至此,TeamCity Server服務創建完成。剛才我們在服務訪問方式中選擇了【提供公網訪問】,TKV自動為我們創建了一個負載均衡實例,以提供外網訪問。這時,我們使用IP即可訪問對應的服務。
如剛創建的:
創建Teamcity Agent代理服務
Server創建好了,我們還需要創建TeamCity Build Agent來為我們構建代碼。也就是構建過程還得由專門的構建代理來提供服務。
TeamCity Build Agent官方鏡像地址如下:
https://hub.docker.com/r/jetbrains/teamcity-agent/
我們可以通過以下命令在本地跑起來:
docker run -it -e SERVER_URL="<url to TeamCity server>" \
-v <path to agent config folder>:/data/teamcity_agent/conf \
jetbrains/teamcity-agent
跑起來之后,我們需要在Server的管理中心來連接和授權。
配置特權級容器
值得注意的是,如果我們使用TeamCity的代理來構建Docker容器,那么我們勢必需要使用到主機的Docker守護進程,這時,我們可以使用特權級容器來解決這個問題,如下面命令所示:
docker run -it -e SERVER_URL="<url to TeamCity server>" \
-v <path to agent config folder>:/data/teamcity_agent/conf \
-v docker_volumes:/var/lib/docker \
--privileged -e DOCKER_IN_DOCKER=start \
jetbrains/teamcity-agent
使用privileged參數,容器內的root才擁有真正的root權限,並且Docker將允許訪問主機上的所有設備,甚至允許我們在容器中啟動Docker容器。接下來在騰訊雲TKV這邊,我們也需要使用到特權級容器,以便於我們使用TeamCity來構建Docker容器鏡像,以及推送鏡像。
TeamCity Agent基礎鏡像包括
由於在接下來的步驟中需要使用到Agent來構建代碼,因此我們需要知道其包含的內容:
· ubuntu:bionic(Linux)
· microsoft / windowsservercore或microsoft / nanoserver(Windows)
· AdoptOpenJDK 8,JDK 64位
· git
· mercurial(除了nanoserver鏡像)
· .NET Core SDK(可以構建.NET Core!!)
· MSBuild工具(基於windowsservercore的鏡像)
· docker-engine(Linux)
創建Teamcity Agent代理服務
創建TeamCity Agent容器服務主要分為以下幾個步驟:
1. 創建服務,設置鏡像
鏡像名稱為:jetbrains/teamcity-agent,如下圖所示(注意是直接輸入):
2. 配置數據卷。
數據卷我們這里選擇使用本地硬盤,主要是為了講解數據卷的不同類型:
使用本地硬盤有兩種形式:
· 指定源路徑(HostPath),將容器所在宿主機的文件目錄掛載到容器指定的掛載點中,如容器需要訪問/etc/hosts則可以使用HostPath映射/etc/hosts等場景。
· 空的源路徑(EmptyDir),用於容器的數據的臨時存儲,如基於磁盤的排序場景等。
也就是我們留空也可以。
3. 添加掛載點,以保存數據,如下圖所示:
其中“vol”、“dockervol”為剛創建的數據卷名稱,中間部分為容器內的路徑,右側部分為設置該路徑的權限。
4. 配置環境變量
如下圖所示,我們還需配置以下環境變量:
AGENT_NAME |
代理實例名稱(授權時會顯示) |
SERVER_URL |
服務端UI |
DOCKER_IN_DOCKER |
Docker內部啟動Docker |
5. 配置特權級容器
此選項在TKV容器服務的高級設置中,如圖所示:
6. 配置端口映射
這里我們無需提供公網訪問,因此選擇【僅在集群內訪問】即可。端口映射這塊,Agent的默認端口為9090。
7. 點擊【創建服務】按鈕,創建服務
創建完成后,可以在服務列表看到我們所創建的服務:
連接和配置Agent
Server和Agent配置完成后,我們可以訪問Server站點,完成初始化工作。然后,我們需要配置好Agent。
打開Agents界面,可以看到我們剛創建的Agent:
這時,我們需要先進行授權,也就是打開【Unauthorized】面板,點擊【Authorize】按鈕:
授權成功后,我們就可以看見已連接的代理了:
接下來,才可以開始搞事情。
創建項目以及配置CI
項目創建界面如下所示:
推薦大家使用git來管理自己的代碼。這里我們可以添加我們的代碼倉庫地址,如果是私有庫,還需要配置賬號密碼。簡單步驟我們這里略過,然后接下來TeamCity會掃描源代碼,來提供推薦的構建步驟:
這里我們可以勾選我們需要的步驟,或者自己來創建符合自己需要的步驟。
注意:使用Docker托管的Agent服務鏡像並不支持PowellShell。如果選擇了不支持的步驟,將無法使用剛才我們創建的Agent執行代碼構建。
這里,我們可以添加幾個簡單的步驟:
步驟1、2使用Docker構建Docker鏡像,相關參考界面如下所示:
步驟3則使用CMD命令發送釘釘消息,以通知團隊:
通知結果如下圖所示:
接下來,我們就可以配置觸發器、失敗條件判斷以及參數等其他配置。整個構建步驟配置起來非常簡單,大家也可以結合我之前的CI教程來完善配置,比如添加對鏡像推送的步驟等。
完成之后,我們就可以嘗試着運行構建,並且查看構建歷史:
整個構建詳情我們也可以直接查看:
包括構建日志:
在這個過程中,可能大家需要用到一些構建參數、環境變量等等,我們可以打開對應agent的Agent Parameters面板來查看詳情: