Jenkins脚本式pipeline语法

文章目录

  • 0、概述
    • `优点`
    • `缺点`
  • 一、语法
  • 二、定义变量
  • 三、properties属性
    • `参数化构建`
      • 多选参数
    • `定时构建`
  • 指定执行节点
  • stage—阶段
  • 并行执行
    • `方法一`
    • `方法二`
  • sshCommand到远程主机执行命令
  • 触发其它job
  • 异常处理
    • `捕获异常`
      • 方式一:try-catch-finally
      • 方式二:catchError
    • `抛出异常`
  • 注意事项
    • 变量定义
  • 参考


0、概述

脚本式语法是Jenkins最开始实现的流水线即代码方式。

是一种命令式风格,也就是在流水线脚本中定义逻辑和程序流程。

更依赖于Groovy语言和结构,特别是对于错误检查和异常处理来说。

优点

  • 更少的代码段落和弱规范要求。
  • 更强大的程序代码能力。
  • 更像编写代码程序。
  • 传统的流水线即代码模型, 用户熟悉并向后兼容性。
  • 更灵活的自定义代码操作。
  • 能够构建更复杂的工作流和流水线。

缺点

  • 普遍要求更高的编程水平。
  • 语法检查受限于Groovy语言及环境。
  • 和传统Jenkins模型有很大差异。
  • 与声明式流水线的实现相比, 同一工作流会更复杂。

一、语法

timestamps {properties ([parameters ([string(name: 'NEW_BRANCH', defaultValue: '' , description:'', trim: true),choice(choices: ['mysql', 'oracle'], description: '''选择数据库类型''', name: 'DATABASE', trim: true),])])node('cs') {//定义变量def db_ip = '192.168.1.2'                    try {step([$class: 'WsCleanup'])		//清理工作空间stage('git pull') {gitClone(branch)}//并行构建parallel('npm web': {stage('npm') {sh """shell命令"""    }},'mvn': {stage('mvn') {sh """shell命令"""  }})} catch (e) {throw e} finally {		//无论前面失败还是成功都会执行}}
}//定义函数
def gitClone(branch) {sh "git config --global http.sslVerify false"for (gitProductName in gitProductList) {sh "git clone --depth=1 -b ${branch} git地址"}
}

二、定义变量

在if语句里面定义的变量,在函数中可以直接调用

dbDriver = "com.mysql.jdbc.Driver"			//可以直接在函数中使用
def dbDriver = "com.mysql.jdbc.Driver"		//函数中不能直接使用,需要当作实参传入给函数

三、properties属性

参数化构建

properties ([parameters ([string(name: 'NEW_BRANCH', defaultValue: '' , description:'', trim: true),text(name: 'DOCKER_HOST',defaultValue: this.DOCKER_HOST, description: '''填写Docker主机的IP地址,多个地址用逗号分隔。
如:192.168.1.2,192.168.1.3''',trim: true),choice(choices: ['mysql', 'oracle'], description: '''选择数据库类型''', name: 'DATABASE', trim: true),booleanParam(defaultValue: true, description: '默认升级数据库', name: 'DATABASE'),listGitBranches(branchFilter: '.*/feature.*||.*/dev', credentialsId: 'a2b624d4-567d-4ff2',defaultValue: '', name: 'BRANCH', quickFilterEnabled: true, remoteURL: 'https://192.168.1.2/devops.git', selectedValue: 'NONE',sortMode: 'DESCENDING_SMART', tagFilter: '*', type: 'PT_BRANCH')	//列出git分支])])

多选参数

需安装Extended Choice Parameter plugin插件
参考文章:Jenkins参数化构建如何设置多选框

extendedChoice(description: '跳过指定的git工程', multiSelectDelimiter: ',', name: 'SKIP_GIT_PRODUCT', quoteValue: false, saveJSONParameterToFile: false,type: 'PT_CHECKBOX', value: 'a,b,c',visibleItemCount: 3),

定时构建

properties ([pipelineTriggers([cron('H/30 * * * *')])])

指定执行节点

node用于指定Jenkins应该在哪个节点上运行这部分流水线。

node后面的名称需在Jenkins管理节点界面中提前创建

node可以使用标准逻辑运算符来指定多个标签,例如

node("linux && changsha") {}

stage—阶段

阶段必须指定 name ,用来描述这个阶段的职责。
现有的阶段实质上并没有在脚本中做什么事情,仅在运行流水线时在输出中标识出这个阶段的位置。

一个通用的实践是创建阶段来模仿传统流水线中的任务片段。例如,我们可以设计 一个阶段来获取源码,一个阶段来编译源码, 一个阶段来执行单元测试, 一个阶段来执行集成测试等

并行执行

方法一

parallel ('master': {node('master') {     //可以指定节点sh "echo '在master执行'"}},'java': {                       //不指定就用全局node指定的节点stage('mvn') {sh 'mvn'}},'web': {stage('npm') {sh 'npm'}},//failFast: true			//当并行执行的所有阶段中,有一个阶段执行报错,则其它阶段也被终止
)

方法二

Map parallelMap = ["name1":{value1},"name2":{value2}]	//定义一个hashMap
parallel(parallelMap)			//name1和name2的内容并行执行

sshCommand到远程主机执行命令

def mysqlRemote = getMysqlRemote(mysqlIp, mysqlSshUser, mysqlSshPassword)
sshCommand remote: mysqlRemote, failOnError: false, command: """shell命令"""
def getMysqlRemote(mysqlIp, mysqlSshUser, mysqlSshPassword) {def remote = [:]remote.name = 'mysqlServer'remote.host = mysqlIpremote.allowAnyHosts = trueremote.user = mysqlSshUserremote.password = mysqlSshPasswordreturn remote
}

触发其它job

wait:是否等待下游job构建完成。默认为true
propagate:继承下游job的构建状态,如果下游job报错,则自己也报错

build(job: '下游job名', parameters: [string(name: 'VERSION', value: env.VERSION)], propagate: true, wait: true)

异常处理

捕获异常

方式一:try-catch-finally

try {//代码块
} catch (e) {throw e
} finally {		//无论前面失败还是成功都会执行}

方式二:catchError

如果一个代码块抛出了一个异常,那 么这个构建 被标记成失败状态。但是,流水线中从 catchError 代码块往后的语句可以继续执行

catchError {//stage
}
//发送邮件通知的步骤

抛出异常

throw new Exception("This Is Error")或者
error("This Is Error")

注意事项

变量定义

def modifyConfig() {def jdbcUrl			//最好定义if(dbType == "mysql") {jdbcUrl = "jdbc:mysql://${dbIP}:${dbPort}/${dbSchema}?useUnicode=true\\&characterEncoding=utf-8"} else if(dbType == "oracle") {jdbcUrl = "jdbc:oracle:thin:@${dbIP}:${dbPort}/${dbName}"} else {throw new Exception("*******modifyConfigNot Surpport Db Type:${dbType}")}sh """sed -ri "s|\\{\\{ JDBC_URL \\}\\}|${jdbcUrl}|g" application-dev.yml"""
}

如果不事先定义jdbcUrl为null,那么在并行任务中的值jdbcUrl会串

比如:我并行执行的两个stage传入的dbSchema的名字分别为test1和test2,发现在sh方法里两个stage获取的值都是test2,感觉就是stage2中的test2串到了stage1中,因此最好在前面定义好变量jdbcUrl。

串行执行时不存在这个问题

参考

文章:《Jenkins2权威指南》


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部