docker4dotnet #5 使用VSTS/TFS搭建基于容器的持續(xù)交付管道
在過(guò)去的幾篇d4d系列中,我給大家介紹了如何使用docker來(lái)支持asp.net core的應(yīng)用開(kāi)發(fā),打包的場(chǎng)景。Asp.net core的跨平臺(tái)開(kāi)發(fā)能力為.net開(kāi)發(fā)人員提供了使用容器進(jìn)行應(yīng)用開(kāi)發(fā)的能力,今天這篇文章將對(duì)如何使用微軟的全生命周期管理平臺(tái)VSTS/TFS來(lái)構(gòu)建基于容器的CI/CD管道來(lái)支持團(tuán)隊(duì)開(kāi)發(fā)的場(chǎng)景。
#3 在macOS上使用Visual Studio Code和Docker開(kāi)發(fā)asp.net core和mysql應(yīng)用
#4 使用Azure云存儲(chǔ)構(gòu)建高速 Docker registry
Visual Studio Team Services/Team Foundation Server
VSTS/TFS是微軟Visual Studio產(chǎn)品組提供給廣大開(kāi)發(fā)者的全生命周期管理平臺(tái),Visual Studio Team Service (VSTS)是構(gòu)建在微軟公有云Azure平臺(tái)上的Saas架構(gòu)的開(kāi)發(fā)平臺(tái),為中小團(tuán)隊(duì)和跨地域的大型團(tuán)隊(duì)提供軟件開(kāi)發(fā)過(guò)程的端到端管理能力,這個(gè)平臺(tái)對(duì)于5名以下開(kāi)發(fā)團(tuán)隊(duì)的小團(tuán)隊(duì)完全免費(fèi)(同時(shí)可以有任意數(shù)量的管理人員參與,VSTS通過(guò)區(qū)分stakeholder和developer兩種角色,為stakeholder這些只需要管理過(guò)程而無(wú)需修改代碼的管理人員提供了完全免費(fèi)的訪問(wèn)許可)。Team Foundation Server是VSTS的企業(yè)版,可以由企業(yè)獨(dú)立部署于私有云或者數(shù)據(jù)中心中,并提供與VSTS一致的功能體驗(yàn)。
基于容器的CI/CD
容器技術(shù)所解決的主要問(wèn)題是環(huán)境的一致性和同一版本的應(yīng)用在不同的環(huán)境中的遷移問(wèn)題,雖然對(duì)單個(gè)開(kāi)發(fā)人員也提供了更高效的開(kāi)發(fā)模式,但容器的作用在團(tuán)隊(duì)開(kāi)發(fā)中和管理開(kāi)發(fā)/測(cè)試/預(yù)生產(chǎn)/生產(chǎn)環(huán)境中會(huì)體現(xiàn)得更有價(jià)值。從事軟件開(kāi)發(fā)的技術(shù)人員都知道,在開(kāi)發(fā)過(guò)程中保持不同開(kāi)發(fā)人員/測(cè)試人員使用統(tǒng)一的環(huán)境是一件非常困難的事情,很多過(guò)程中的問(wèn)題都是環(huán)境不一致造成的。容器正是解決這一問(wèn)題的有效方式。
為了能夠構(gòu)建基于容器的CI/CD,我們需要以下工具鏈:
下圖展示了以上工具鏈的關(guān)系和工作流程
下圖中可以看到,要構(gòu)建完整的發(fā)布工具,我們需要一個(gè)多級(jí)技術(shù)棧,Docker的容器化工具降低了***層環(huán)境和應(yīng)用技術(shù)棧的復(fù)雜度,讓我們的發(fā)布過(guò)程變得更簡(jiǎn)單。
下面我們就來(lái)看一下如何配置這樣一套基于容器的CI/CD環(huán)境
1. 創(chuàng)建容器化主機(jī)作為開(kāi)發(fā)/測(cè)試/生產(chǎn)環(huán)境
關(guān)于如何在開(kāi)發(fā)環(huán)境中創(chuàng)建容器化主機(jī)支持編碼和調(diào)試,請(qǐng)參考
關(guān)于如何在云環(huán)境中創(chuàng)建容器化主機(jī)支持測(cè)試和生產(chǎn)環(huán)境,請(qǐng)參考
2. 在Linux服務(wù)器上配置TFS構(gòu)建代理
關(guān)于如何配置Linux服務(wù)器上的構(gòu)建代理,請(qǐng)參考
《用VSTS/TFS搭建iOS持續(xù)集成環(huán)境》
3. 將容器化主機(jī)連接到TFS
進(jìn)入TFS后臺(tái),點(diǎn)擊 服務(wù) | 新建服務(wù)終結(jié)點(diǎn) |Dcoker Host
將容器化主機(jī)的 url,和~/.docker/machine/machines/{machine-name} 目錄下的pem的文件內(nèi)容按照以下關(guān)系拷貝到配置頁(yè)面中。
重復(fù)以上過(guò)程,分別綁定用戶(hù)測(cè)試和生產(chǎn)環(huán)境的容器化主機(jī)配置,創(chuàng)建以下docker host終結(jié)點(diǎn)
○ Dockerhost-test
○ Dockerhost-pro
4. 將docker hub賬號(hào)連接到TFS
進(jìn)入TFS后臺(tái),點(diǎn)擊 服務(wù) | 新建服務(wù)終結(jié)點(diǎn) | Docker Registry
填寫(xiě)你的docker hub用戶(hù)名,密碼和郵件地址;如果使用私有的registry,請(qǐng)更新Docker Regsitry地址。
5. 配置CI定義
創(chuàng)建生成定義,并將默認(rèn)代理隊(duì)列指向?qū)?yīng)在Linux服務(wù)器上構(gòu)建代理隊(duì)列
在 生成 步驟中分別添加以下構(gòu)建任務(wù)
具體為
a. dotnet restore
b. dotnet build
c. dotnet publish
d. docker build
e. docker push
以下為docker build步驟的詳細(xì)配置,注意這里我們使用$(Build.BuildNumber)這個(gè)環(huán)境變量作為容器鏡像的tag,這樣我們就可以使用統(tǒng)一的構(gòu)建號(hào)來(lái)管理容器鏡像的不同版本。
以下是docker push的詳細(xì)配置,此步驟將把構(gòu)建好的容器上傳到docker hub并使用$(Build.BuildNumber)作為版本號(hào)tag。
6. 創(chuàng)建CD發(fā)布管道
創(chuàng)建以下發(fā)布管道配置,分別指定測(cè)試環(huán)境和生產(chǎn)創(chuàng)建的部署步驟
在每一個(gè)環(huán)境中,我們都執(zhí)行以下步驟
○ Stop running container
○ Remove container
○ Run container
測(cè)試環(huán)境和生產(chǎn)環(huán)境分別使用不同的容器化主機(jī)連接(在第1-2步中創(chuàng)建的連接)。
7. 配置測(cè)試環(huán)境到生產(chǎn)環(huán)境的升級(jí)策略
以下配置要求生產(chǎn)環(huán)境的部署只有在測(cè)試環(huán)境部署成功的情況下才能執(zhí)行
以下配置要求生產(chǎn)環(huán)境的部署必須由特定的用戶(hù)進(jìn)行審批通過(guò)后才能執(zhí)行
至此,我們就完成了基于容器的CI/CD發(fā)布管道配置。
【本文為51CTO專(zhuān)欄作者“徐磊”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)devopshub獲取授權(quán)】