Jenkins-Pipeline基本使用
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_USR
和MYVARNAME_PSW
。SSH with Private Key 该环境变量的值将会被设置为临时创建的
ssh key
文件路径,并且还会自动创建两个环境变量:MYVARNAME_USR
和MYVARNAME_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判断时在agent
,input
,options
命令之后才执行的,但是可以通过beforeAgent
,beforeInput
,beforeOptions
参数来设置提前执行。
常用条件:
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
在steps
的script(声明式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基本使用相关推荐
- Jenkins Pipeline构建流水线发布
Jenkins Pipeline构建流水线发布 1. Jenkins Pipeline 核心概念 Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成.交付管道; Pipel ...
- Jenkins Pipeline动态使用Git分支名称的技巧
前言 在上一篇 Jenkins 使用环境变量 中,帮助大家使用一条 Docker 命令就可以快速玩转 Jenkins,同时用最简单的方式解释了 Jenkins 中让人混乱的环境变量,本文还是接着变量说 ...
- Jenkins Pipeline插件十大最佳实践!
Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则.基于 Groovy 中的领域特定语言(DSL),Pipeline 插件使 Pipelines 可以有脚本 ...
- Jenkins Pipeline 构建复杂的Electron程序
最近一年都在捣腾Electron,从0.X版本,到现在最新Stable的3.X版本.一路上踩的坑很多,Electron的版本号也飞快的.项目设立的初衷是一份代码,即可构建出Windows和Mac,并且 ...
- 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
前言 在日常开发中,经常会有发布的需求,而且经常会碰到各种环境,比如:开发环境.测试环境.生产环境.虽然可以使用手动构建.上传服务器部署的方式,但在微服务架构下一个项目经常包含多个微服务的部署,如果用 ...
- Jenkins + Pipeline 构建流水线发布
Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...
- Jenkins Pipeline 语法
目录 声明性pipeline Sections agent pipeline与stage中的不同 参数 常用选项 发布 post stages steps Directives environment ...
- jenkins pipeline php,Jenkins pipeline 系列二-为什么选择Pipeline
接着继续翻译和记录第二节内容 为什么选Pipeline Jenkins 本质上就是一个自动引擎,他支持大量的自动模式.Pipeline往Jenkins里面添加了一系列的自动化工具,支持一系列从简单持续 ...
- 基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下. 一.关于持续集成与Jenkins Pipeline ...
- gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
gatling 使用 在这篇文章中,我将解释如何使用Gatling项目为您的JAX-RS Java EE端点编写压力测试,以及如何将它们与Gradle和Jenkins Pipeline集成,因此,除了 ...
最新文章
- 2018年全球十大新兴技术:细胞植入人体、营养人造肉……你想试试吗?
- 基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端
- 不管服不服 Windows仍是全球第一大桌面系统
- Docker Compose——搭建Redis集群
- SQL注入——SQL注入漏洞利用(零)(值得收藏)
- [POI2007]POW-The Flood
- WPF轮播图实现方式(二)
- 服务器性能优化的8种常用方法
- HAProxy.md
- 入门级都能看懂的softmax详解
- 银行排队叫号系统项目总结
- [BZOJ4173]数学
- 《小5自我推荐资源 | 寻找C站“宝藏》
- java协同过滤算法的演唱会门票售票系统
- HCIA-GaussDB 华为认证数据库工程师
- 新美大--软件测试--《社招、校招jd、公司具体介绍、培训发展、关于实习是什么,要求及常见问题、校招行程、校招常见问题》整理
- Docker之Dockerfile原理
- 智能语音:好玩的语音控制是怎么实现的?学习笔记01
- ros构建机器人运动学模型_ROS系统玩转自主移动机器人(5)-- ROS系统建模
- Linux虚拟机与主机无法Ping通,无法Ping通百度的解决办法