Jenkins2.0 Pipeline导入

Pipeline as Code是Jenkins 2.0版本的精华所在,是帮助Jenkins实现从CI到CD华丽转身的关键工具。

所谓Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程

Pipeline的实现方式是一套Groovy DSL(类似Gradle),任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。


为什么要使用Jenkins2.0 Pipeline

这里主要结合我自己对传统Jenkins Job使用的一些痛点来说:

  • 传统的Jenkins Job难以灵活高效地并行(Job间、节点间、任务间、甚至任务内四个维度的并行)
  • 传统的Jenkins Job日益失控的趋势让我们措手不及,Job太多,CI脚本太离散,维护成本实在太高了,而且很危险,一单Jenkins Server挂了,一切都Game Over了
  • 新拉分支的分支代码CI部署太麻烦了
  • 传统的Jenkins Job显示真的是不太直观啊

我想这些理由应该足以让我们把目光转向Jenkins2.0的Pipeline!

Pipeline的功能和优点:

  1. 持久性:在jenkins的master按计划和非计划的重启后,pipeline的job仍然能够工作,不受影响。其实理解起来也很简单,jenkins的master和agent通过ssh连接,如果你知道nohup或disown的话,就可以理解为啥master的重启不会影响agent上的job继续运行。
  2. 可暂停性:pipeline基于groovy可以实现job的暂停和等待用户的输入或批准然后继续执行。
    3. 更灵活的并行执行,更强的依赖控制,通过groovy脚本可以实现step,stage间的并行执行,和更复杂的相互依赖关系。
  3. 可扩展性:通过groovy的编程更容易的扩展插件。
  4. 设计Pipeline = 设计代码,很优雅
  5. As Code:集中管理CI脚本、用代码库来管理脚本、从代码库直接读取脚本,从而可以将项目CI迅速拉起来!

Pipeline原理与流程

Pipeline为用户设计了三个最最基本的概念:

  • Stage:一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
  • Node:一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
  • Step:Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。

一个典型的Stage View如下图所示:

从图中可以十分方便地看到哪些Stage通过,哪些Stage失败,以及构建的时间。

Jenkins2.0的Pipeline搭建使用的是Groovy脚本,通过Groovy脚本实现工作流管理的步骤如下:

  • 去Jenkins主界面建立Pipeline任务

实际上更常用的是MultiBranch Pipeline,上面的图中截图没有包含,但与普通Pipeline基本类似。

  • 使用Groovy脚本自定义工作流

上图的实例脚本如下:

