Jenkins-Pipeline

使用Groovy语法

Pipeline 是Jenkins 2.X核心特性,帮助Jenkins实现从CI到CD与DevOps的转变

Pipeline 简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立
运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流
程编排与可视化

支持语法:

1、声明式(仅在2.5版本后支持)

特点:

1.最外层必须由pipline{ //do something }来进行包裹

2.不需要分号作为分隔符,每个语句必须在一行内

3.不能直接使用groovy语句(例如循环判断等),需要被script {}包裹

2、脚本式

特点:

1.最外层使用node{}进行包裹

2.可直接使用groovy语句

声明式核心概念

基本流程:

1.pipeline :声明其内容为一个声明式的pipeline脚本,位于整个pipeline最外层,包裹整个pipeline

2.agent:执行节点(job运行的slave或者master节点),any表示任意节点

3.stages:阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)

4.stage:阶段,被stages包裹,一个stages可以有多个stage,每个stage表示pipeline中的一个流程

5.steps:步骤,为每个阶段的最小执行单元,被stage包裹**(必须项,即stage下必须存在steps)**

6.post:执行构建后的操作,根据构建结果来执行对应的操作

步骤拆分:

1、pipeline (声明式头头,最高)

作用域:应用于全局最外层,表明该脚本为声明式pipeline

是否必须:必须

参数:无

2、agent(规定谁来执行,以什么方式执行)

作用域:可用在全局与stage内

是否必须:是,

参数:any,none, label, node,docker,dockerfile

any

​ 代表任意节点均可执行,pipeline下的agent参数为必须项

pipeline{agent any  stages {stage('First'){steps {echo "test"}}}
}

none

​ 当参数为none时,每个stage必须表明执行该步骤的agent

pipeline{agent none  stages {stage('First'){agent anysteps {echo "test"}}}
}

label

​ 当参数为label时,label后的标签表示运行在指定机器上,label值由Jenkins配置进行控制(节点列表–管理节点)

pipeline{agent {label 'test01'}  // agent {//     node {//         label 'test01'//         customWorkspace 'xxx'   // 工作路径//     }// }  // 该写法与上面完全一致,多了更多的参数选项stages {stage('First'){steps {echo "test"}}}
}

docker

​ 当agent为docker时,当Pipeline执行时,Jenkins将自动启动指定的容器并在中

执行预定义的步骤,步骤执行完成后pipeline会自动删除对应的容器。

​ 并且docker参数可使用args来为容器启动传入变量等

