Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程,仅作探讨。不过由于篇幅有限,完整的DevOps,我们后续独立探讨。  

为了降低容器的使用门槛以及便于大家将容器技术应用于开发和实践,当前教程大部分线上实践结合TKE(腾讯云容器服务)来进行讲解和实践。当本系列内容讲解完成后,笔者将再单独讲解Kubernetes(k8s)。

最后,长沙技术社区第一次线下交流会将在2019年3月10日下午2点开始,有兴趣的朋友可以参与交流。名额有限,详见《长沙.NET技术社区活动通知》。



目录  


  • 使用TeamCity来完成内部CI、CD流程1

  • 一个简单的CI、CD流程1

  • 关于TeamCity2

  • 官方镜像4

  • 使用腾讯云容器服务(TKV)搭建和托管TeamCity4

  • 创建TeamCity Server容器服务4

  • 创建Teamcity Agent代理服务7

  • 连接和配置Agent9

  • 创建项目以及配置CI10



使用TeamCity来完成内部CI、CD流程 

 

640?wx_fmt=jpeg


本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置。至于完整的DevOps,我们后续独立探讨。



一个简单的CI、CD流程

  

以下分享一个简单的CI、CD流程(仅供参考):


640?wx_fmt=png

 


注意

本流程需要使用git进行代码版本管理,推荐使用TFS搭建自己的代码版本库。自动部署推荐使用腾讯云镜像触发器实现,此步骤也可以使用脚本实现,如果是普通的.NET代码,推荐编写webdeploy命令脚本来完成自动部署。通知推荐大家使用钉钉机器人。


本流程仅作参考,后续笔者会独立一篇来讲解整个DevOps流程,以及项目(产品)渠道消息集成这块,这里仅作抛砖引玉,同时大家也可以更易于理解,容器技术大大简化CI、CD流程!



关于TeamCity


TeamCity是一款成熟的CI服务器,来自JetBrains公司。JetBrains已经在软件开发世界中建立了权威,他们的工具如WebStorm和ReSharper正被全球的开发者所使用。

TeamCity在它的免费版本中提供了所有功能,但仅限于20个配置和3个构建代理。额外的构建代理和构建配置需要购买,你可以在这里找到价格。

TeamCity安装后即可使用,可以在多种不同的平台上工作,并支持各种各样的工具和框架。 能够支持JetBrains和第三方公司开发的公开的插件。尽管是基于Java的解决方案,TeamCity在众多的持续集成工具中提供了最好的.NET支持。TeamCity也有多种企业软件包,可以按所需代理的数量进行扩展。

TeamCity分为专业版和企业版,专业版免费,支持100个构建配置,允许完全访问产品的所有功能,足够小团队小公司来完成自己的CI流程的构建了。

640?wx_fmt=png


 

下载地址:

https://www.jetbrains.com/teamcity/download/#section=section-get


TeamCity可以通过执行文件安装,也可以在Docker容器中运行。本篇教程主要讲解通过腾讯云容器服务(TKV)来搭建和托管TeamCity环境。


640?wx_fmt=png

 


官方镜像 

 

官方镜像地址:

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  


创建TeamCity Server容器服务

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,如下图所示(注意是直接输入):

640?wx_fmt=png


2. 配置数据卷。

数据卷我们这里选择云硬盘,其中“vol”为硬盘命名:

640?wx_fmt=png

这里我们需要在云硬盘控制台添加好相应的云硬盘:

640?wx_fmt=png


3. 添加挂载点,以保存数据和日志内容,如下图所示:

640?wx_fmt=png

其中“vol”为刚创建的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。


4. 配置端口映射

TeamCity Server的默认端口为8111,我们可以这么来配置:

 

640?wx_fmt=png

如果我们需要将8111映射为80端口,我们可以这么配置:

640?wx_fmt=png


5. 点击【创建服务】按钮,创建服务

创建完成后,可以在服务列表看到我们所创建的服务:


640?wx_fmt=png

注意

至此,TeamCity Server服务创建完成。刚才我们在服务访问方式中选择了【提供公网访问】,TKV自动为我们创建了一个负载均衡实例,以提供外网访问。这时,我们使用IP即可访问对应的服务。


如刚创建的:

640?wx_fmt=png

 

创建Teamcity Agent代理服务

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容器镜像,以及推送镜像。


TeamCity Agent基础镜像包括

由于在接下来的步骤中需要使用到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代理服务

创建TeamCity Agent容器服务主要分为以下几个步骤:

1. 创建服务,设置镜像

镜像名称为:jetbrains/teamcity-agent,如下图所示(注意是直接输入):

640?wx_fmt=png


2. 配置数据卷。

数据卷我们这里选择使用本地硬盘,主要是为了讲解数据卷的不同类型:


640?wx_fmt=png


使用本地硬盘有两种形式:

· 指定源路径(HostPath),将容器所在宿主机的文件目录挂载到容器指定的挂载点中,如容器需要访问/etc/hosts则可以使用HostPath映射/etc/hosts等场景。

