最佳实践Jenkins 2.0多分支Pipeline改造

Posted 云开源

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最佳实践Jenkins 2.0多分支Pipeline改造相关的知识,希望对你有一定的参考价值。

点击上方 云开源 可以订阅哦!
【最佳实践】Jenkins 2.0多分支Pipeline改造


Jenkins 2.0多分支Pipeline框架改造实践,主要从背景描述、关键技术、方案框架等环节进行阐述。

0.需求背景

        针对项目托管仓库多个分支的版本维护困难的问题,当前主流的做法是参数化+手动构建的方式实现。

        同时,当前组件都是基于1.X 构建JOB配置,对大多数CI组件来说,希望能保持现有可视化配置,实现组件包的构建打包。

        本方案通过脚本自动拉取分支后,能自动监测到新添加分支,完成该分支的版本构建、部署、测试和上传制品库。

【最佳实践】Jenkins 2.0多分支Pipeline改造

1. 关键技术考虑

【最佳实践】Jenkins 2.0多分支Pipeline改造

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环节。

【最佳实践】Jenkins 2.0多分支Pipeline改造

2.总体框架

【最佳实践】Jenkins 2.0多分支Pipeline改造

总体框架如下,支持两个场景触发操作:

1.拉取版本:

版本管理员通过Jenkins Job拉取新版本,分支名称为待发布版本号,MulitiBranch Plugin扫描到该变更后,执行Pipeline进行构建、打包、部署、测试和上传制品库;

2.发布版本:

版本管理员从制品库选择可用版本进行发布。

【最佳实践】Jenkins 2.0多分支Pipeline改造

框架包含三部分:

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,与框架传入的参数保持一致。

【最佳实践】Jenkins 2.0多分支Pipeline改造

3.Pipeline环节实践

【最佳实践】Jenkins 2.0多分支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. 制品库发布

利用公司制品库进行版本发布。

实施收益

【最佳实践】Jenkins 2.0多分支Pipeline改造

4.收益

1.自动化的版本管理

        本实践基于Jenkins2.0提供新插件进行二次开发,提取一套公共框架实现版本的自动拉取与构建测试,并在测试通过后上传制品库。

2.支持组件级构建解耦

        对于一个涉及多组件的大项目来说,该框架支持业务组件仍使用原有的JOB配置方式,做到组件的CI JOB维护保留原有方式不变,项目新的Pipeline和老CI构建的兼容。

|中兴通讯

|云开源

为你打开云开源世界的大门

以上是关于最佳实践Jenkins 2.0多分支Pipeline改造的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins最佳实践

Jenkins

Jenkins管道最佳实践Top 10

DEVOPS技术实践_13:使用Jenkins持续传送设计-CD基础

Jenkins Pipeline 插件十大最佳实践!

Jenkins 最佳实践课程2021版全新升级