pipeline {agent nonestages {stage('Back-end') { // 该步骤将使用maven:3.8.1-adoptopenjdk-11容器执行下方stepsagent {docker { image 'maven:3.8.1-adoptopenjdk-11' }}steps {sh 'mvn --version'}}stage('Front-end') {agent {docker { image 'node:16.13.1-alpine' args  '-e TEST=123'  // 等同于docker run -e TEST=123reuseNode true  // 可能为不会删除临时容器,并在同一节点启动该容器。}}steps {sh 'node --version'}}}
}

dockerfile

​ 使用一个Dockerfile创建一个docker容器用于运行流水线,默认为:

agent { dockerfile true
}

如果项目的Dockerfile存放在子目录下需通过dir参数声明,如果Dockerfile名字

是其他自定义名则需通过filename参数声明,除此之外还可以通过

additionalBuildArgs来设置docker build参数,使用registryUrl来设置docker仓库,

使用registryCredentialsId从jenkins获取docker仓库的账号密码。

agent {// Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/dockerfile {filename 'Dockerfile.build'dir 'build'label 'my-defined-label'additionalBuildArgs  '--build-arg version=1.0.2'args '-v /tmp:/tmp'registryUrl 'https://myregistry.com/'registryCredentialsId 'myPredefinedCredentialsInJenkins'}
}

kubernetes

在kubernetes集群中的一个pod内执行pipeline流水线,pod模版将定义在

kubernetes{}模块中。如果需要在pod中安装kaniko则可在yaml参数中声明。

3、stages(声明接下来要正式开始pipeline了!)

pipeline中作为集合声明存在,告诉你下面要按照stage的配置执行步骤了。内含一个或多个stage

4、stage(步骤)

构建阶段模块。定义构建阶段要做的事情,每个pipeline流水线至少包含一个stage。一个stage里有且只有一个step

5、steps(具体要干啥)

一个steps中可包含一个或多个命令

通常情况下,直接使用命令即可:

stages {stage('Test') {steps {echo "test"}}
}

若要使用Groovy语法进行脚本式pipeline的编写,则必须使用script进行包裹:

stages {stage('Test') {steps {script {sh "echo 'test'"}}}
}

6、environment (设置能够被调用的环境变量)

​ 指定一个 键-值对序列,该序列将被定义为所有步骤的环境变量,或者是特定于阶段的步骤, 这取决于environment 指令在流水线内的位置

顶层流水线块中使用的 environment 指令将适用于流水线中的所有步骤

pipeline {agent anyenvironment {  // 该变量在整个流水线中均可使用key1 = 'Test1'}stages {agent anystage('Test') {steps {echo key1}}}
}

一个 具体的stage 中定义的 environment 指令只会将给定的环境变量应用于 stage 中的步骤

pipeline {agent anystages {agent anystage('Test') {environment {key2 = 'Test2'}steps {echo key2}}}
}

还支持通过credentials()获取预设的账号密码

支持的credential类型包括:

Secret Text 该环境变量的值将会被设置为Secret Text的内容

Secret File 该环境变量的值将会被设置为临时创建的文件路径。

Username and password 该环境变量的值将会被设置为username:password, 并且还会自动创建两个环境变量:MYVARNAME_USRMYVARNAME_PSW

SSH with Private Key 该环境变量的值将会被设置为临时创建的ssh key文件路径,并且还会自动创建两个环境变量:MYVARNAME_USRMYVARNAME_PSW

7、options(配置参数)

分为两种:全局options(声明在最外层,作用于整个流水线)、局部options(声明在具体的stage里,只在该stage里生效)

局部options参数

skipDefaultCheckout 跳过从源代码控制中检出代码的默认情况

**timeout ** 设定pipeline执行超时时间,time表示具体值,unit表示时间单位

**retry ** 指定失败重试次数

**timestamps ** 日志里都会打印执行时间(需配合Timestamper插件)

stage('test') {options {skipDefaultCheckout()}
}
-------------------------------------------------------
stage('test') {options {timeout(time:'1',unit:'HOURS')  //超时时间一小时}
}
-------------------------------------------------------
stage('test') {options {retry(5)}
}
-------------------------------------------------------
stage('test') {options {timestamps()}
}

全局options参数

buildDiscarder pipeline 保持构建的最大个数

disableConcurrentBuilds 不允许并行构建

newContainerPerStage 与docker或dockerfile代理一起使用,表示每个stage都将在同一个节点里启动新容器运行而不是在同一个容器中运行

quietPeriod pipeline延时启动时间

pipeline {agent anyoptions {buildDiscarder(logRotator(numToKeepStr: '5'))// 保留最大构建数}
}

8、parameters(触发构建时的参数)

parameters声明当构建触发时用户要输入的所有参数,steps指令将通过params对象获取这些参数

// git仓库拉取,需要配合Git Parameter插件使用
parameters {gitParameter(branch: '', branchFilter: 'origin/(.*)', defaultValue: 'feature/4.1.1',                            description: '发布选项: 请选择GIT分支', name: 'git_branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH')
}
--------------------------------------------------------
// 复选框,需要搭配Extended Choice Parameter插件使用
parameters {extendedChoice(name: 'project_names', type: 'PT_CHECKBOX', description: '请勾选所要发布的子模块', quoteValue: false, saveJSONParameterToFile: false,value: 'backend-job',visibleItemCount: 1,multiSelectDelimiter: ',',  // 分隔符defaultValue: 'backend-job')
}
-------------------------------------------------------
// 下拉框,默认即可使用
parameters {choice(choices:['192.168.0.184'],description: '必选项: 选择发布节点',name:'SSH_IP')
}
--------------------------------------------------------
// 输入字符串类型参数,默认即可使用
parameters {string(name:'SSH_USER',defaultValue: 'root', description: '必选项: 输入远程用户')
}
--------------------------------------------------------
// 密码形式输入,不安全,默认即可使用
parameters {password(name:'PASSWORD', defaultValue:'Rx@12345678', description: '必选项: 输入远程密码')
}
--------------------------------------------------------
// 以文本形式输入参数,默认即可使用
parameters {text(name: 'TEXT', defaultValue: 'TEXT TXT', description: '请输入默认文本')
}
--------------------------------------------------------
// 以布尔值形式输入参数,默认即可使用
parameters {booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
}

9、when & IF & for (流程控制)

when

when仅能在stage端配置,用于判断当前stage是否执行。when可包含一条或多条条件判断,多条判断时需全部为true才可继续(默认情况下)。正常情况下when判断时在agentinputoptions命令之后才执行的,但是可以通过beforeAgentbeforeInputbeforeOptions参数来设置提前执行。

常用条件:

branch : 当正在构建的分支与给出的分支模式匹配时执行阶段

**environment :**当指定的环境变量设置为给定值时执行阶段

**allOf:**当所有嵌套条件都为真时,执行stage,必须至少包含一个条件

**anyOf:**当至少一个嵌套条件为真时执行舞台,必须至少包含一个条件

表达式 expression ,当表达式为true时继续执行

equals expected:字符串判断,当实际值等于期望值时为true。

// branch
stages {stage('Test') {when {branch pattern: "release-\\d+", comparator: "REGEXP"  // 当分支为release-***时,执行steps,REGEXP表示使用正则匹配}steps {echo "123"}}
}
---------------------------------------------------------
// environment
pipeline {agent anyenvironment {TXT = 'Test'}stage {stages('测试') {when {environment name: 'TXT'value: 'Test'  // 当环境变量TXT等于Test时执行接下来的steps}steps {echo "测试。。。"} }}
}
---------------------------------------------------------
// allOf
stage{stages('测试') {when {allOf {branch 'master'environment name: 'TXT'value: 'Test'    // 只有当分支为master且变量TXT=Test都满足时才执行} }steps {echo '测试......'}}
}
---------------------------------------------------------
// anyOf
stage{stages('测试') {when {anyOf {branch 'master'environment name: 'TXT'value: 'Test'    // 当分支为master或变量TXT=Test满足其中之一时就会执行}}steps {echo '测试......'}}
}
---------------------------------------------------------
// equals expected
pipeline {agent anystages {stage('初始化') {steps {script {//定义变量PASSWORD = 'ada'}}}stage('部署') {when {//当密码匹配的时候执行, 顺序不能反equals expected: 'ada',actual: PASSWORD}steps {sh 'echo 部署 stage ...'}}}
}
if

stepsscript(声明式pipeline里使用groovy语法必备)里使用

pipeline {agent any environment {OFF_FLAG = 'YES'}stages {stage('Init') { steps { script {BUILD_FLAG = true}}}stage('Build') { steps { script {if ( BUILD_FLAG ) {   // 当表达式为true时执行sh 'echo Build stage ...' }}}}stage('Test'){steps {script {if ( OFF_FLAG == 'YES' ) {  // 当环境变量匹配时执行sh 'echo Test stage ...' }}}}}
}
for

通常用于循环读取parameters参数中的值

pipeline {agent anyparameters {extendedChoice(name: 'SSH_IP', type: 'PT_CHECKBOX', description: '选择发布节点', quoteValue: false, saveJSONParameterToFile: false, value: '172.16.0.242, 172.16.0.243', visibleItemCount: 2, multiSelectDelimiter: ',',defaultValue: '172.16.0.242, 172.16.0.243')}stages {stage('测试'){steps {script {for (value in SSH_IP.tokenize(',')) {  // 循环遍历SSH_IP参数,分隔符为,echo valuesh "echo $value" // 等同echo value,上面为普通写法,下面为groovy语法写法}}}}}
}

10、post(结束后要干啥)

定义在整个pipeline流水线或某个stage执行完之后运行,分为两种情况:

定义在最外层(pipeline下一级),表示整个pipeline执行完之后运行;

定义在具体stage中,表示在该stage结束后执行

常用post执行参数:

always 不管pipeline或stage的执行结果状态,总会执行的steps

changed 只有在pipeline或stage的执行结果状态与前一次执行相比发生改变时执行

fixed 当前pipeline或stage执行成功且它的前一次执行结果是failure或unstable时执行

regression 当前pipeline或stage执行结果是failure, unstable或aborted且它的前一次执行成功时执行

aborted 当前pipeline或stage执行结果是aborted(人工停止pipeline)时执行

failure 当前pipeline或stage执行结果是失败时执行

success 当前pipeline或stage执行结果是成功时执行

unstable 当前pipeline或stage执行结果是unstable时执行

unsuccessful 当前pipeline或stage执行结果不是成功时执行

cleanup 在其他所有的post场景脚本都处理完之后执行,不管当前pipeline或stage执行结果是什么

Jenkins-Pipeline基本使用相关推荐

  1. Jenkins Pipeline构建流水线发布

    Jenkins Pipeline构建流水线发布 1. Jenkins Pipeline 核心概念 Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成.交付管道; Pipel ...

  2. Jenkins Pipeline动态使用Git分支名称的技巧

    前言 在上一篇 Jenkins 使用环境变量 中,帮助大家使用一条 Docker 命令就可以快速玩转 Jenkins,同时用最简单的方式解释了 Jenkins 中让人混乱的环境变量,本文还是接着变量说 ...

  3. Jenkins Pipeline插件十大最佳实践!

    Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则.基于 Groovy 中的领域特定语言(DSL),Pipeline 插件使 Pipelines 可以有脚本 ...

  4. Jenkins Pipeline 构建复杂的Electron程序

    最近一年都在捣腾Electron,从0.X版本,到现在最新Stable的3.X版本.一路上踩的坑很多,Electron的版本号也飞快的.项目设立的初衷是一份代码,即可构建出Windows和Mac,并且 ...

  5. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s

    前言 在日常开发中,经常会有发布的需求,而且经常会碰到各种环境,比如:开发环境.测试环境.生产环境.虽然可以使用手动构建.上传服务器部署的方式,但在微服务架构下一个项目经常包含多个微服务的部署,如果用 ...

  6. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  7. Jenkins Pipeline 语法

    目录 声明性pipeline Sections agent pipeline与stage中的不同 参数 常用选项 发布 post stages steps Directives environment ...

  8. jenkins pipeline php,Jenkins pipeline 系列二-为什么选择Pipeline

    接着继续翻译和记录第二节内容 为什么选Pipeline Jenkins 本质上就是一个自动引擎,他支持大量的自动模式.Pipeline往Jenkins里面添加了一系列的自动化工具,支持一系列从简单持续 ...

  9. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下. 一.关于持续集成与Jenkins Pipeline ...

  10. gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...

    gatling 使用 在这篇文章中,我将解释如何使用Gatling项目为您的JAX-RS Java EE端点编写压力测试,以及如何将它们与Gradle和Jenkins Pipeline集成,因此,除了 ...

最新文章

  1. 2018年全球十大新兴技术:细胞植入人体、营养人造肉……你想试试吗?
  2. 基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端
  3. 不管服不服 Windows仍是全球第一大桌面系统
  4. Docker Compose——搭建Redis集群
  5. SQL注入——SQL注入漏洞利用(零)(值得收藏)
  6. [POI2007]POW-The Flood
  7. WPF轮播图实现方式(二)
  8. 服务器性能优化的8种常用方法
  9. HAProxy.md
  10. 入门级都能看懂的softmax详解
  11. 银行排队叫号系统项目总结
  12. [BZOJ4173]数学
  13. 《小5自我推荐资源 | 寻找C站“宝藏》
  14. java协同过滤算法的演唱会门票售票系统
  15. HCIA-GaussDB 华为认证数据库工程师
  16. 新美大--软件测试--《社招、校招jd、公司具体介绍、培训发展、关于实习是什么,要求及常见问题、校招行程、校招常见问题》整理
  17. Docker之Dockerfile原理
  18. 智能语音:好玩的语音控制是怎么实现的?学习笔记01
  19. ros构建机器人运动学模型_ROS系统玩转自主移动机器人(5)-- ROS系统建模
  20. Linux虚拟机与主机无法Ping通,无法Ping通百度的解决办法

热门文章

  1. 小影的悲哀,重生~~
  2. 史上最强的绕口令,吐血也读不出!~(转)
  3. 多对多查询:一个用户创建多个订单,一个订单包含多个订单明细,一个订单明细包含一个商品
  4. 网站服务器二核与四核,云服务器2核4g和4核8g的区别
  5. Python GUI 输入框的使用方法
  6. 机器学习算法岗:常见面试问题及解答整理,持续更新
  7. 海上升明月,天涯共此时
  8. 小程序关于请求接口302重定向处理方法
  9. 三相异步电机检测技术的应用研究
  10. Android原生TabLayout使用全解析,看这篇就够了