· 空的源路径(EmptyDir),用于容器的数据的临时存储,如基于磁盘的排序场景等。

也就是我们留空也可以。


3. 添加挂载点,以保存数据,如下图所示:

640?wx_fmt=jpeg

其中“vol”、“dockervol”为刚创建的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。


4. 配置环境变量

如下图所示,我们还需配置以下环境变量:

640?wx_fmt=png

AGENT_NAME

代理实例名称(授权时会显示)

SERVER_URL

服务端UI

DOCKER_IN_DOCKER

Docker内部启动Docker


5. 配置特权级容器

此选项在TKV容器服务的高级设置中,如图所示:

640?wx_fmt=png


6. 配置端口映射

640?wx_fmt=png

这里我们无需提供公网访问,因此选择【仅在集群内访问】即可。端口映射这块,Agent的默认端口为9090。


7. 点击【创建服务】按钮,创建服务

创建完成后,可以在服务列表看到我们所创建的服务:

640?wx_fmt=png



连接和配置Agent 


Server和Agent配置完成后,我们可以访问Server站点,完成初始化工作。然后,我们需要配置好Agent。

打开Agents界面,可以看到我们刚创建的Agent:

640?wx_fmt=png


这时,我们需要先进行授权,也就是打开【Unauthorized】面板,点击【Authorize】按钮:

640?wx_fmt=png

授权成功后,我们就可以看见已连接的代理了:

 

640?wx_fmt=png

接下来,才可以开始搞事情。



创建项目以及配置CI  


项目创建界面如下所示:

 

640?wx_fmt=png

推荐大家使用git来管理自己的代码。这里我们可以添加我们的代码仓库地址,如果是私有库,还需要配置账号密码。简单步骤我们这里略过,然后接下来TeamCity会扫描源代码,来提供推荐的构建步骤: 

640?wx_fmt=png


这里我们可以勾选我们需要的步骤,或者自己来创建符合自己需要的步骤。

注意

使用Docker托管的Agent服务镜像并不支持PowellShell。如果选择了不支持的步骤,将无法使用刚才我们创建的Agent执行代码构建。


这里,我们可以添加几个简单的步骤:

640?wx_fmt=png


步骤1、2使用Docker构建Docker镜像,相关参考界面如下所示:

640?wx_fmt=png


步骤3则使用CMD命令发送钉钉消息,以通知团队:

640?wx_fmt=png


通知结果如下图所示:

640?wx_fmt=png

接下来,我们就可以配置触发器、失败条件判断以及参数等其他配置。整个构建步骤配置起来非常简单,大家也可以结合我之前的CI教程来完善配置,比如添加对镜像推送的步骤等。

完成之后,我们就可以尝试着运行构建,并且查看构建历史:

640?wx_fmt=png


整个构建详情我们也可以直接查看:

640?wx_fmt=png 

包括构建日志:

640?wx_fmt=png

在这个过程中,可能大家需要用到一些构建参数、环境变量等等,我们可以打开对应agent的Agent Parameters面板来查看详情:

640?wx_fmt=png

640?wx_fmt=png

 

往期文章一览


Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

Docker最全教程——从理论到实战(五)

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战(七)

Docker最全教程——从理论到实战(八)    

Docker最全教程——从理论到实战(九)

