《CI/CD(持续集成构建/持续交付):如何测试/集成/交付项目代码?(Jenkins,TravisCI)》

《什么是DevOps?人员,流程和产品的结合,过程、方法与系统的统称》

Table of Contents

概述:

相关工具:

环境需求

步骤概要

构建用于执行Packer命令的DockerIamge

上传semantic-devlivery-gitlab镜像到Harbor

在Gitlab中创建Access Token

创建项目,并提交所有代码到仓库中

修改.gitlab-ci.yml配置文件

标准git commit消息格式

验证执行过程和结果

添加定时任务

[可选]Windows镜像集成最新补丁

完成


概述:

从2月份开始的[模版自动化系列],已通过一系列的文章熟悉多种虚拟机模版的自动化构建,但在企业实际环境中模版的数量会远远超过这些,此时单一通过shell进行管理和更新,依然非常复杂和繁琐的(虽然相比以前已经有了很大的提高)。现在把自己基于GitOps的方式来管理模版分享出来,进一步提高模版的构建和管理效率,本篇文章将介绍如何通过GitLab CI/CD对模版进行自动化管理。

对于模版保存还存在一个重要的难题需要解决,那就是当云平台或其他自动调用的时候,并不是通过模版名称进行识别,那仅仅通过名称更新模版,就会导致其他系统无法正确识别新模版。vCenter 6.5开始支持模版更新,此特性正解决了我们遇到的问题,并且Packer也是在8月底的版本支持此特性(OVF模版)。使用vCenter内容库还有一个好处,内容库支持订阅,在企业内部如果包含多个vCenter环境的情况下,只需构建一次即可。

通过之前的文章大家对模版构建已经很熟悉了,为了提高移动设备的阅读体验,本手册不再介绍详细的模版配置,您可以通过访问 https://github.com/6547709/gitops-packer 直接查看代码和配置。

基于GitOps自动化构建vSphere模版特性:

  1. 使用Gitlab存储模版配置文件;
  2. 基于Gitlab CI/CD实现自动化模版构建;
  3. 基于Git提交记录进行语义版本管理(feet、fix),版本号自增,并存储到模版的Notes中;
  4. 定时执行CI/CD任务实现模版变异;
  5. 采用vCenter内容库存储模版,并以-latest为后缀;
  6. 每次构建自动更新vCenter内容库模版,保持ID不变,以保证vRA云平台或其他工具调用最新模版;
  7. 所有密码和配置,通过.gitlab-ci.yml进行定义;
  8. 提供Windows2016/2019、Ubuntu1804/1910/2004、CentOS7/8等多种模版;
  9. 所有模版进行基础优化(可参考对应模版的自动应答文件);
  10. Windows模版使用ISO镜像已集成最新补丁,缩短了部署时间;
  11. 经过vSphere 7.0、Packer 1.6.4环境测试。

相关工具:

Packer:是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。

vSphere:是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。

govc:是一个基于govmomi的cli工具,实现对vSphere的远程管理。

https://github.com/vmware/govmomi

Packer-provisioner-windows-update:Windows Update for packer插件。

https://github.com/rgl/packer-provisioner-windows-update

Gitlab CI/CD:是一个CI/CD工具,与代码集成在一起工作。

https://docs.gitlab.com/ee/ci/

Semantic-delivery-gitlab:镜像用于实现语义版本管理。
Harbor:是私有Docker镜像仓库,用于存储用于执行Packer、Govc和Genisoimage的Docker镜像。

https://hub.docker.com/r/hutson/semantic-delivery-gitlab

相关代码:中包含了Gitlab CI/CD所需的所有文件。

https://github.com/6547709/gitops-packer

针对各模版的配置请参考历史的文章。
CI/CD可以根据情况选择不同工具,原理都相同。


环境需求

  • Gitlab服务器和Gitlab-Runner服务器,其中Runner运行在Docker模式;
  • 一台Windows/Linux/MacOS电脑,能够连接vCenter Server;
  • Packer程序、Govc程序、Windows Update for Packer程序;
  • 各操作系统安装镜像;
  • VMware Tools、Windows pvscsi驱动;
  • vCenter内容库;
  • Semantic-delivery-gitlab镜像;

步骤概要

  1. 搭建Harbor镜像仓库,用于存储本地镜像;
  2. 搭建Gitlab和Gitlab CI/CD相关环境,使用Docker Runner模式;
  3. 在Gitlab中创建项目,并上传相关代码、修改相关配置;
  4. 执行自动构建测试;
  5. 在Gitlab CI/CD中添加定时任务;
  6. 完成。

构建用于执行Packer命令的DockerIamge

需要先通过相关工具中的地址下载packer、govc和windows update for packer三个执行文件,存储到与Dockerfile相同的目录中,Dockerfile如下:

FROM centos:8
LABEL maintainer="Alex Li <guoqiangli@vmware.com>"
ENV PACKER_VERSION=1.6.4
ENV GOVC_VERSION=v0.23.0
ENV GOVC_INSECURE=true
ENV TIME_ZONE Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
ADD ./govc /usr/bin/
ADD ./packer /usr/bin/
ADD ./packer-provisioner-windows-update /usr/bin
RUN chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update && yum install -y  genisoimage
WORKDIR /tmp
CMD ["/bin/bash"]

使用Docker Build构建Docker Image,并上传到容器仓库(私有或公共)中:

docker build -t harbor.corp.local/library/gitops-packer:v1.0 .
docker push login harbor.corp.local
docker login -u admin harbor.corp.local
docker push harbor.corp.local/library/gitops-packer:v1.0

上传semantic-devlivery-gitlab镜像到Harbor

docker pull hutson/semantic-delivery-gitlab:9.1.0
docker tag hutson/semantic-delivery-gitlab:9.1.0
harbor.corp.local/library/semantic-delivery-gitlab:9.1.0
docker push harbor.corp.local/library/semantic-delivery-gitlab:9.1.0

在Gitlab中创建Access Token

  1. 使用个人账户登录Gitlab;
  2. 进入到用户设置->访问令牌;
  3. 填写令牌名称、到期日期和选择权限->创建个人访问令牌;
  4. 保存Token备用;

创建项目,并提交所有代码到仓库中

这里不进行详细操作说明,下面是最终仓库内容的截图:

修改.gitlab-ci.yml配置文件

此文件是Gitlab CI/CD的主配置文件,常用配置参数在此文件中定义,无需修改packer和操作系统自动应答文件。

提示1:本手册为了易读,所有敏感信息也在此配置文件中声明,强烈建议使用Gitlab项目变量进行定义,避免敏感信息泄漏。
提示2:以下代码示例已经过删减,完成代码请从Github获取。

