前言

最近在地端(On-premises)幫團隊搭一套CI/CD流程,也順帶整理了一下從無到有的搭建過程,這次使用了docker技術來解決現有團隊使用CI/CD時讓現有CI/CD hosting環境過於複雜的問題。

在開始之前,我先預備一下搭建的環境,如下:

Windows Server 2012 R2( Traditional Chinese) VM虛擬機
Azure DevOps Server 2019 RC1.0

Docker version 18.03.0-ce

沒用上最新的Docker 版本是因為Win Server 2012 R2不支援容器化,需要安裝

Docker Toolbox(https://docs.docker.com/toolbox/toolbox_install_windows/)

在使用docker image之前,先來簡單解釋一下代理Agent。MSDN的說法是是一套可被安裝的軟件(installable software),用來處理序列的工作(jobs)/任務(Tasks),比方說你出行時可以打車,而你可以選擇Taxi,Uber,或Didi..等等,出行就是你的job,而Taxi或Didi這邊來說就是Agent。

Agent可以處理在building或release這些活動,一旦有大量的building,或release活動產生的時候一個agent肯定負擔不小,這時多個agent是一個不錯的方案

我先從單一agent開始建立,這邊微軟的教程已經非常簡單了,我照其步驟快速過一遍,以便讀者能有基本認識,在搭建多個agent也能快速上手,也能進一步搭建容器化的agent

單agent建立:

  • 下載Agent

  1. 在DefaultCollection portal 頁面找到集合設置

2.選擇代理池,可知在此可以設置多個代理

3.在默認下有個名稱Default的代理池,目前尚未創建任何的代理所以這邊顯示未註冊代理

4.選擇下載代理,你將會看到下列信息,選擇相應的OS下載代理,我安裝Azure Devops Server是在Windows Server下,所以這邊選擇Windows,由此可以得知Agent 可依附在不同的平台下如macOS,Linux

  • 安裝Agent

下載完後可以知道這是一個zip壓縮包微軟已經寫好了配置過程與啟用腳本

  1. 將壓縮包解壓到指定的位置,如C:\agent

  2. 用admin 身分執行Powershell,切換到解壓directory

  3. 貼上微軟提供的命令,注意不要包含空白

  4. 執行config.cmd 進行配置

5.配置過程如下,

這邊來說明一下各個配置

  • 服務器URL: 這邊如果沒有指定的明確的域名,可以輸入安裝Azure Devops Server 的服務器名

  • 驗證類型:這邊可先用默認的Integrated

  • 代理名:可自定義名稱,如上圖指定了Build-Agent

  • 用於服務的賬戶名:這邊可以依照工作的需求與運維的要求看是否需要建立新的賬戶或用默認的,我建立新的賬戶adobuild,建立服務,服務啟動時會用這個賬戶來啟動

  • 如無錯誤訊息,成功結束配置

6.

最後在代理池裡可以看到配置並成功聯機狀態的Agent

到此已經完成的最簡單的配置,也是微軟教程內的範疇,我們還差如何驗證Agent的功能?最簡單的方法就是將代碼分支enqueue到這個Default來進行編譯

最後可以在代理池看到編譯的狀態,也能從log看出編譯失敗的原因

以上就是一個簡易的搭建過程,但這邊衍伸了幾個問題?

回顧文章開頭所述,我在一個乾淨的VM進行配置,編譯之所以出錯是因為這是一個.Net Core的項目,VM壓根沒裝.Net Core SDK

裝上了當然編譯就沒問題,但想像一情境:

Azure Devops Server會同時有好多團隊來使用,如寫Python的,Node.js的,如果都在這台服務器下裝項目的依賴軟件這樣真的好嗎? 如果使用在線Azure Devops Service 這可能會幫助您省去這個問題。

在地端(On-premises)搭建時,為了涵蓋以上情境,我使用了

Running a self-hosted agent in Docker

https://docs.microsoft.com/zh-tw/azure/devops/pipelines/agents/docker?view=azure-devops

這是需要Docker支持的技術,如果agent可以在各個容器裡隔離開來,並且各自擁有可依賴的環境docker image後,如需要對.Net Core項目進行CI 可以準備一個docker file裏頭預先裝好.net sdk,Python項目也能用另一個docker file預先裝好Python,多個docker file對應到不同的Agent,這樣就可以保持Azure Devops Server的環境單純。

  • 準備docker file

上述的思維已經很多前輩都想到了,本文的案例在地端的Azure Devops Server使用Running a self-hosted agent in Docker

簡化現有團隊間的技術債,在一位歐洲的開發者RobertoPrevato 的博客中我也看到相同做法。(https://robertoprevato.github.io/Self-hosted-Azure-DevOps-agents-running-in-Docker/)。按微軟文檔的教程,只須執行docker build出image並docker run命令即可完成agent配置。

前面提到agent可以hosting在不同的操作系統下,在此我將agent 配置在linux下並裝好.net core sdk/runtimes等(為什麼是linux?因為可以免去大量授權的麻煩)

  • 項目可用的dockerfile如何建立?

    熟悉dockerfile應該可以跳過這一段。

    先來看看微軟在Running a self-hosted agent in Docker中範例

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"]

依樣畫葫蘆,從範例看到apt-get install,這邊就可以自定義來安裝.net core 項目所需的依賴(或其它如python項目)安裝片段如下:

apt-get install dotnet-sdk-2.1=2.1.301-1
apt-get install dotnet-sdk-2.2

通過範例還可得知,這dockerfile最後寫:

RUN chmod +x start.sh

透過start.sh腳本來進行agent配置(服務器URL/驗證類型...),

透過dockerfile可以建立(build)一個image,接著啟動(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

完成後便可在代理池看到一個名為mydockeragent基於ubuntu 16.04 並帶有.net core 項目依賴環境的代理了。

以下我們實際來走訪一次Running a self-hosted agent in Docker流程,很幸運的我已經看到預先搭好.net core sdk環境的dokerfile了。

https://github.com/RobertoPrevato/AzureDevOps-agents/blob/master/ubuntu18.04-dotnet/Dockerfile

步驟分為二

  1. Build docker images

  2. Run Image

Let's Go

  • Build docker images

    我簡化了RobertoPrevato提供的dockerfile,因為image太多了build用時太長。

    您可以在https://github.com/yuessir/AzureDevOps-agents/tree/Customized-master

    下載簡化過腳本到本地進行,如需其它語言dockerfile可找到原作fork源頭

    1.使用bash執行build.sh

    2.腳本自動安裝所需依賴

如無錯誤則成功完成building images

  • Run Image

使用下列命令我們建立一個名為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驗證而非Integrated驗證,在驗證過程中會發生缺少SSL的錯誤信息

這邊解決方案就是把Azure Devops Server加上SSL

更改命令如下

docker run -e AZP_URL=https://az.***.com/DefaultCollection \
--add-host az.***.com:192.168.239.128 \-e AZP_POOL='Self-hosted Ubuntu 18.04' \-e AZP_TOKEN=usie3sn5sokf6gdfkgp2fgrkfelwr5it \-e AZP_AGENT_NAME='ubuntu18.04-dotnet' \devopsubuntu18.04-dotnet:latest

執行命令:

配置成功將出現下面信息:

回到代理池頁面就可看到配置後的Ubuntu Agent了

在re-enqueue .net core項目分支後也可以看到順利被代理編譯成功。

這就是使用docker 作為Azure Devops Agent 的過程,過程礙於篇幅只先呈現ubuntu with .Net Agent的部分,您可以自行嘗試帶有python/nodejs的agent並實行CI。

最後簡單總結:

缺點:

  1. 項目成員要有能力知道如何提供dockerfile的內容

好處:

  1. 可以依照不同團隊的開發性質進行快速的替換不同的agent

  2. 安裝依賴組件時不會讓服務器變得擁腫,避免不必要的安全風險

  3. Builing image可以快速更新與重建,適合快速迭代的團隊

以上就是在地端搭建的過程,有任何的問題歡迎與我聯繫~

下一篇將會針對CD的部分來著墨

Azure DevOps Server CI - 自搭跨平台容器代理Agents相关推荐

  1. Azure DevOps Server(TFS) 客户端分析

    Azure DevOps Server(TFS) 是微软公司的软件协作开发管理平台产品,为软件研发.测试.实施提供全流程的服务.作为一款应用服务器产品,他的客户端是什么,在哪里下载客户端?我们在项目实 ...

  2. 微软 Azure DevOps Server 2019 Update 1 (TFS 2019.1)

    1.概述 微软在2019年5月发布Azure DevOps Server 2019后不到2个月的时间里,就快速准备好了第一个升级包(2019 Update 1),并计划在几周后发布正式版本.也许你还没 ...

  3. Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)

    之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...

  4. Azure DevOps Server (TFS) 代码库Repo管理培训

    Repo是分布式代码库Git中的一个专用词,用于存储和管理开发团队中特定的源代码. 使用Git,可以协调整个团队的代码更改. 即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井 ...

  5. 批量创建Azure DevOps Server 的账户

    概述 当我们部署一套全新的Azure DevOps Server服务器,如果在企业中之前没有应用Active Directory(简称AD,活动目录)作为认证服务器,就需要在AD服务器上为每个用户新建 ...

  6. Azure DevOps Server 2019 (TFS)安装教程

    (1)安装教程: Azure DevOps Server 2019 (TFS)安装教程 - danzhang - 博客园 Azure DevOps Server 的安装教程_躺平佛系周大侠的博客-CS ...

  7. Azure DevOps Server 的连接源(Artifacts):六、发布python程序(Twine pip)

    1. 发布Python程序包 一般我们都是用Twine作为Python程序包的发布工具,这个工具比较简单,只需要在用户主目录中配置.pypirc文件,指定私服地址即可,下面是一个简单的示例. 1.1 ...

  8. Azure DevOps Server 的连接源(Artifacts):五、python包管理pip和twine

    1. 安装artifacts-keyring 参考:https://pypi.org/project/artifacts-keyring artifacts-keyring是程序包keyring的扩展 ...

  9. Azure DevOps Server 2022新功能:禁止用户管理自己创建的分支(mange-permission)

    在之前版本的Azure DevOps Server(之前名为TFS)中,如果用户拥有创建分支的权限,则对自己创建的分支具有管理权限(manage-permission),可以为自己创建的分支授予其它成 ...

最新文章

  1. 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - G.重复字符串
  2. 通过一个实际例子学习SAP UI5的控件绘制和渲染
  3. 蓝桥杯 ADV-104算法提高 打水问题
  4. 某大型银行深化系统技术方案之十四:服务层之服务调度机制
  5. PPT 如何做好关卡设计
  6. 推荐几本比较好的投资书籍
  7. Online Classification
  8. centos7 部署dzzoffice最新版详细教程
  9. 华为云域名注册_华为云申请个人域名步骤
  10. ASR6505基于STM 8位MCU与SX1262 的SiP全频段LoRa芯片
  11. 第2期:大数据岗位有哪些
  12. Linux新手入门之基础命令操作
  13. ISO 8583协议-银行交易的标准
  14. attiny13a程序实例_关于ATtiny13A的程序
  15. 互融云汽车融资租赁系统-汽车金融软件开发
  16. 能够更便捷管理菜单栏图标的Bartender 4 Mac中文版
  17. NOIP2018酱油记
  18. 如果让我重新读次研究生—王泛森
  19. 自学 Python后端开发 到什么程度可以找工作
  20. dom node and html element,DOM parentNode和parentElement之间的区别

热门文章

  1. 求指教、。。。关于调用so文件
  2. magento模板 -- 如何安装magento模板
  3. 使用目录服务和 Visual C# .NET 向本地系统添加用户
  4. Kinect开发笔记之五使用PowerShell控制Kinect
  5. mac word 设置语言_如何更改Mac的语言和区域设置
  6. 7.16 10.19-10.22
  7. leetcode 66 Plus One
  8. 从shiro源码角度学习工厂方法设计模式
  9. IE8采用IE7模式
  10. Mybatis——返回类型为 集合嵌套集合 应该如何处理