本篇教程主要講解基於容器服務搭建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
-v
-p
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
jetbrains/teamcity-agent
跑起來之後,我們需要在Server的管理中心來連線和授權。
配置特權級容器
值得註意的是,如果我們使用TeamCity的代理來構建Docker容器,那麼我們勢必需要使用到主機的Docker守護行程,這時,我們可以使用特權級容器來解決這個問題,如下麵命令所示:
docker run -it -e SERVER_URL=”
-v
-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面板來檢視詳情:
往期文章一覽
如果喜歡作者的文章,請關註“magiccodes”訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊資訊科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
QQ群:
程式設計交流群<85318032>
產品交流群<897857351>
長沙線下技術社群已經建立,有興趣者可以透過客服加群。接下來,我們會定期組織一些線下技術交流分享會,以饗大家。