本篇教程主要讲解基于容器服务搭建TeamCity服务,而且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程,仅做探讨。不过因为篇幅有限,完整的DevOps,咱们后续独立探讨。 git
为了下降容器的使用门槛以及便于你们将容器技术应用于开发和实践,当前教程大部分线上实践结合TKE(腾讯云容器服务)来进行讲解和实践。当本系列内容讲解完成后,笔者将再单独讲解Kubernetes(k8s)。web
最后,长沙技术社区第一次线下交流会将在2019年3月10日下午2点开始,有兴趣的朋友能够参与交流。名额有限,详见《长沙.NET技术社区活动通知》。sql
使用TeamCity来完成内部CI、CD流程1docker
一个简单的CI、CD流程1ubuntu
关于TeamCity2windows
官方镜像4服务器
使用腾讯云容器服务(TKV)搭建和托管TeamCity4负载均衡
建立TeamCity Server容器服务4框架
建立Teamcity Agent代理服务7ionic
链接和配置Agent9
建立项目以及配置CI10
本篇教程主要讲解基于容器服务搭建TeamCity服务,而且完成内部项目的CI流程配置。至于完整的DevOps,咱们后续独立探讨。
如下分享一个简单的CI、CD流程(仅供参考):
注意
本流程须要使用git进行代码版本管理,推荐使用TFS搭建本身的代码版本库。自动部署推荐使用腾讯云镜像触发器实现,此步骤也可使用脚本实现,若是是普通的.NET代码,推荐编写webdeploy命令脚原本完成自动部署。通知推荐你们使用钉钉机器人。
本流程仅做参考,后续笔者会独立一篇来说解整个DevOps流程,以及项目(产品)渠道消息集成这块,这里仅做抛砖引玉,同时你们也能够更易于理解,容器技术大大简化CI、CD流程!
TeamCity是一款成熟的CI服务器,来自JetBrains公司。JetBrains已经在软件开发世界中创建了权威,他们的工具如WebStorm和ReSharper正被全球的开发者所使用。
TeamCity在它的免费版本中提供了全部功能,但仅限于20个配置和3个构建代理。额外的构建代理和构建配置须要购买,你能够在这里找到价格。
TeamCity安装后便可使用,能够在多种不一样的平台上工做,并支持各类各样的工具和框架。 可以支持JetBrains和第三方公司开发的公开的插件。尽管是基于Java的解决方案,TeamCity在众多的持续集成工具中提供了最好的.NET支持。TeamCity也有多种企业软件包,能够按所需代理的数量进行扩展。
TeamCity分为专业版和企业版,专业版免费,支持100个构建配置,容许彻底访问产品的全部功能,足够小团队小公司来完成本身的CI流程的构建了。
下载地址:
https://www.jetbrains.com/teamcity/download/#section=section-get
TeamCity能够经过执行文件安装,也能够在Docker容器中运行。本篇教程主要讲解经过腾讯云容器服务(TKV)来搭建和托管TeamCity环境。
官方镜像地址:
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这边须要使用到数据卷作持久化,那么在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,以下图所示(注意是直接输入):
2. 配置数据卷。
数据卷咱们这里选择云硬盘,其中“vol”为硬盘命名:
这里咱们须要在云硬盘控制台添加好相应的云硬盘:
3. 添加挂载点,以保存数据和日志内容,以下图所示:
其中“vol”为刚建立的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。
4. 配置端口映射
TeamCity Server的默认端口为8111,咱们能够这么来配置:
若是咱们须要将8111映射为80端口,咱们能够这么配置:
5. 点击【建立服务】按钮,建立服务
建立完成后,能够在服务列表看到咱们所建立的服务:
注意
至此,TeamCity Server服务建立完成。刚才咱们在服务访问方式中选择了【提供公网访问】,TKV自动为咱们建立了一个负载均衡实例,以提供外网访问。这时,咱们使用IP便可访问对应的服务。
如刚建立的:
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容器镜像,以及推送镜像。
因为在接下来的步骤中须要使用到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容器服务主要分为如下几个步骤:
1. 建立服务,设置镜像
镜像名称为:jetbrains/teamcity-agent,以下图所示(注意是直接输入):
2. 配置数据卷。
数据卷咱们这里选择使用本地硬盘,主要是为了讲解数据卷的不一样类型:
使用本地硬盘有两种形式:
· 指定源路径(HostPath),将容器所在宿主机的文件目录挂载到容器指定的挂载点中,如容器须要访问/etc/hosts则可使用HostPath映射/etc/hosts等场景。
· 空的源路径(EmptyDir),用于容器的数据的临时存储,如基于磁盘的排序场景等。
也就是咱们留空也能够。
3. 添加挂载点,以保存数据,以下图所示:
其中“vol”、“dockervol”为刚建立的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。
4. 配置环境变量
以下图所示,咱们还需配置如下环境变量:
AGENT_NAME |
代理实例名称(受权时会显示) |
SERVER_URL |
服务端UI |
DOCKER_IN_DOCKER |
Docker内部启动Docker |
5. 配置特权级容器
此选项在TKV容器服务的高级设置中,如图所示:
6. 配置端口映射
这里咱们无需提供公网访问,所以选择【仅在集群内访问】便可。端口映射这块,Agent的默认端口为9090。
7. 点击【建立服务】按钮,建立服务
建立完成后,能够在服务列表看到咱们所建立的服务:
Server和Agent配置完成后,咱们能够访问Server站点,完成初始化工做。而后,咱们须要配置好Agent。
打开Agents界面,能够看到咱们刚建立的Agent:
这时,咱们须要先进行受权,也就是打开【Unauthorized】面板,点击【Authorize】按钮:
受权成功后,咱们就能够看见已链接的代理了:
接下来,才能够开始搞事情。
项目建立界面以下所示:
推荐你们使用git来管理本身的代码。这里咱们能够添加咱们的代码仓库地址,若是是私有库,还须要配置帐号密码。简单步骤咱们这里略过,而后接下来TeamCity会扫描源代码,来提供推荐的构建步骤:
这里咱们能够勾选咱们须要的步骤,或者本身来建立符合本身须要的步骤。
注意:使用Docker托管的Agent服务镜像并不支持PowellShell。若是选择了不支持的步骤,将没法使用刚才咱们建立的Agent执行代码构建。
这里,咱们能够添加几个简单的步骤:
步骤一、2使用Docker构建Docker镜像,相关参考界面以下所示:
步骤3则使用CMD命令发送钉钉消息,以通知团队:
通知结果以下图所示:
接下来,咱们就能够配置触发器、失败条件判断以及参数等其余配置。整个构建步骤配置起来很是简单,你们也能够结合我以前的CI教程来完善配置,好比添加对镜像推送的步骤等。
完成以后,咱们就能够尝试着运行构建,而且查看构建历史:
整个构建详情咱们也能够直接查看:
包括构建日志:
在这个过程当中,可能你们须要用到一些构建参数、环境变量等等,咱们能够打开对应agent的Agent Parameters面板来查看详情: