Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)
本篇教程主要講解基于容器服務(wù)搭建TeamCity服務(wù),并且完成內(nèi)部項目的CI流程配置。教程中也分享了一個簡單的CI、CD流程,僅作探討。不過由于篇幅有限,完整的DevOps,我們后續(xù)獨立探討。??
為了降低容器的使用門檻以及便于大家將容器技術(shù)應(yīng)用于開發(fā)和實踐,當(dāng)前教程大部分線上實踐結(jié)合TKE(騰訊云容器服務(wù))來進行講解和實踐。當(dāng)本系列內(nèi)容講解完成后,筆者將再單獨講解Kubernetes(k8s)。
最后,長沙技術(shù)社區(qū)第一次線下交流會將在2019年3月10日下午2點開始,有興趣的朋友可以參與交流。名額有限,詳見《長沙.NET技術(shù)社區(qū)活動通知》。
目錄??
使用TeamCity來完成內(nèi)部CI、CD流程1
一個簡單的CI、CD流程1
關(guān)于TeamCity2
官方鏡像4
使用騰訊云容器服務(wù)(TKV)搭建和托管TeamCity4
創(chuàng)建TeamCity Server容器服務(wù)4
創(chuàng)建Teamcity Agent代理服務(wù)7
連接和配置Agent9
創(chuàng)建項目以及配置CI10
使用TeamCity來完成內(nèi)部CI、CD流程?
?本篇教程主要講解基于容器服務(wù)搭建TeamCity服務(wù),并且完成內(nèi)部項目的CI流程配置。至于完整的DevOps,我們后續(xù)獨立探討。
一個簡單的CI、CD流程
??以下分享一個簡單的CI、CD流程(僅供參考):
?
注意
本流程需要使用git進行代碼版本管理,推薦使用TFS搭建自己的代碼版本庫。自動部署推薦使用騰訊云鏡像觸發(fā)器實現(xiàn),此步驟也可以使用腳本實現(xiàn),如果是普通的.NET代碼,推薦編寫webdeploy命令腳本來完成自動部署。通知推薦大家使用釘釘機器人。
本流程僅作參考,后續(xù)筆者會獨立一篇來講解整個DevOps流程,以及項目(產(chǎn)品)渠道消息集成這塊,這里僅作拋磚引玉,同時大家也可以更易于理解,容器技術(shù)大大簡化CI、CD流程!
關(guān)于TeamCity
TeamCity是一款成熟的CI服務(wù)器,來自JetBrains公司。JetBrains已經(jīng)在軟件開發(fā)世界中建立了權(quán)威,他們的工具如WebStorm和ReSharper正被全球的開發(fā)者所使用。
TeamCity在它的免費版本中提供了所有功能,但僅限于20個配置和3個構(gòu)建代理。額外的構(gòu)建代理和構(gòu)建配置需要購買,你可以在這里找到價格。
TeamCity安裝后即可使用,可以在多種不同的平臺上工作,并支持各種各樣的工具和框架。 能夠支持JetBrains和第三方公司開發(fā)的公開的插件。盡管是基于Java的解決方案,TeamCity在眾多的持續(xù)集成工具中提供了最好的.NET支持。TeamCity也有多種企業(yè)軟件包,可以按所需代理的數(shù)量進行擴展。
TeamCity分為專業(yè)版和企業(yè)版,專業(yè)版免費,支持100個構(gòu)建配置,允許完全訪問產(chǎn)品的所有功能,足夠小團隊小公司來完成自己的CI流程的構(gòu)建了。
?
下載地址:
https://www.jetbrains.com/teamcity/download/#section=section-get
TeamCity可以通過執(zhí)行文件安裝,也可以在Docker容器中運行。本篇教程主要講解通過騰訊云容器服務(wù)(TKV)來搭建和托管TeamCity環(huán)境。
?
官方鏡像?
?官方鏡像地址:
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
?
此命令需要映射對應(yīng)的數(shù)據(jù)目錄和日志目錄以及端口。鏡像名稱為jetbrains/teamcity-server。
在本地運行,我們主要用于學(xué)習(xí)和測試,接下來我們還是回到主題,繼續(xù)搭建線上的TeamCity服務(wù)。
使用騰訊云容器服務(wù)(TKE)搭建和托管TeamCity??
創(chuàng)建TeamCity Server容器服務(wù)
在TKE創(chuàng)建服務(wù)的部分細節(jié)在之前的教程中我們講述過,這里主要講解一些主要的點。由于TeamCity這邊需要使用到數(shù)據(jù)卷做持久化,那么在TKE中,我們?nèi)绻麑崿F(xiàn)容器服務(wù)的持久化呢?
騰訊云容器服務(wù)是基于?Kubernetes 編排系統(tǒng)搭建的,創(chuàng)建服務(wù)時可以設(shè)置以下類型的數(shù)據(jù)卷:
·?本地硬盤:將容器所在宿主機的文件目錄掛載到容器的指定路徑中(對應(yīng)Kubernetes的HostPath), 也可以不填寫源路徑(對應(yīng)Kubernetes的EmptyDir),不填寫時將分配主機的臨時目錄掛載到容器的掛載點,指定源路徑的本地硬盤數(shù)據(jù)卷適用于將數(shù)據(jù)持久化存儲到容器所在宿主機,EmptyDir適用于容器的臨時存儲。
·?云硬盤:騰訊云基于CBS擴展的Kubernetes的塊存儲插件。可以指定一塊騰訊云的 CBS 云硬盤掛載到容器的某一路徑下,容器的遷移,云硬盤會跟隨遷移,使用云硬盤數(shù)據(jù)卷適用于數(shù)據(jù)的持久化保存,可用于Mysql等有狀態(tài)服務(wù),設(shè)置云硬盤數(shù)據(jù)卷的服務(wù),實例數(shù)量最大為 1。
·?NFS盤:可以使用騰訊云的文件存儲CFS, 也可使用自建的文件存儲NFS, 只需要填寫NFS路徑,使用NFS數(shù)據(jù)卷適用于多讀多寫的持久化存儲,適用于大數(shù)據(jù)分析、媒體處理、內(nèi)容管理等場景。
·?配置項:將配置項中指定 key 映射到容器中(key作為文件名),使用配置項數(shù)據(jù)卷主要用于業(yè)務(wù)配置文件的掛載,可以用于掛載配置文件到指定容器目錄。
?
使用數(shù)據(jù)卷時有以下注意事項:
1.創(chuàng)建數(shù)據(jù)卷后需要設(shè)置容器的掛載點。
2.同一個服務(wù)下數(shù)據(jù)卷的名稱和容器設(shè)置的掛載點不能重復(fù)。
3.本地硬盤數(shù)據(jù)卷源路徑為空時,系統(tǒng)分配臨時目錄在
/var/lib/kubelet/pods/pod_name/volumes/kubernetes.io~empty-dir.?
使用臨時的數(shù)據(jù)卷的生命周期與實例的生命周期保持一致。
4.數(shù)據(jù)卷掛載需要設(shè)置權(quán)限,默認設(shè)置為讀寫權(quán)限。
了解了這些,接下來的實踐我們使用本地硬盤和云硬盤來實現(xiàn)我們云端的數(shù)據(jù)持久化。
創(chuàng)建TeamCity?Server容器服務(wù)主要分為以下幾個步驟:
1.?創(chuàng)建服務(wù),設(shè)置鏡像
鏡像名稱為:jetbrains/teamcity-server,如下圖所示(注意是直接輸入):
2.?配置數(shù)據(jù)卷。
數(shù)據(jù)卷我們這里選擇云硬盤,其中“vol”為硬盤命名:
這里我們需要在云硬盤控制臺添加好相應(yīng)的云硬盤:
3.?添加掛載點,以保存數(shù)據(jù)和日志內(nèi)容,如下圖所示:
其中“vol”為剛創(chuàng)建的數(shù)據(jù)卷名稱,中間部分為容器內(nèi)的路徑,右側(cè)部分為設(shè)置該路徑的權(quán)限。
4.?配置端口映射
TeamCity Server的默認端口為8111,我們可以這么來配置:
?
如果我們需要將8111映射為80端口,我們可以這么配置:
5.?點擊【創(chuàng)建服務(wù)】按鈕,創(chuàng)建服務(wù)
創(chuàng)建完成后,可以在服務(wù)列表看到我們所創(chuàng)建的服務(wù):
注意
至此,TeamCity Server服務(wù)創(chuàng)建完成。剛才我們在服務(wù)訪問方式中選擇了【提供公網(wǎng)訪問】,TKV自動為我們創(chuàng)建了一個負載均衡實例,以提供外網(wǎng)訪問。這時,我們使用IP即可訪問對應(yīng)的服務(wù)。
如剛創(chuàng)建的:
?
創(chuàng)建Teamcity Agent代理服務(wù)
Server創(chuàng)建好了,我們還需要創(chuàng)建TeamCity Build?Agent來為我們構(gòu)建代碼。也就是構(gòu)建過程還得由專門的構(gòu)建代理來提供服務(wù)。
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的管理中心來連接和授權(quán)。
配置特權(quán)級容器
值得注意的是,如果我們使用TeamCity的代理來構(gòu)建Docker容器,那么我們勢必需要使用到主機的Docker守護進程,這時,我們可以使用特權(quán)級容器來解決這個問題,如下面命令所示:
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參數(shù),容器內(nèi)的root才擁有真正的root權(quán)限,并且Docker將允許訪問主機上的所有設(shè)備,甚至允許我們在容器中啟動Docker容器。接下來在騰訊云TKV這邊,我們也需要使用到特權(quán)級容器,以便于我們使用TeamCity來構(gòu)建Docker容器鏡像,以及推送鏡像。
TeamCity Agent基礎(chǔ)鏡像包括
由于在接下來的步驟中需要使用到Agent來構(gòu)建代碼,因此我們需要知道其包含的內(nèi)容:
·?ubuntu:bionic(Linux)
·?microsoft / windowsservercore或microsoft / nanoserver(Windows)
·?AdoptOpenJDK 8,JDK 64位
·?git
·?mercurial(除了nanoserver鏡像)
·?.NET Core SDK(可以構(gòu)建.NET Core!!)
·?MSBuild工具(基于windowsservercore的鏡像)
·?docker-engine(Linux)
創(chuàng)建Teamcity Agent代理服務(wù)
創(chuàng)建TeamCity?Agent容器服務(wù)主要分為以下幾個步驟:
1.?創(chuàng)建服務(wù),設(shè)置鏡像
鏡像名稱為:jetbrains/teamcity-agent,如下圖所示(注意是直接輸入):
2.?配置數(shù)據(jù)卷。
數(shù)據(jù)卷我們這里選擇使用本地硬盤,主要是為了講解數(shù)據(jù)卷的不同類型:
使用本地硬盤有兩種形式:
·?指定源路徑(HostPath),將容器所在宿主機的文件目錄掛載到容器指定的掛載點中,如容器需要訪問/etc/hosts則可以使用HostPath映射/etc/hosts等場景。
·?空的源路徑(EmptyDir),用于容器的數(shù)據(jù)的臨時存儲,如基于磁盤的排序場景等。
也就是我們留空也可以。
3.?添加掛載點,以保存數(shù)據(jù),如下圖所示:
其中“vol”、“dockervol”為剛創(chuàng)建的數(shù)據(jù)卷名稱,中間部分為容器內(nèi)的路徑,右側(cè)部分為設(shè)置該路徑的權(quán)限。
4.?配置環(huán)境變量
如下圖所示,我們還需配置以下環(huán)境變量:
AGENT_NAME | 代理實例名稱(授權(quán)時會顯示) |
SERVER_URL | 服務(wù)端UI |
DOCKER_IN_DOCKER | Docker內(nèi)部啟動Docker |
5.?配置特權(quán)級容器
此選項在TKV容器服務(wù)的高級設(shè)置中,如圖所示:
6.?配置端口映射
這里我們無需提供公網(wǎng)訪問,因此選擇【僅在集群內(nèi)訪問】即可。端口映射這塊,Agent的默認端口為9090。
7.?點擊【創(chuàng)建服務(wù)】按鈕,創(chuàng)建服務(wù)
創(chuàng)建完成后,可以在服務(wù)列表看到我們所創(chuàng)建的服務(wù):
連接和配置Agent?
Server和Agent配置完成后,我們可以訪問Server站點,完成初始化工作。然后,我們需要配置好Agent。
打開Agents界面,可以看到我們剛創(chuàng)建的Agent:
這時,我們需要先進行授權(quán),也就是打開【Unauthorized】面板,點擊【Authorize】按鈕:
授權(quán)成功后,我們就可以看見已連接的代理了:
?
接下來,才可以開始搞事情。
創(chuàng)建項目以及配置CI??
項目創(chuàng)建界面如下所示:
?
推薦大家使用git來管理自己的代碼。這里我們可以添加我們的代碼倉庫地址,如果是私有庫,還需要配置賬號密碼。簡單步驟我們這里略過,然后接下來TeamCity會掃描源代碼,來提供推薦的構(gòu)建步驟:?
這里我們可以勾選我們需要的步驟,或者自己來創(chuàng)建符合自己需要的步驟。
注意
使用Docker托管的Agent服務(wù)鏡像并不支持PowellShell。如果選擇了不支持的步驟,將無法使用剛才我們創(chuàng)建的Agent執(zhí)行代碼構(gòu)建。
這里,我們可以添加幾個簡單的步驟:
步驟1、2使用Docker構(gòu)建Docker鏡像,相關(guān)參考界面如下所示:
步驟3則使用CMD命令發(fā)送釘釘消息,以通知團隊:
通知結(jié)果如下圖所示:
接下來,我們就可以配置觸發(fā)器、失敗條件判斷以及參數(shù)等其他配置。整個構(gòu)建步驟配置起來非常簡單,大家也可以結(jié)合我之前的CI教程來完善配置,比如添加對鏡像推送的步驟等。
完成之后,我們就可以嘗試著運行構(gòu)建,并且查看構(gòu)建歷史:
整個構(gòu)建詳情我們也可以直接查看:
?
包括構(gòu)建日志:
在這個過程中,可能大家需要用到一些構(gòu)建參數(shù)、環(huán)境變量等等,我們可以打開對應(yīng)agent的Agent?Parameters面板來查看詳情:
?
往期文章一覽
Docker最全教程——從理論到實戰(zhàn)(一)
Docker最全教程——從理論到實戰(zhàn)(二)
Docker最全教程——從理論到實戰(zhàn)(三)
Docker最全教程——從理論到實戰(zhàn)(四)
Docker最全教程——從理論到實戰(zhàn)(五)
Docker最全教程——從理論到實戰(zhàn)(六)
Docker最全教程——從理論到實戰(zhàn)(七)
Docker最全教程——從理論到實戰(zhàn)(八)? ??
Docker最全教程——從理論到實戰(zhàn)(九)
Docker最全教程之使用Tencent Hub來完成CI(十)Docker最全教程——數(shù)據(jù)庫容器化(十一)
Docker最全教程——數(shù)據(jù)庫容器化之持久保存數(shù)據(jù)(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜實戰(zhàn)(十四)
Docker最全教程之Ubuntu下安裝Docker(十五)
Docker最全教程之樹莓派和Docker(十六)
如果喜歡作者的文章,請關(guān)注“magiccodes”訂閱號以便第一時間獲得最新內(nèi)容。本文版權(quán)歸作者和湖南心萊信息科技有限公司共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
QQ群:
編程交流群<85318032>?
產(chǎn)品交流群<897857351>
長沙線下技術(shù)社區(qū)已經(jīng)創(chuàng)建,有興趣者可以通過客服加群。接下來,我們會定期組織一些線下技術(shù)交流分享會,以饗大家。
總結(jié)
以上是生活随笔為你收集整理的Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Http-Repl工具测试ASP.N
- 下一篇: 自动将 NuGet 包的引用方式从 pa