node { stage('Checkout Code') { // for display purposes // Get some code from a GitHub repository git 'https://github.com/jglick/simple-maven-project-with-tests.git' }stage('Build') { // Run the maven build if (isUnix()) { sh "'${MAVEN_HOME}/bin/mvn' -Dmaven.test.failure.ignore clean package" } else { bat(/"${MAVEN_HOME}\bin\mvn" -Dmaven.test.failure.ignore clean package/) } } stage('Unit test') { junit '**/target/surefire-reports/TEST-UT.xml' archive 'target/*.jar' }
} 
  • 开始执行Pipeline

构建过程的stage View如下:

很明显可以看出,这里显示的和Groovy脚本中格式化的代码是一致的,会实时显示各个工作流的执行进度和结果,直观易懂。鼠标移上去,能看到日志信息的缩略图,单击可以调到对应stage的console中。

总而言之,一切都是那么地优雅!


Jenkins2.0 Pipeline关键DSL语法及示例

在这里总结一下Pipeline中的关键DSL语法,利用Groovy对其进行组合可以完成任何一项复杂的CI/CD流程,熟悉它们大有裨益。

  • archiveArtifacts

归档文件,举例:

archiveArtifacts 'target/*.jar'
  • bat

执行windows平台下的批处理文件,如

bat "call example.bat"
  • build

触发构建一个jenkins job,如

build 'TEST_JOB'
  • checkout

从SCM系统中checkout repo,如:

checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[credentialsId: '30e6c1e5-1035-4bdd-8a44-05ba8f885158', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://xxxxxx']], workspaceUpdater: [$class: 'UpdateUpdater']]) 
  • deleteDir()

从workspace中删除当前目录

  • dir

切换目录,如

dir('/home/jenkins') { // 切换到/home/jenkins目录中做一些事情// some block
}
  • echo

打印信息,如 echo 'hello world'

  • emailtext

利用Jenkins发送邮件,内容、主题全都可以自定义,如

emailext body: 'Subject_test', subject: 'Subject_test', to: 'hansonwang99@163.com.cn'
// 邮件的正文body,主题subject,收件人to等可以进行自定义
  • error

抛出一个错误信号,可以自行在代码里抛出,如 error 'read_error'

  • fileExists

检查工作空间某个路径里是否存在某个file,举例:

fileExists '/home/test.txt'  // 检查是否存在test.txt
  • input

等待外界用户的交互输入,举例:

input message: '', parameters: [string(defaultValue: '默认值', description: '版本号', name: 'version')] // 在某一步骤,等待用户输入version参数才能往下执行
  • isUnix

用于判断当前任务是否运行于Unix-like节点上,举例:

def flag = isUnix()
if( flag == false ) { // 可以据此进行判断echo "not run on a unix node !"
}
  • load

调用一个外部groovy脚本,举例:

load 'D:\\jenkins\\workspace\\test.groovy'
  • node

分配节点给某个任务运行,举例:

node('节点标签') { // 在对应标签的节点上运行某项任务Task()
}
  • parallel

并行地执行任务,可以说是最实用高效的工具了,举例:

parallel(   //并行地执行android unit tests和android e2e tests两个任务'android unit tests': {runCmdOnDockerImage(androidImageName, 'bash /app/ContainerShip/scripts/run-android-docker-unit-tests.sh', '--privileged --rm')},'android e2e tests': {runCmdOnDockerImage(androidImageName, 'bash /app/ContainerShip/scripts/run-ci-e2e-tests.sh --android --js', '--rm')}
)
  • properties

设置Job的属性,举例:

properties([parameters([string(defaultValue: '1.0.0', description: '版本号', name: 'VERSION')]), pipelineTriggers([])]) // 为job设置了一个VERSION参数
  • pwd 显示当前目录
  • readFile

从工作空间中读取文件,举例:

def editionName = readFile '/home/Test/exam.txt'
  • retry

重复body内代码N次,举例:

retry(10) {// some block
}
  • sh

执行shell脚本,如:sh "sh test.sh"

  • sleep

延时,如延时2小时:sleep time: 2, unit: 'HOURS'

  • stage

创建任务的stage,举例:

stage('stage name') {// some block
}
  • stash

存放文件为后续构建使用,举例:

dir('target') {stash name: 'war', includes: 'x.war'
}
  • unstash

将stash步骤中存放的文件在当前工作空间中重建,举例:

def deploy(id) {unstash 'war'sh "cp x.war /tmp/${id}.war"
}
  • timeout

时间限制,举例

timeout(time: 4, unit: 'SECONDS') {// some block
}
  • timestamps

用于在控制台加时间戳,举例:

timestamps {// some block
}
  • touch

创建文件,举例:

touch file: 'TEST.txt', timestamp: 0
  • unzip

解压文件,举例:

unzip dir: '/home/workspace', glob: '', zipFile: 'TEST.zip'
  • validateDeclarativePipeline

检查给定的文件是否包含一个有效的Declarative Pipeline,返回T或者F

validateDeclarativePipeline '/home/wospace'
  • waitUntil

等待,直到条件满足

waitUntil {// some block
}
  • withCredentials

使用凭据

withCredentials([usernameColonPassword(credentialsId: 'mylogin', variable: 'USERPASS')]) {sh '''set +xcurl -u $USERPASS https://private.server/ > output'''
}
  • withEnv

设置环境变量,注意近本次运行有效!

withEnv(['MYTOOL_HOME=/usr/local/mytool']) {sh '$MYTOOL_HOME/bin/start'
}
  • writeFile

写文件到某个路径

writeFile file: '/home/workspace', text: 'hello world'
  • writeJSON

写JSON文件,用法基本同上

  • zip

创建zip文件

zip dir: '/home/workspace', glob: '', zipFile: 'TEST.zip'
  • ws

自定义工作空间,在其中做一些工作,效果类似于Dir命令,举例:

ws('/home/jenkins_workspace') {// some block
}

后记

作者关于Groovy的实践在此

作者更多的原创文章在此


Pipeline As Code With Jenkins2.0相关推荐

  1. vscode中文支持xp_VSCode (Visual Studio Code) V1.43.0下载并设置成中文语言的方法

    Visual Studio Code(简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT ...

  2. assertion: 18 { code: 18, ok: 0.0, errmsg: auth fails }

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB Version: 2.4.7 Mongodump: $ bin/mongodump -u admin -p a ...

  3. Visual Studio Code 1.72.0 各平台下载地址

    Visual Studio Code 1.72.0(简称"VSCode1.72.0")是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac O ...

  4. Easy Code v1.00.0.0041 汉化版.by.JYculture..KuNgBiM

    Easy Code v1.00.0.0041 汉化版 ================================================================ 软件主页:htt ...

  5. hive 格式化:Error: Table ‘CTLGS‘ already exists (state=42S01,code=1050) Closing: 0: jdbc:mysql://hadoop

    hive 格式化schematool -initSchema -dbType mysql -verbose 出现:Error: Table 'CTLGS' already exists (state= ...

  6. VSCode (Visual Studio Code) V1.43.0下载并设置成中文语言

    Visual Studio Code(简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT ...

  7. 测试开发必会:正确理解持续集成和持续交付 CI/CD

    正确理解并掌握持续集成和持续交付(CI/CD)是当下测试和质量保障相关同学的必备技能.本文作者为霍格沃兹测试学院特邀嘉宾,资深技术专家蒋刚毅,原文首发 TesterHome 社区,标题为<持续交 ...

  8. 【学习资料】 持续集成---测试自动化学习

    [持续交付实践] 开篇:持续集成&持续交付综述 前言 随着微服务架构与容器虚拟化技术的发展,持续集成与持续交付的概念又重新回到了大家的视野,越来越多的公司开始使用持续集成的系统来解决频繁发布带 ...

  9. 使用VS Code开发调试.NET Core 2.0

    转自: https://www.cnblogs.com/linezero/p/7402913.html VS Code 全称是 Visual Studio Code,Visual Studio Cod ...

最新文章

  1. 【Python】打印魔方阵
  2. python动态创建类_Python中通过参数动态创建扩展类(class)
  3. Linux硬盘安装_ubuntu
  4. SGI STL 学习笔记二 vector
  5. 解释型语言和编译型语言的区别
  6. Summary Day30
  7. 数据库MySQL的运行情况主要是检查什么_mysql 运行状态分析 运行故障排查实例
  8. Jeecg-P3 1.0.1版本发布,轻量级微服务框架
  9. CodeForces 484B Maximum Value
  10. xhtml、html与html5的区别
  11. 十代主板改win7_微星Z490装win7 Bios设置|微星Z490主板10代CPU装win7
  12. 图像转PDF的问题、方法及题外话
  13. UVA - 10099 The Tourist Guide kruskal算法
  14. mysql help_深入理解mysql帮助命令(help)
  15. 四、Mosquitto 高级应用之用户配置
  16. 数据结构个人电话号码查询系统实验报告
  17. 《系统论、信心论、控制论》读书笔记1
  18. 关于C之文件结尾EOF与二进制文件换行符
  19. 家用电脑改造成服务器
  20. stm32带BootLoader情况下,需要重新映射中断向量表

热门文章

  1. 微信小程token_微信小程序url与token设置详解
  2. python sql查询返回记录_干货!Python与MySQL数据库的交互实战
  3. fsck 修复文件系统_微软推出Win10 20H2 Build 19042.608测试版 修复多种已知错误
  4. mysql 运行 compile_install mysql by compile(通过编译安装mysql)
  5. class根据状态 vue_搞懂并学会运用 Vue 中的无状态组件
  6. leetcode刷题:数组中第K个最大的元素
  7. 彩虹屁支持java吗_IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件...
  8. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js
  9. git rebase 调整commit顺序
  10. Java 时间处理 Instant