本篇教程主要講解基於容器服務搭建TeamCity服務,而且完成內部項目的CI流程配置。教程中也分享了一個簡單的CI、CD流程,僅做探討。不過因爲篇幅有限,完整的DevOps,咱們後續獨立探討。 git
爲了下降容器的使用門檻以及便於你們將容器技術應用於開發和實踐,當前教程大部分線上實踐結合TKE(騰訊雲容器服務)來進行講解和實踐。當本系列內容講解完成後,筆者將再單獨講解Kubernetes(k8s)。web
最後,長沙技術社區第一次線下交流會將在2019年3月10日下午2點開始,有興趣的朋友能夠參與交流。名額有限,詳見《長沙.NET技術社區活動通知》。sql
使用TeamCity來完成內部CI、CD流程1docker
一個簡單的CI、CD流程1ubuntu
關於TeamCity2windows
官方鏡像4服務器
使用騰訊雲容器服務(TKV)搭建和託管TeamCity4負載均衡
建立TeamCity Server容器服務4框架
建立Teamcity Agent代理服務7ionic
鏈接和配置Agent9
建立項目以及配置CI10
本篇教程主要講解基於容器服務搭建TeamCity服務,而且完成內部項目的CI流程配置。至於完整的DevOps,咱們後續獨立探討。
如下分享一個簡單的CI、CD流程(僅供參考):
注意
本流程須要使用git進行代碼版本管理,推薦使用TFS搭建本身的代碼版本庫。自動部署推薦使用騰訊雲鏡像觸發器實現,此步驟也可使用腳本實現,若是是普通的.NET代碼,推薦編寫webdeploy命令腳原本完成自動部署。通知推薦你們使用釘釘機器人。
本流程僅做參考,後續筆者會獨立一篇來說解整個DevOps流程,以及項目(產品)渠道消息集成這塊,這裏僅做拋磚引玉,同時你們也能夠更易於理解,容器技術大大簡化CI、CD流程!
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這邊須要使用到數據卷作持久化,那麼在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便可訪問對應的服務。
如剛建立的:
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容器鏡像,以及推送鏡像。
因爲在接下來的步驟中須要使用到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容器服務主要分爲如下幾個步驟:
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. 點擊【建立服務】按鈕,建立服務
建立完成後,能夠在服務列表看到咱們所建立的服務:
Server和Agent配置完成後,咱們能夠訪問Server站點,完成初始化工做。而後,咱們須要配置好Agent。
打開Agents界面,能夠看到咱們剛建立的Agent:
這時,咱們須要先進行受權,也就是打開【Unauthorized】面板,點擊【Authorize】按鈕:
受權成功後,咱們就能夠看見已鏈接的代理了:
接下來,才能夠開始搞事情。
項目建立界面以下所示:
推薦你們使用git來管理本身的代碼。這裏咱們能夠添加咱們的代碼倉庫地址,若是是私有庫,還須要配置帳號密碼。簡單步驟咱們這裏略過,而後接下來TeamCity會掃描源代碼,來提供推薦的構建步驟:
這裏咱們能夠勾選咱們須要的步驟,或者本身來建立符合本身須要的步驟。
注意:使用Docker託管的Agent服務鏡像並不支持PowellShell。若是選擇了不支持的步驟,將沒法使用剛纔咱們建立的Agent執行代碼構建。
這裏,咱們能夠添加幾個簡單的步驟:
步驟一、2使用Docker構建Docker鏡像,相關參考界面以下所示:
步驟3則使用CMD命令發送釘釘消息,以通知團隊:
通知結果以下圖所示:
接下來,咱們就能夠配置觸發器、失敗條件判斷以及參數等其餘配置。整個構建步驟配置起來很是簡單,你們也能夠結合我以前的CI教程來完善配置,好比添加對鏡像推送的步驟等。
完成以後,咱們就能夠嘗試着運行構建,而且查看構建歷史:
整個構建詳情咱們也能夠直接查看:
包括構建日誌:
在這個過程當中,可能你們須要用到一些構建參數、環境變量等等,咱們能夠打開對應agent的Agent Parameters面板來查看詳情: