最佳实践Jenkins 2.0多分支Pipeline改造
Posted 云开源
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最佳实践Jenkins 2.0多分支Pipeline改造相关的知识,希望对你有一定的参考价值。
最
实
Jenkins 2.0多分支Pipeline框架改造实践,主要从背景描述、关键技术、方案框架等环节进行阐述。
0.需求背景
针对项目托管仓库多个分支的版本维护困难的问题,当前主流的做法是参数化+手动构建的方式实现。
同时,当前组件都是基于1.X 构建JOB配置,对大多数CI组件来说,希望能保持现有可视化配置,实现组件包的构建打包。
本方案通过脚本自动拉取分支后,能自动监测到新添加分支,完成该分支的版本构建、部署、测试和上传制品库。
1. 关键技术考虑
Jenkins 2.0新特性
Pipeline
Jenkins2.0支持三种类型的Pipeline:普通Pipeline,MultibranchPipeline和Organization Folders。后两种其实是批量创建一组普通Pipeline的快捷方式,分别对应于多分支的应用和多应用的大型组织。
Pipeline设计三个基本概念:
Stage: 一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
Node: 一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
Step:Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。
Multibranch Plugin
该插件通过指定托管仓库,提供Jenkinsfile后,系统会自动监控该仓库上的分支,通过配置规则对满足条件的分支运行Jenkinsfile脚本,实现项目版本的构建、部署、测试、发布等pipeline环节。
2.总体框架
总体框架如下,支持两个场景触发操作:
1.拉取版本:
版本管理员通过Jenkins Job拉取新版本,分支名称为待发布版本号,MulitiBranch Plugin扫描到该变更后,执行Pipeline进行构建、打包、部署、测试和上传制品库;
2.发布版本:
版本管理员从制品库选择可用版本进行发布。
框架包含三部分:
1.分支拉取
该部分由版本管理员触发,脚本自动关联项目各托管仓库,拉取相应分支,分支名称为版本号,脚本主体实现通过如下命令实现:
git ls-remote
git pull
git checkout
git push
2.pipeline框架
基于Mulitbranch Plugin,自动监控Gerrit/git上新创建分支,扫描并执行Jenkinsfile,由于项目涉及各组件JOB是各自配置的,框架需要按如下规则扫描出满足条件的组件JOB进行构建,参数为版本号:
业务JOB名称必须满足如下必要条件:
指定项目名称前缀,如project1基础上以”project1Version_“前缀命名
指定构建后缀,如VMAX侧匀.以”_Package“后缀。
3. 业务组件JOB构建
统一使用git Parameter插件提供JOB的参数化构建,以版本名称拉取分支名称,组件版本构建时支持选择指定分支进行版本构建,统一使用GIT Parameter插件进行构建,其中参数名为project1_BRANCH,与框架传入的参数保持一致。
3.Pipeline环节实践
1. 并发构建
通过jenkins pipeline groovey提供API(需要预研穿刺),模式匹配到满足条件的JOB后,参数化进行构建,参数为构建的分支名称。其核心代码如下:
def jobs(jobRegexp) {
Jenkins.instance.getAllItems()
.grep { it.name ==~ ~"^${jobRegexp}" }
.collect { [ name : it.name.toString(),
fullName : it.fullName.toString() ]}
}
def transformIntoStep(jobFullName) {
return{
build job: jobFullName,
parameters: [[$class: 'GitParameterValue', name: 'project1_BRANCH', value: "${BuildBranch}"]]
}
}
def j = jobs('^project1Version.*Package')
for (int i=0; i < j.size(); i++) {
print "jobs:${j[i].name}"
stepsForParallel["${j[i].name}"] = transformIntoStep(j[i].fullName)
}
parallel stepsForParallel
2. 校验打包
提供统一的打包组件版本ZIP包后添加校验,各组件的make.sh脚本最后增加一个组件(带路径)文件清单,在版本ZIP包构建完成后,调用VerifyPackage.sh遍历清单中的文件条目进行检测,如果ZIP包中不存在清单文件,则校验失败,示例如下:
PKG_PATH="./vmax-vmaxplat_$version_num.zip"
VERIFY_FILE_PATH_LIST="
vmaxplat/vmaxplat.model/dbscript/install/mysql/dapmanager-config_frame-vmaxplat.sql
vmaxplat/vmaxplat/bin/uninstallrole.sh
vmaxplat/vmaxplat/vmaxict$version_num.zip
"
./VerifyPackage.sh $PKG_PATH $VERIFY_FILE_PATH_LIST
if [ $? -ne 0 ]; then
echo ERROR-**********$PKG_PATH file list verify failed.**********
exit 1
else
exit 0
fi
3. 自动化部署
具体需要各项目自己适配置,如大数据的自动化框架,根据领域Scala语言特性,打造使用REST调用的自动化测试基础框架,支持用例管理、日志分析、CI对接等功能。
4. 自动化测试
提供通用的测试框架,输出结果如Junit风格,方便CI集成和问题定位。
5. 制品库发布
利用公司制品库进行版本发布。
实施收益
4.收益
1.自动化的版本管理
本实践基于Jenkins2.0提供新插件进行二次开发,提取一套公共框架实现版本的自动拉取与构建测试,并在测试通过后上传制品库。
2.支持组件级构建解耦
对于一个涉及多组件的大项目来说,该框架支持业务组件仍使用原有的JOB配置方式,做到组件的CI JOB维护保留原有方式不变,项目新的Pipeline和老CI构建的兼容。
|中兴通讯
|云开源
为你打开云开源世界的大门
以上是关于最佳实践Jenkins 2.0多分支Pipeline改造的主要内容,如果未能解决你的问题,请参考以下文章