案例简述
Pipeline as Code是2.0的精髓所在,是帮助Jenkins实现CI到CD转变的重要角色。
Pipeline,简单来说,是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
本案例受益于Jenkins内嵌的Groovy支持、丰富的Step库,自定义Pipeline脚本,实现了复杂的构建、发布流程。本案例将 one by one 教你部署 jenkins pipeline 2.0,还有心得介绍哦~
上线方案
1.环境准备
① 云CI入口
② Slave节点(安装了git,sbt,java)
③ 代码下载
2.操作
① 创建基础pipeline job
第一步:创建pipeline job,名称:pipeline_demo
第二步:配置Job
- 配置丢弃旧的构建
- 配置Build Triggers,选择Gerrit event
- 配置Gerrit Reporting Values
- 配置Trigger on,选择Patchset Created,选择comment Added Contains xxx
- 配置Gerrit Project
第三步:编辑pipeline脚本,Pipeline包括:Checkout-Build-Release
第四步:保存退出
第五步:提交代码,触发CI
第六步:查看运行情况和结果,通过CI控制台,Blue Ocean
② slave节点分配
groovy中通过node的参数labels来选择slave,用法跟jenkins1里的一样,我们需要先定义jenkins node,且给jenkins node定义label,然后在groovy里使用node加label来选择slave。
③ workspace分配
当node执行steps的时候会自动分配workspace,用于checkout代码,运行命令和其他任务。在step执行的时候workspace是被lock的,workspace只能同时被一个build使用。如果多个build需要使用同一个node的workspace,新的workspace将会被自动分配。
- 全局变量:jenkins的job有一些内置的默认的环境变量,可以通过http://xx.xx.xx.xx:8080/job/****/pipeline-syntax/globals来查看job默认的环境变量
④ 增加静态检查
第一步:运行环境上安装Scalastyle工具包(已经安装好)
第二步:通过Snippet Generator生成Scalastyle插件使用代码
第三步:通过Replay Pipeline更新Pipeline脚本
第四步:运行,查看结果
- step/插件使用:每个step都是由对应的Jenkins插件来实现的,点击旁边的帮助按钮可以查看
- Snippet Generator:Step库的官方参考手册成功的延续了Jenkins一贯的惜字如金风格,大多数Step都只有一句话的描述和一些参数类型,罕有使用样例,比如Git Step。要理解这些Step,基本靠脑补。好在Jenkins提供了一款良心产品,Snipper Generator,帮助使用者在Pipeline配置界面3步生成正确的调用语句
- Replay Pipeline:为了避免重复打开配置界面调整Pipeline脚本,Jenkins贴心的提供了Replay功能。打开任意一次执行历史,在左侧点击Replay按钮,即可复原该次执行所运行的Pipeline脚本,无论脚本来源是任务本身还是远程仓库
⑤ 单元测试和静态检查scalastyle并行执行
第一步:修改脚本增加parallel、node
第二步:通过Snippet Generator生成ws,splitTests插件使用代码
第三步:通过Replay Pipeline更新Pipeline脚本
第四步:运行,查看结果
- stash/unstash:在stash被引入pipeline DSL前,一般使用archive来实现node或stage间文件的共享。 在stash引入后,最好使用stash/unstash来实现node/stage间文件的共享。例如在不同的node/stage间共享源代码。archive用来实现更长时间的文件存储
- Parallel:pipeline能够使用parallel来同时执行多个任务。prallel里的语句使用了node,这意味着并行执行的任务将会在新的node/slave上执行,且使用不同的workspace,为了确保所有的node和workspace使用相同的代码,所以才有了前面的打包stash和parallel里的解包unstash
- splitTests:此插件可以将测试分割,以便并行执行。splitTests将会将所有的测试分割为大概等价的N份,然后N个task并行运行。如果N个task运行在不同的slave上,则可以看到job总的时间将会减为1/N
⑥ Multibranch Pipeline
第一步:在分支version_a根目录下创建Jenkinsfile
第二步:新建multibranch pipeline job:multibranch_pipeline_test_lyl
- 配置Include branches为version_*
- 配置Periodically if not otherwise run为1分钟
第三步:创建新分支:version_b,查看是否自动生成job
第四步:在分支version_b根目录下创建Jenkinsfile,与version_a不同
第五步:push Jenkinsfile。查看是否自动开始构建
⑦ 参数化构建(properties/parameters)
第一步:通过Snippet Generator生成properties 相关代码
第二步:编辑Jenkinsfile,添加上述代码,并且增加相关参数打印
第三步:点击“Build with Parameters”触发构建
第四步:查看日志中的参数打印内容