歡迎光臨
每天分享高質量文章

Docker最全教程之使用TeamCity來完成內部CI、CD流程(十七)

本篇教程主要講解基於容器服務搭建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 :/data/teamcity_server/datadir \

    -v :/opt/teamcity/logs  \

    -p :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=””  \

    -v :/data/teamcity_agent/conf  \      

jetbrains/teamcity-agent

跑起來之後,我們需要在Server的管理中心來連接和授權。


配置特權級容器

值得註意的是,如果我們使用TeamCity的代理來構建Docker容器,那麼我們勢必需要使用到主機的Docker守護行程,這時,我們可以使用特權級容器來解決這個問題,如下麵命令所示:

docker run -it -e SERVER_URL=””  \

    -v :/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面板來查看詳情:

 

往期文章一覽

Docker最全教程——從理論到實戰(一)

Docker最全教程——從理論到實戰(二)

Docker最全教程——從理論到實戰(三)

Docker最全教程——從理論到實戰(四)

Docker最全教程——從理論到實戰(五)

Docker最全教程——從理論到實戰(六)

Docker最全教程——從理論到實戰(七)

Docker最全教程——從理論到實戰(八)    

Docker最全教程——從理論到實戰(九)

Docker最全教程之使用Tencent Hub來完成CI(十)

Docker最全教程——資料庫容器化(十一)
Docker最全教程——資料庫容器化之持久儲存資料(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜實戰(十四)

Docker最全教程之Ubuntu下安裝Docker(十五)

Docker最全教程之樹莓派和Docker(十六)



轉載是一種動力 分享是一種美德

如果喜歡作者的文章,請關註“magiccodes”訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

QQ群:

編程交流群<85318032> 

產品交流群<897857351>

長沙線下技術社區已經創建,有興趣者可以通過客服加群。接下來,我們會定期組織一些線下技術交流分享會,以饗大家。