Azure DevOps Server CI - 自搭跨平台容器代理Agents

前言

最近在地端(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的部分來著墨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core 认证组件源码解析

不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Core是个非常优秀的框架,如果各位是从WebForm开始,一步步走到今天,自然而然就会发现.微软慢慢的开始将…

在.NET Core下的机器学习--学习笔记

摘要.NET Core 在机器学习的应用场景&#xff0c;除了 ML .NET 还会介绍一个非常棒的開源技術 TensorFlow .NET &#xff0c; Keras .NET.讲师介绍本课内容人工智能介绍ML .NETICSharpCoreTensorFlow .NETKeras .NETSciSharp人工智能应用图像识别/物体识别自然语言/翻译搜索/知…

asp.net core 自定义基于 HttpContext 的 Serilog Enricher

asp.net core 自定义基于 HttpContext 的 Serilog EnricherIntro通过 HttpContext 我们可以拿到很多有用的信息&#xff0c;比如 Path/QueryString/RequestHeader 等请求信息, StatusCode/ResponseHeader 等响应信息&#xff0c;借助 HttpContext 我们可以在日志中记录很多有用…

我的 .NET Core 博客性能优化经验总结

点击上方蓝字关注“汪宇杰博客”导语去年8月&#xff0c;我用 .NET Core 重写了我的博客系统。经过一年多的优化&#xff0c;服务器响应速度从上线时候的 80ms 提高到了现在的 8ms&#xff0c;十倍提速。可惜由于部署在国外&#xff0c;自然不可抗力会导致中国用户晚上访问速度…

Redis 6 RC1发布,带来众多新特性

Redis 6 RC1 发布了&#xff0c;项目创建人 antirez 在博客中介绍&#xff0c;这是迄今最“企业”化的版本&#xff08;SSL 与 ACL 等特性与企业极相关&#xff09;&#xff0c;也是最大的版本&#xff0c;同时也是参与人数最多的版本。GA 版本预计在明年三月到五月之间发布。R…

Serverless那么火,2019年的采用如何?

传统的 IT 架构已经不适合当今快速发展的数字经济环境。技术顾问 Declan Morris 表示&#xff1a;“客户不仅期望零停机时间&#xff0c;而且要求应用程序无论在世界任何地方都具有一致的性能。”他还预测到&#xff0c;接下来是 Serverless 计算和函数即服务&#xff08;FaaS&…

【C】Natasha 插件编程

文章转载授权级别&#xff1a;CNatasha 是一个代替 Emit / Expression 的动态构建项目&#xff0c;旨在为开发者提供方便、快捷、高性能的动态构建服务&#xff0c;动态编程是生态的重要组成部分&#xff0c;希望开发者们能有足够的兴趣来了解、使用、建设它。1、插件生成使用 …

二叉树先序,中序,后序,层次遍历(数据结构)

先序遍历 先序遍历可以想象为&#xff0c;一个小人从一棵二叉树的根节点为起点&#xff0c;沿着二叉树的外沿&#xff0c;逆时针走一圈回到根节点&#xff0c;路上遇到的元素顺序&#xff0c;就是先序遍历的结果 先序遍历的结果为&#xff1a;A B D H I E J C F K G 中序遍…

.NET Core 在 K8S 上的开发实践--学习笔记

摘要本主题受众是架构师&#xff0c;开发人员&#xff0c;互联网企业 IT 运维人员。大纲&#xff1a;1、 K8S 对应用的要求&#xff1b;2、 .NET Core 上 K8S 的优势&#xff1b;3、 K8S 下的 .NET Core 配置&#xff1b;4、 .NET Core 上分布式组件概览。大纲kubernetes 对应用…

.NetCore 3.1 安装本地化中文智能提示

A、平时在群里&#xff0c;很多小伙伴都会问&#xff0c;.net core的智能提示和注释都是英文的&#xff0c;如果英语水平不是很高的&#xff0c;看着是挺麻烦&#xff0c;所以经常需要在身边有一个翻译软件&#xff0c;如果有汉化的中文智能提示就好了&#xff08;当然&#xf…

asp.net core 3.x Endpoint终结点路由1-基本介绍和使用

前言我是从.net 4.5直接跳到.net core 3.x的&#xff0c;感觉asp.net这套东西最初是从4.5中的owin形成的。目前官方文档重点是讲路由&#xff0c;没有特别说明与传统路由的区别&#xff0c;本篇主要介绍终结点路由的相关概念和如何使用&#xff0c;不会详细介绍路由&#xff0c…

共享后缀的链表

有一种存储英文单词的方法&#xff0c;是把单词的所有字母串在一个单链表上。为了节省一点空间&#xff0c;如果有两个单词有同样的后缀&#xff0c;就让它们共享这个后缀。下图给出了单词“loading”和“being”的存储形式。本题要求你找出两个链表的公共后缀。 函数接口定义&…

C#反射与特性(一):反射基础

1. 说明1.1 关于反射、特性在 《C# 7.0 本质论》中&#xff0c;关于这方面的知识在 《第十八章 反射、特性和动态编程》&#xff1b;在《C# 7.0 核心技术指南》中&#xff0c;这部分内容在《第19章 反射和元数据》。[图片来自 《C# 7.0 本质论》]在这里我们可以获得一些关联性很…

收藏!推荐12个超实用的Visual Studio插件

工欲善其事&#xff0c;必先利其器,整理的一些我必装的12款Visual Studio插件&#xff0c;希望你们能get到。效率工具前文传送门&#xff1a;推荐&#xff1a;程序员必装的10款谷歌插件程序员必备的8个学习工具99%的人不知道搜索引擎的6个技巧01 CodeMaidCodeMaid快速整理代码文…

搭建独立博客,这款评论插件不能错过

微信公众号因为申请的时间晚&#xff0c;一直到现在都无法开通评论功能&#xff0c;之前博客一直使用的多说作为评论系统&#xff0c;自从多说关闭后&#xff0c;好多年都处于无评论状态&#xff0c;最近发现 gitalk 还不错&#xff0c;所以在博客中进行了对 gitalk 的集成&…

最大堆和最小堆(数据结构)

堆和栈的区别&#xff1a; 一、空间分配区别&#xff1a; 栈&#xff08;操作系统&#xff09;&#xff1a;由操作系统自动分配释放&#xff0c;存放函数的参考值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈堆&#xff08;操作系统&#xff09;&#xff1a;一…

2019公众号总结之——Top100 技术文章汇总

大家好&#xff0c;我是张善友。新年伊始&#xff0c;我们在欢送10年代的同时迎来了20年代。在这个崭新的时代&#xff0c;感谢各位朋友一直关注“dotnet跨平台”。一晃5年有余&#xff0c;关注公众号的粉丝6万&#xff0c;相对于.NET开发人员&#xff0c;希望2020年有更多小伙…

树,森林,二叉树的互相转换

树、森林到二叉树的转换 将树转换为二叉树 树中每个结点最多只有一个最左边的孩子&#xff08;长子&#xff09;和一个右邻的兄弟。按照这种关系很自然地就将树转换成相应的二叉树&#xff1a; 在所有兄弟结点之间加一连线对每个结点&#xff0c;除了保留与其长子的连线外&am…

数据丢失引起宕机怎么办?

做过系统开发和运维的朋友&#xff0c;应该最怕数据丢失问题出现&#xff0c;更严重的是造成无法恢复的糟糕境地&#xff0c;简直叫人崩溃啊&#xff0c;这周有一个朋友跟我咨询这方面的事情&#xff0c;就整理了一下数据库自动异地备份的方法&#xff0c;分享给大家。大家都知…

ASP.NET Core跨平台技术内幕

ASP.NET Core设计初衷是开源跨平台、高性能Web服务器&#xff0c;其中跨平台特性较早期ASP.NET是一个显著的飞跃&#xff0c;.NET现可以理直气壮与JAVA同台竞技&#xff0c;而ASP.NET Core的高性能特性更是成为致胜法宝。ASP.NET Core 2.1为IIS托管新增In-Process模型并作为默认…