# 环境变量定义,生产环境不建议在此配置敏感定义(例如:密码)
variables:DOCKER_DRIVER: "overlay2"GITLAB_TOKEN: "xxxxxxxxxxxxx"
# 定义用于执行packer、govc和genisoimage的Docker镜像,需要提前构建PACKER_DOCKER_IMAGE: "harbor.corp.local/library/packer-gitops:v1.0"
# 定义用于创建模板的vCenter相关信息,密码部分推荐在Gitlab的项目变量定义,以提高安全性。VC_SERVER: "vcenter.corp.local"VC_USERNAME: "Administrator@vsphere.local"VC_PASSWORD: "VMware1!"VC_DATACENTER: "Labs-DC02"VC_CLUSTER: "DC02-Cluster"VC_CONTENT_LIBRARY: "DC02-VM-Templates"VC_FOLDER: "Templates"VC_DATASTORE: "SSD_DATASTORE"
# 定义VM相关配置VM_NETWORK: "vlan100"VM_CPU: 2VM_MEM: 4096VM_DISK: 81920VM_VIDEO_RAM: 16384VM_HW_VERSION: 17
# 定义安装光盘的存储路径,Winodws系统需要根据安装光盘的不同调整自动应答文件。
# -----此处省略部分代码,从github中获取完整代码------ OS_CENTOS8_ISO: "[SSD_DATASTORE 0-ISO/CentOS-8.2.2004-x86_64-dvd1.iso"OS_WINDOWS2016_ISO: "[SSD_DATASTORE] 0-ISO/cn_windows_server_2016_vl_x64_dvd.iso"
# 定义CentOS8自动应答光盘的存储路径,每次编译会自动覆盖之前版本。OS_CENTOS8_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-ks.iso"OS_CENTOS8_GUI_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-gui-ks.iso"
# 定义VMware Tools安装路径OS_WINDOWS_VMTOOLS: "[SSD_DATASTORE] 0-ISO/VMware-tools-windows-11.1.5.iso"
# 定义Windows系统使用pvscsi驱动的路径,此文件只能同时被一个VM挂载,需要为每个Windows系统配置一个文件。OS_WIN2016_DRIVER: "[SSD_DATASTORE] 0-ISO/win2016-pvscsi-Windows8.flp"
# 定义GOVC环境变量,用于上传CentOS8自动应答的ISO(ks.cfg)GOVC_URL: ${VC_SERVER}GOVC_USERNAME: ${VC_USERNAME}GOVC_PASSWORD: ${VC_PASSWORD}
# 此配置用于定义Linux root和ops用户、Windows Administrator和ops用户的密码,密码推荐在Gitlab的项目变量定义,以提高安全性。LINUX_SSH_PASSWORD: "VMware1!"WINDOWS_PASSWORD: "VMware1!"
# 此变量用于定义虚拟机名称,最终会以-latest作为后缀存储到vCenter内容库中。CENTOS8_VM_NAME: "CentOS8"WIN2016_VM_NAME: "Win2016"# 定义Windows安装KEY,根据不同的安装版本配置。WIN2016_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX"WIN2019_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX"
#定义CI/CD的阶段,devliver阶段用于生成版本号,validate阶段用于验证packer配置文件是否正确,build-iso阶段用于CentOS8的ISO制作,并自动上传到共享存储中,,build阶段用于模版构建,list-library阶段用于列出内容库模版。
stages:- deliver- validate- build-iso- build- list-library#采用语义版本管理,基于commit消息增加版本号和生成Release文档,此阶段不会进行打包和部署,仅仅是添加版本tag。
deliver:image:name: harbor.corp.local/library/sematic-delivery-gitlab:9.1.0entrypoint: [""]stage: deliveronly:- masterscript:- semantic-delivery-gitlab --token ${GITLAB_TOKEN}#此阶段用于验证packer配置文件是否正确。
packer-validate:image:name: ${PACKER_DOCKER_IMAGE}stage: validatescript:- packer validate ./CentOS8/centos-vsphere.json- packer validate ./Win2016/win2016-vsphere.jsononly:- tagsdependencies:- deliver
#此阶段用于构建CentOS8所需的ISO文件,并上传到vSphere存储中(自动覆盖之前版本)。
#for CentOS8。
CentOS8-ks-iso-build:image:name: ${PACKER_DOCKER_IMAGE}stage: build-isoscript:- cd CentOS8- sed -i 's/__PASSWORD__/'"${LINUX_SSH_PASSWORD}"'/g' ./ks.cfg- genisoimage -o centos8-ks.iso -V "OEMDRV" ./ks.cfg- govc datastore.upload -ds ${VC_DATASTORE} centos8-ks.iso 0-ISO/centos8-ks.isoonly:changes:- CentOS8/ks.cfg
# -----此处省略部分代码,从github中获取完整代码------
#此阶段用于生成虚拟机模板,模板名基于job中变量定义,最终模板使用-latest最为后缀。
#for CentOS8。
packer-build-CentOS8:image:name: ${PACKER_DOCKER_IMAGE}stage: buildvariables:VM_NAME: ${CENTOS8_VM_NAME}script: - cd CentOS8- packer build --force centos-vsphere.jsononly:- tagsdependencies:- packer-validate
# -----此处省略部分代码,从github中获取完整代码------
#for Windows Server 2016。
packer-build-Win2016:image:name: ${PACKER_DOCKER_IMAGE}stage: buildvariables:VM_NAME: ${WIN2016_VM_NAME}OS_WINDOWS_DRIVER: ${OS_WIN2016_DRIVER}script: - cd Win2016- sed -i 's/__PASSWORD__/'"${WINDOWS_PASSWORD}"'/g' ./Autounattend.xml- sed -i 's/__LICENSEKEY__/'"${WIN2016_KEY}"'/g' ./Autounattend.xml- packer build --force win2016-vsphere.jsontimeout: 120monly:- tagsdependencies:- packer-validate
# -----此处省略部分代码,从github中获取完整代码------
#list vcenter content library。
list-content-library:image:name: ${PACKER_DOCKER_IMAGE}stage: list-libraryscript: - govc library.info -json ${VC_CONTENT_LIBRARY}/*only:- tags

标准git commit消息格式

标准且规范的commit消息不仅可以保证版本历史的可读性,还可以了解每次变更的内容和影响范围,并会自动在Release页面生成文档,所以,强烈建议采用标准的commit消息格式和内容。

fix: 当修复代码问题时,使用此标记。示例:fix: 修复Windows模版ISO文件错误。版本号变化:1.0.0->1.0.1

feat: 当新增功能或模版时,使用此标记。示例:feat: 增加Photon模版。版本号变化:1.0.0->1.1.0

[skip ci] 当不希望自动执行CI/CD时,在消息中增加此标记。示例:fix: 更新ReadME.[skip ci]。版本号变化:无变化

验证执行过程和结果

当提交变更后,Gilab CI/CD会基于.gitlab-ci.yml中的配置自动执行流水线,整个过程分为2组5个步骤:

  1. 执行语义版本管理,为代码增加tag标记;
  2. 基于tag执行packer配置文件验证、CentOS8自动应答ISO构建、镜像构建和列出内容库内容;

流水线执行过程如下图所示,共花费25分钟时间,完成8个模版的自动化构建:

登录vCenter内容库查看模版更新:

添加定时任务

在Gitlab CI/CD的计划中,添加一个每周/月的定时执行计划,添加完成后如下图所示。

[可选]Windows镜像集成最新补丁

在模版构建过程中,Windows的构建时间最长,某些情况下长达2个小时,可能会触发Gitlab CI/CD的超时和Packer的超时机制,导致任务失败。为提高模版构建效率和降低出错率,建议自行封装带有最新补丁的模版,下面是大致的制作过程,共参考。

  1. 下载DISM++工具(国人制作,图形化操作);
  2. 解压缩系统安装光盘到目录中(d:\win2016-iso),并提取解压目录下\sources\install.wim文件,拷贝到另一目录中(d:\win2016-iso);
  3. 打开DISM++工具,载入install.wim文件,挂载路径需提前创建(d:\win2016-iso\mnt);
  4. 选中载入的install.wim系统,打开会话;
  5. 使用系统安装光盘安装系统,并执行系统更新,更新完成后在已安装系统更新中(添加/删除程序)找到安装的补丁版本号;
  6. 登录到https://www.catalog.update.microsoft.com/网站,基于版本好下载补丁的msu格式文件,保存到目录中(d:\win2016-iso\msu);
  7. 在DISM++工具页面,控制面板->更新管理->添加(d:\win2016-iso\msu),并执行安装,等待安装完成(时间较长);
  8. 补丁安装完成后,DISM++->文件->另存为映像(d:\win2016-iso\new.wim)存储新的映像;
  9. 使用new.wim替换系统安装盘解压缩目录的install.wim(名称必须是install.wim);
  10. DISM++->常用工具->工具箱->ISO生成器,源选择替换install.wim文件的系统安装盘加压缩目录,目标选择d:\win2016-iso\目录,并指定新光盘名称和添加标签;
  11. DISM++->文件->卸载映像;
  12. 包含指定补丁的系统安装光盘制作完成;
  13. 上传新的ISO到共享存储中,并修改.gitlab-ci.yml文件使用新的ISO镜像路径。
  • 提示1:DISM++虽然提供系统更新的功能,但是针对Windows Server系统似乎不正常,所以建议使用手工添加补丁的方式。
  • 提示2:通过DISM工具还可以将pvscsi的驱动添加到安装光盘中,这样就无需额外添加pvscsi驱动。

完成

至此通过Gitlab CI/CD、Govc和Packer实现了vSphere环境下的模版GitOps,以后只要修改了相关配置文件,就会自动执行模版构建,由于此构建是并发执行的,效率非常高,最后,祝大家可以轻松工作和快乐生活。

GitOps—通过CI/CD自动化构建虚拟机模版相关推荐

  1. GitLab CI/CD 自动化构建与发布实践

    流程介绍 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化 ...

  2. Gitlab+Jenkins+Artifactory, CI/CD自动构建发布环境搭建使用实践

    CI/CD自动构建发布环境搭建使用实践 通过C/C++的cmake工程示例项目,构建Gitlab+Jenkins+Artifactory自动构建发布环境.其中 Gitlab提供源码仓库功能,通过web ...

  3. GitLab CI/CD 自动化部署全流程

    CI/CD简介 CI/CD 是一种持续开发软件的方法,侧重于软件开发过程中的自动化,可以不断地进行构建.测试和部署代码.使用这种方法,从新代码开发到部署,可以减少人工干预甚至不用干预 CI(Conti ...

  4. 轻量级CI/CD自动构建平台Gitea+Drone保姆级实践教程

    目录 1.关于Gitea 1.1 gitea特性 1.2 快速安装 1.2.1 环境依赖 1.2.2 安装gitea 1.2.3 启动 1.2.4 访问 1.2.5 创建一个测试仓库 2 关于Dron ...

  5. 基于K8s的CI/CD自动化持续集成部署框架

    文章目录 什么是CI/CD? 1 环境准备 2 组件部署 2.1 jenkins快速部署 2.2 gitlab快速部署 2.3 harbor快速部署 3 CI/CD交付 什么是CI/CD? CI/CD ...

  6. docker安装gitlab_Gitlab 中 CI/CD 自动化部署与使用

    今天给大家介绍一下Gitlab中CI/CD的自动化部署安装与使用. 1. docker方式安装 安装文档:https://docs.gitlab.com/runne... docker run -di ...

  7. gitlab CI/CD自动化部署

    文章目录 1. gitlab Runner 1.1 安装gitlab Runner 1.2 注册runner 2. .gitlab-ci.yml的书写 3. 部署 3.1 docker方式部署 3.2 ...

  8. 从零到一构建CI/CD的DevOps自动化流水线,需要考虑的开源项目

    构建CI/CD的DevOps自动化流水线的步骤 1.DevOps 和 CI/CD 流水线的简要介绍 2 构建CI/CD流水线需考虑的步骤 第一步:CI/CD 框架 第二步:源代码控制管理 第三步:自动 ...

  9. ci/cd自动化测试_CI / CD管道加快测试自动化的16种最佳实践

    前言: 知其然,知其所以然.相较于DevOps而言,CI/CD是一个相对具象的概念.在 IT 企业中,CI/CD的应用愈加广泛,成为推动软件研发活动的重要基础设施服务,同时推动 DevOps 模式的实 ...

最新文章

  1. 将调用密集型的 COM 组件迁移到托管代码
  2. ICLR 2020 | 如何解决图像分类中的类别不均衡问题?不妨试试分开学习表征和分类器...
  3. 【caffe】windows下caffe+vs2013+python2.7+cuda8.0+cmake3.8编译与配置
  4. ps、grep和kill联合使用杀掉进程
  5. stn算子_深度学习常用算子(二)
  6. python调用远程js_python和js交互调用的方法
  7. B.最大岛屿(dfs)
  8. 【并查集】Union Find
  9. 2017 ACM-ICPC南宁网络赛: G. Finding the Radius for an Inserted Circle
  10. WIN7系统开启无线路由共享上网功能
  11. Scratch作品(一)
  12. 澳洲穷人的生活什么样?
  13. 谈谈新加坡的教育和学区房
  14. 关于4418开发和6818开发
  15. CPU不同字母的意思
  16. 找工作需要有工作经验,而没工作就没工作经验。如何理解这种死循环?
  17. 程序员常用十大算法(四):KMP算法 与 暴力匹配算法 解决字符串匹配问题
  18. (爬取猫眼电影TOP100的电影信息(含图片、评分等))
  19. 记录:remote: You are not allowed to push code to this project...【亲测有效】
  20. 电阻式压力传感器变送器技术选型及接线图解

热门文章

  1. java.io.file.sync_java.io.FileDescriptor#sync()是否特定于单个FileDescriptor
  2. NetworkManager概述
  3. Nexus 3.X(Maven仓库私服)仓库迁移与备份
  4. [No0000FD]C# 正则表达式
  5. 背景铺满整个页面并且自适应
  6. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord
  7. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
  8. 关于外键,再唠叨一下下
  9. IE浏览器--internet选项--连接中的设置是灰色
  10. apache 的http代理出错 502 Proxy Error