Docker最全教程之使用Tencent Hub来完成CI(十)
Docker最全教程——数据库容器化(十一)
Docker最全教程——数据库容器化之持久保存数据(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜实战(十四)

Docker最全教程之Ubuntu下安装Docker(十五)

Docker最全教程之树莓派和Docker(十六)



640?wx_fmt=png转载是一种动力 分享是一种美德640?wx_fmt=gif

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


QQ群:

编程交流群<85318032> 

产品交流群<897857351>


长沙线下技术社区已经创建,有兴趣者可以通过客服加群。接下来,我们会定期组织一些线下技术交流分享会,以飨大家。


640?wx_fmt=png640?wx_fmt=jpeg

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

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

相关文章

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质&#xff1a;vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献&#xff0c;当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然&#xff0c;编号更大的点不会比 vvv 先删去&#xff0c;所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代&#xff0c;究竟谁主沉浮&#xff1f;当这个系列本来打算是写人物的&#xff0c;而且是写我们身边那些优秀的开发者&#xff0c;然而当第一篇文章&#xff0c;写的是关于我们长沙.NET社区的优秀开发者邹琼俊&#xff0c;发表在博客园之后&#xff0c;有一…

Asp.NETCore轻松学系列阅读指引目录

前言耗时两个多月&#xff0c;坚持写这个入门系列文章&#xff0c;就是想给后来者更好更快的上手体验&#xff0c;这个系列可以说是从入门到进阶&#xff0c;适合没有 .NETCore 编程经验到小白同学&#xff0c;也适合从 .NET Framework 迁移到 .NETCore 的朋友。本系列从安装环…

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题&#xff0c;对于小型微服务应用&#xff0c;客户端与微服务可以使用直连的方式进行通信&#xff0c;但对于对于大型的微服务应用我们将不得不面对以下问题&#xff1a;如何降低客户端到后台的请求数量&#xff0c;并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意&#xff1a; 每个边有权值&#xff0c;求树的直径 题解&#xff1a; 两遍dfs可以求&#xff0c;这里用树形dp的方法&#xff0c;我们将1作为根节点来看这棵树 我们可以将点看作是钉子&#xff0c;边就是挂在钉子上的绳子&#xff0c;我们只…

.NET/C# 获取一个正在运行的进程的命令行参数

在自己的进程内部&#xff0c;我们可以通过 Main 函数传入的参数&#xff0c;也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。但是&#xff0c;可以通过什么方式来获取另一个运行着的程序的命令行参数呢&#xff1f;进程内部获取传入参数的方法&#xff0c;可以…

听说,霸都.NET技术社区准备搞线下聚会了?

.NET Core实战项目交流群日常交流嗨&#xff0c;你听说了没有&#xff1f;霸都.NET技术社区准备搞线下聚会了&#xff01;啥时候的事情啊&#xff1f;最近才知道的消息啊&#xff01;那你是从哪里知道的消息呢&#xff1f;.NET Core项目实战交流群&#xff08;637326624&#x…

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

解析 它还真的不难。 乐。 这题没做出来有些谔谔。 外层wqs二分显而易见&#xff0c;里面不知道为啥我总觉得这个题可以贪心。 然后一直试图在原树直径上下功夫&#xff0c;一筹莫展。 看到题解“dp”两个字这题也就做完了… 就相当于要把一棵树分成若干条无交链&#xff0c;每…

ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

标题&#xff1a;ASP.NET Core中实现单体程序的事件发布/订阅作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10468058.html项目源代码&#xff1a;https://github.com/lamondlu/EventHandlerInSingleApplication背景事件发布/订阅是一种非常强大…

Joy of Handcraft Gym - 102822J(线段树或差分)

Joy of Handcraft Gym - 102822J 题意&#xff1a; 每个灯有亮的周期和亮度&#xff0c;问1~m这段时间灯光最亮是多少 题解&#xff1a; 线段树维护区间最大值 根据灯的周期向这段区间加亮度k&#xff0c;然后利用线段树维护区间最大值 但是这样会超时&#xff0c;加个小优…

.NET Core 使用 HttpClient SSL 请求出错的解决办法

问题使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常&#xff0c;并且证书已经传入。下面就是问题代码&#xff1a;public class Program{public static void Main(string[] args){var url &quo…

微软4年后重登市值第一,纳德拉如何做到的?

他用4年多时间将微软的市值提高了5000亿美元&#xff0c;超越苹果再次成为全球市值最高的上市公司。译 | 达达萨提亚纳德拉&#xff08;Satya Nadella&#xff09;2014年刚刚执掌微软时&#xff0c;微软当时是一个日渐没落的帝国。但在他领导的4年多时间里&#xff0c;微软百花…

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

首先说声抱歉&#xff0c;可能是因为假期综合症&#xff08;其实就是因为懒哈&#xff09;的原因&#xff0c;已经很长时间没更新博客了&#xff0c;现在也调整的差不多了&#xff0c;准备还是以每周1-2篇的进度来更新博客&#xff0c;并完成本项目所有功能。言归正传&#xff…

NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会...

前言日志&#xff0c;一直以来都是开发人员和运维人员最关心的问题。开发人员可通过日志记录来协助问题定位&#xff0c;运维人员可通过日志发现系统隐患&#xff0c;故障等定位问题。如果你的系统中没有日志&#xff0c;就像一个断了线的风筝&#xff0c;你永远不知道它会的落…

.NET Core 中的 Generic Host快速使用指南

本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在创建的ASPNETCORE项目中&#xff0c;我们可以在Main()中看见&#xff0c;我们通过IWebHostBuild创建了一个IWebHost&#xff0c;而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建…

微软一顿操作猛如虎,PowerShell 排名直线上升

近日&#xff0c;TIOBE 发布了 2019 年 3 月编程语言排行榜&#xff0c;PowerShell 首次进入到了榜单的 Top 50 中&#xff0c;排在第 45 位。PowerShell 是运行在 Windows 操作系统上实现对系统以及应用程序进行管理自动化的命令行脚本环境。&#xff08;PowerShell 排在了 TI…

AcWing 201. 可见的点

AcWing 201. 可见的点 题意&#xff1a; 题解&#xff1a; 我们先说结论:坐标(i,j)&#xff0c;如果i和j互质&#xff0c;说明该坐标为可见 为什么&#xff1f; 我们想想什么样的坐标可见&#xff0c;什么样的会被挡住。光线是一个直线&#xff0c;在同一个直线上的点会被第一…

ocelot 自定义认证和授权

Intro最近又重新启动了网关项目&#xff0c;服务越来越多&#xff0c;每个服务都有一个地址&#xff0c;这无论是对于前端还是后端开发调试都是比较麻烦的&#xff0c;前端需要定义很多 baseUrl&#xff0c;而后端需要没有代码调试的时候需要对每个服务的地址都收藏着或者记在哪…