Azure DevOps Server CI - 自搭跨平台容器代理Agents
前言
最近在地端(On-premises)幫團(tuán)隊(duì)搭一套CI/CD流程,也順帶整理了一下從無(wú)到有的搭建過(guò)程,這次使用了docker技術(shù)來(lái)解決現(xiàn)有團(tuán)隊(duì)使用CI/CD時(shí)讓現(xiàn)有CI/CD hosting環(huán)境過(guò)於複雜的問(wèn)題。
在開(kāi)始之前,我先預(yù)備一下搭建的環(huán)境,如下:
Windows Server 2012 R2( Traditional Chinese) VM虛擬機(jī)
Azure DevOps Server 2019 RC1.0
Docker version 18.03.0-ce
沒(méi)用上最新的Docker 版本是因?yàn)閃in Server 2012 R2不支援容器化,需要安裝
Docker Toolbox(https://docs.docker.com/toolbox/toolbox_install_windows/)
在使用docker image之前,先來(lái)簡(jiǎn)單解釋一下代理Agent。MSDN的說(shuō)法是是一套可被安裝的軟件(installable software),用來(lái)處理序列的工作(jobs)/任務(wù)(Tasks),比方說(shuō)你出行時(shí)可以打車,而你可以選擇Taxi,Uber,或Didi..等等,出行就是你的job,而Taxi或Didi這邊來(lái)說(shuō)就是Agent。
Agent可以處理在building或release這些活動(dòng),一旦有大量的building,或release活動(dòng)產(chǎn)生的時(shí)候一個(gè)agent肯定負(fù)擔(dān)不小,這時(shí)多個(gè)agent是一個(gè)不錯(cuò)的方案
我先從單一agent開(kāi)始建立,這邊微軟的教程已經(jīng)非常簡(jiǎn)單了,我照其步驟快速過(guò)一遍,以便讀者能有基本認(rèn)識(shí),在搭建多個(gè)agent也能快速上手,也能進(jìn)一步搭建容器化的agent
單agent建立:
下載Agent
在DefaultCollection portal 頁(yè)面找到集合設(shè)置
2.選擇代理池,可知在此可以設(shè)置多個(gè)代理
3.在默認(rèn)下有個(gè)名稱Default的代理池,目前尚未創(chuàng)建任何的代理所以這邊顯示未註冊(cè)代理
4.選擇下載代理,你將會(huì)看到下列信息,選擇相應(yīng)的OS下載代理,我安裝Azure Devops Server是在Windows Server下,所以這邊選擇Windows,由此可以得知Agent 可依附在不同的平臺(tái)下如macOS,Linux
安裝Agent
下載完後可以知道這是一個(gè)zip壓縮包微軟已經(jīng)寫好了配置過(guò)程與啟用腳本
將壓縮包解壓到指定的位置,如C:\agent
用admin 身分執(zhí)行Powershell,切換到解壓directory
貼上微軟提供的命令,注意不要包含空白
執(zhí)行config.cmd 進(jìn)行配置
5.配置過(guò)程如下,
這邊來(lái)說(shuō)明一下各個(gè)配置
服務(wù)器URL: 這邊如果沒(méi)有指定的明確的域名,可以輸入安裝Azure Devops Server 的服務(wù)器名
驗(yàn)證類型:這邊可先用默認(rèn)的Integrated
代理名:可自定義名稱,如上圖指定了Build-Agent
用於服務(wù)的賬戶名:這邊可以依照工作的需求與運(yùn)維的要求看是否需要建立新的賬戶或用默認(rèn)的,我建立新的賬戶adobuild,並建立服務(wù),服務(wù)啟動(dòng)時(shí)會(huì)用這個(gè)賬戶來(lái)啟動(dòng)
如無(wú)錯(cuò)誤訊息,成功結(jié)束配置
6.
最後在代理池裡可以看到配置並成功聯(lián)機(jī)狀態(tài)的Agent
到此已經(jīng)完成的最簡(jiǎn)單的配置,也是微軟教程內(nèi)的範(fàn)疇,我們還差如何驗(yàn)證Agent的功能?最簡(jiǎn)單的方法就是將代碼分支enqueue到這個(gè)Default來(lái)進(jìn)行編譯
最後可以在代理池看到編譯的狀態(tài),也能從log看出編譯失敗的原因
以上就是一個(gè)簡(jiǎn)易的搭建過(guò)程,但這邊衍伸了幾個(gè)問(wèn)題?
回顧文章開(kāi)頭所述,我在一個(gè)乾淨(jìng)的VM進(jìn)行配置,編譯之所以出錯(cuò)是因?yàn)檫@是一個(gè).Net Core的項(xiàng)目,VM壓根沒(méi)裝.Net Core SDK
裝上了當(dāng)然編譯就沒(méi)問(wèn)題,但想像一情境:
Azure Devops Server會(huì)同時(shí)有好多團(tuán)隊(duì)來(lái)使用,如寫Python的,Node.js的,如果都在這臺(tái)服務(wù)器下裝項(xiàng)目的依賴軟件。這樣真的好嗎? 如果使用在線Azure Devops Service 這可能會(huì)幫助您省去這個(gè)問(wèn)題。
在地端(On-premises)搭建時(shí),為了涵蓋以上情境,我使用了
Running a self-hosted agent in Docker
https://docs.microsoft.com/zh-tw/azure/devops/pipelines/agents/docker?view=azure-devops
這是需要Docker支持的技術(shù),如果agent可以在各個(gè)容器裡隔離開(kāi)來(lái),並且各自擁有可依賴的環(huán)境docker image後,如需要對(duì).Net Core項(xiàng)目進(jìn)行CI 可以準(zhǔn)備一個(gè)docker file裏頭預(yù)先裝好.net sdk,Python項(xiàng)目也能用另一個(gè)docker file預(yù)先裝好Python,多個(gè)docker file對(duì)應(yīng)到不同的Agent,這樣就可以保持Azure Devops Server的環(huán)境單純。
準(zhǔn)備docker file
上述的思維已經(jīng)很多前輩都想到了,本文的案例在地端的Azure Devops Server使用Running a self-hosted agent in Docker
簡(jiǎn)化現(xiàn)有團(tuán)隊(duì)間的技術(shù)債,在一位歐洲的開(kāi)發(fā)者RobertoPrevato 的博客中我也看到相同做法。(https://robertoprevato.github.io/Self-hosted-Azure-DevOps-agents-running-in-Docker/)。按微軟文檔的教程,只須執(zhí)行docker build出image並docker run命令即可完成agent配置。
前面提到agent可以hosting在不同的操作系統(tǒng)下,在此我將agent 配置在linux下並裝好.net core sdk/runtimes等(為什麼是linux?因?yàn)榭梢悦馊ゴ罅渴跈?quán)的麻煩)
項(xiàng)目可用的dockerfile如何建立?
熟悉dockerfile應(yīng)該可以跳過(guò)這一段。
先來(lái)看看微軟在Running a self-hosted agent in Docker中範(fàn)例
https://docs.microsoft.com/zh-tw/azure/devops/pipelines/agents/docker?view=azure-devops
FROM ubuntu:16.04# To make it easier for build and release pipelines to run apt-get, # configure apt to not require confirmation (assume the -y argument by default) ENV DEBIAN_FRONTEND=noninteractive RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyesRUN apt-get update \ && apt-get install -y --no-install-recommends \ca-certificates \curl \jq \git \iputils-ping \libcurl3 \libicu55 \libunwind8 \netcatWORKDIR /azpCOPY ./start.sh . RUN chmod +x start.shCMD ["./start.sh"]依樣畫葫蘆,從範(fàn)例看到apt-get install,這邊就可以自定義來(lái)安裝.net core 項(xiàng)目所需的依賴(或其它如python項(xiàng)目)安裝片段如下:
通過(guò)範(fàn)例還可得知,這dockerfile最後寫:
RUN chmod +x start.sh透過(guò)start.sh腳本來(lái)進(jìn)行agent配置(服務(wù)器URL/驗(yàn)證類型...),
透過(guò)dockerfile可以建立(build)一個(gè)image,接著啟動(dòng)(run) image
docker build -t dockeragent:latest . docker run -e AZP_URL=<Azure DevOps instance> \ -e AZP_TOKEN=<PAT token> \ -e AZP_AGENT_NAME=mydockeragent \ dockeragent:latest
完成後便可在代理池看到一個(gè)名為mydockeragent基於ubuntu 16.04 並帶有.net core 項(xiàng)目依賴環(huán)境的代理了。
以下我們實(shí)際來(lái)走訪一次Running a self-hosted agent in Docker流程,很幸運(yùn)的我已經(jīng)看到預(yù)先搭好.net core sdk環(huán)境的dokerfile了。
https://github.com/RobertoPrevato/AzureDevOps-agents/blob/master/ubuntu18.04-dotnet/Dockerfile
步驟分為二
Build docker images
Run Image
Let's Go
Build docker images
我簡(jiǎn)化了RobertoPrevato提供的dockerfile,因?yàn)閕mage太多了build用時(shí)太長(zhǎng)。
您可以在https://github.com/yuessir/AzureDevOps-agents/tree/Customized-master
下載簡(jiǎn)化過(guò)腳本到本地進(jìn)行,如需其它語(yǔ)言dockerfile可找到原作fork源頭
1.使用bash執(zhí)行build.sh
2.腳本自動(dòng)安裝所需依賴
如無(wú)錯(cuò)誤則成功完成building images
Run Image
使用下列命令我們建立一個(gè)名為Self-hosted?Ubuntu?18.04的代理池,代理名稱為ubuntu18.04-dotnet,使用image為devopsubuntu18.04-dotnet:latest
??docker?run?-e?AZP_URL=http://win-pmovrk1des/DefaultCollection?\-e?AZP_POOL='Self-hosted?Ubuntu?18.04'?\-e?AZP_TOKEN=azusie3sn5so6i6nzfytgp2fkfelwr5itnzcf6pylfnwiyviha?\-e?AZP_AGENT_NAME='ubuntu18.04-dotnet'?\devopsubuntu18.04-dotnet:latest這邊需要注意由於使用PAT驗(yàn)證而非Integrated驗(yàn)證,在驗(yàn)證過(guò)程中會(huì)發(fā)生缺少SSL的錯(cuò)誤信息
這邊解決方案就是把Azure Devops Server加上SSL
更改命令如下
執(zhí)行命令:
配置成功將出現(xiàn)下面信息:
回到代理池頁(yè)面就可看到配置後的Ubuntu Agent了
在re-enqueue .net core項(xiàng)目分支後也可以看到順利被代理編譯成功。
這就是使用docker 作為Azure Devops Agent 的過(guò)程,過(guò)程礙於篇幅只先呈現(xiàn)ubuntu with .Net Agent的部分,您可以自行嘗試帶有python/nodejs的agent並實(shí)行CI。
最後簡(jiǎn)單總結(jié):
缺點(diǎn):
項(xiàng)目成員要有能力知道如何提供dockerfile的內(nèi)容
好處:
可以依照不同團(tuán)隊(duì)的開(kāi)發(fā)性質(zhì)進(jìn)行快速的替換不同的agent
安裝依賴組件時(shí)不會(huì)讓服務(wù)器變得擁腫,避免不必要的安全風(fēng)險(xiǎn)
Builing image可以快速更新與重建,適合快速迭代的團(tuán)隊(duì)
以上就是在地端搭建的過(guò)程,有任何的問(wèn)題歡迎與我聯(lián)繫~
下一篇將會(huì)針對(duì)CD的部分來(lái)著墨
總結(jié)
以上是生活随笔為你收集整理的Azure DevOps Server CI - 自搭跨平台容器代理Agents的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何打造组织级敏捷,你想知道的都在这里!
- 下一篇: Serverless那么火,2019年的