pipeline 步骤
一.简介
步骤是pipeline里执行的最小单位了,这里列举内置的相关步骤方便使用,省的去写很多shell,也不方便维护。
二.文件相关
删除当前目录
无参步骤,删除的是当前工作目录。通常它与dir步骤一起使用,用于删除指定目录下的内容。
deleteDir
切换到目录
默认pipeline工作在工作空间目录下(/root/.jenkins/workspace/xx项目名),dir步骤可以让我们切换到其他目录。
dir('/xx') {
deleteDir
}
判断文件是否存在
判断/tmp/a.jar文件是否存在
fileExists('/tmp/a.jar')
输出状态
script {
def status=fileExists('/tmp/a.jar')
print "${status}"
}
判断是否为类Unix
如果当前pipeline运行在一个类Unix系统上,则返回true
script {
def status=isUnix
print "${status}"
}
返回当前目录
pwd与Linux的pwd命令一样,返回当前所在目录
script {
def dir=pwd
print "dir"
}
将内容写入文件
writeFile支持的参数有:
- file:文件路径,可以是绝对路径,也可以是相对路径。
- text:要写入的文件内容。
- encoding(可选):目标文件的编码。如果留空,则使用操作系统默认的编码。如果写的是Base64的数据,则可以使用Base64编码。
writeFile(file: "/etc/pass", text: "xxxx", encoding: "UTF-8")
读取文件内容
readFile支持的参数有:
- file:路径,可以是绝对路径,也可以是相对路径。
- encoding(可选):读取文件时使用的编码。
当前例子,用writeFile写入内容,再用readFile读取内容到变量,最终打印变量
fileContents = readFile(file: "/etc/passwd", encoding: "UTF-8")
echo "$fileContents"
二.制品相关
存取临时文件
stash步骤可以将一些文件保存起来,以便被同一次构建的其他步骤或阶段使用。如果整个pipeline的所有阶段在同一台机器上执行,则stash步骤是多余的。所以,通常需要stash的文件都是要跨Jenkins node使用的。
stash步骤会将文件存储在tar文件中,对于大文件的stash操作将会消耗Jenkins master的计算资源。Jenkins官方文档推荐,当文件大小为5∼100MB时,应该考虑使用其他替代方案。
stash步骤的参数列表如下:
- name:字符串类型,保存文件的集合的唯一标识。
- allowEmpty:布尔类型,允许stash内容为空。
- excludes:字符串类型,将哪些文件排除。如果排除多个文件,则使用逗号分隔。留空代表不排除任何文件。
- includes:字符串类型,stash哪些文件,留空代表当前文件夹下的所有文件。
- useDefaultExcludes:布尔类型,如果为true,则代表使用Ant风格路径默认排除文件列表。
除了name参数,其他参数都是可选的。excludes和includes使用的是Ant风格路径表达式。
unstash步骤取出之前stash的文件。只有一个name参数,即stash时的唯一标识。通常stash与unstash步骤同时使用。
stash步骤在master节点上执行,而unstash步骤在node2节点上执行。
pipeline {
agent none
stages {
stage('stash') {
agent { label "master" }
steps {
script {
writeFile file: "a.txt", text: "$BUILD_NUMBER"
stash(name: "abc", include: "a.txt")
}
}
}
stage("unstash") {
agent { label "node2" }
steps {
script {
unstash("abc")
def content = readFile("a.txt")
echo "${content}"
}
}
}
}
}
三.命令相关
script
直接执行groovy的命令会报错,需要用script括起来。与命令相关的步骤其实是Pipeline:Nodes and Processes插件提供的步骤。由于它是Pipeline插件的一个组件,所以基本不需要单独安装。
script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < brosers.size(); ++i) {
echo "this is ${browsers[i]}"
}
}
sh
执行shell命令
sh步骤支持的参数有:
- script:将要执行的shell脚本,通常在类UNIX系统上可以是多行脚本。
- encoding:脚本执行后输出日志的编码,默认值为脚本运行所在系统的编码。
- returnStatus:布尔类型,默认脚本返回的是状态码,如果是一个非零的状态码,则会引发pipeline执行失败。如果returnStatus参数为true,则不论状态码是什么,pipeline的执行都不会受影响。
- returnStdout:布尔类型,如果为true,则任务的标准输出将作为步骤的返回值,而不是打印到构建日志中(如果有错误,则依然会打印到日志中)。除了script参数,其他参数都是可选的。
- returnStatus与returnStdout参数一般不会同时使用,因为返回值只能有一个。如果同时使用,则只有returnStatus参数生效。
sh "ls"
sh(script: "/root/test.sh", returnStdout: true)
bat、powershell
bat步骤执行的是Windows的批处理命令。powershell步骤执行的是PowerShell脚本,支持3+版本。这两个步骤支持的参数与sh步骤的一样。
四.调用其它pipeline
在Jenkins pipeline中可以使用build步骤实现调用另一个pipeline功能。build步骤是pipeline插件的一个组件,所以不需要另外安装插件,可以直接使用。
build步骤其实也是一种触发pipeline执行的方式,它与triggers指令中的upstream方式有两个区别:
1.build步骤是由上游pipeline使用的,而upstream方式是由下游pipeline使用的。
2.build步骤是可以带参数的,而upstream方式只是被动触发,并没有带参数。
调用本章开头的例子,可以steps部分这么写:
steps {
build(
job:"parameters-example",
parameters: [
booleanParam(name:'userFlag', value:true)
]
)
}
build步骤的基本2个参数
job(必填):目标Jenkins任务的名称
parameters(可选):数组类型,传入目标pipeline的参数列表。传参方法与定参方法类似
parameters: [
booleanParam(name:'DEBUG_BUILD', value:true),
password(name:'PASSWORD', value:'prodSECRET'),
string(name:'DEPLOY_ENV', value:'prod'),
text(name:'DEPLOY_TEXT', value:'a\n\b\nc\n'),
string(name:'CHOICES00', value:'dev')
]
我们注意到choice类型的参数没有对应的传参方法,而是使用string传参方法代替的。
除此之外,build步骤还支持其他三个参数
propagate(可选): 布尔类型,如果值为true,则只有当下游pipeline的最终结构状态为SUCCESS时,上游pipeline才算成功;如果值为flase,则不论下游pipeline的最终构建状态是什么,上游pipeline都忽略。默认值为true
quietPeriod(可选): 整形,触发下游pipeline后,下游pipeline等待多久执行。如果不设置此参数,则等待时长由下游pipeline确定,单位为秒。
wait(可选): 布尔类型,是否等待下游pipeline执行完成。默认值为true。
如果你使用了Folder插件,那么就需要注意build步骤的job参数的写法了。
使用Folder插件,可以让我们像管理文件夹下的文件一样来管理Jenkins项目。我们的Jenkins项目可以创建在这些文件夹下。如果目标pipeline与源pipeline在同一目录下,则可以直接使用名称; 如果不在同一目录下,则需要指定相对路径,如 ../sister-folder/downstream 或绝对路径。
五.处理复杂判断逻辑
有些场景要求我们根据传入的参数做一些逻辑判断。很自然的,就想到在script函数内实现
stage("deploy to test"){
steps{
script {
if (params.CHOICES == 'test') {
echo "deploy to test"
}
}
}
}
这样写起来很不优雅,Conditional BuildStep插件可以让我们像使用when指令一样进行条件判断。一下代码是安装后的写法
pipeline {
agent any
parameters {
choice(name:'CHOICES', choices:'dev\ntest\nstaging', description:'请选择部署的环境')
}
stages {
stage("deploy test") {
when {
expression {return params.CHOICES == 'test'}
}
steps {
echo "deploy to test"
}
}
stage("deploy staging") {
when {
expression {return params.CHOICES == 'staging'}
}
steps {
echo "deploy to staging"
}
}
}
}
现实中,我们会面对更复杂的判断条件。而expression表达式本质上就是一个Groovy代码矿,大大提高了表达式的灵活性。
或逻辑
when {
// A or B
expression {return A || B}
}
与逻辑
when {
// A or B
expression {return A && B}
}
从文件中取值
when {
expression {return readFile('pom.xml').contains('mycomponent')}
}
正则表达式
when {
expression {return token ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/}
}
六.其他步骤
error
主动报错,中止当前pipeline。error 步骤的执行类似于抛出一个异常。它只有一个必需参数:message。
error("there's an error")
tool
使用预定义的工具。
如果在Global Tool Configuration(全局工具配置)中配置了工具,那么可以通过tool步骤得到工具路径。
steps {
script{
def t = tool name: 'docker', type: 'org.jenkinsci.plugins.docker.commons.tiils.ockerTool'
echo "${t}" //打印 /var/lib/docker
}
}
tool步骤支持的参数有:
- name:工具名称。
- type(可选):工具类型,指该工具安装类的全路径类名。
每个插件的type值都不一样,而且绝大多数插件的文档根本不写type值。除了到该插件的源码中查找,还有一种方法可以让我们快速找到type值,就是前往Jenkins pipeline代码片段生成器中生成该tool步骤的代码即可。
timeout
代码块超时时间。为timeout步骤闭包内运行的代码设置超时时间限制。如果超时,将抛出一个org.jenkinsci.plugins.workflow.steps.FlowInterruptedException异常。
timeout(5)
timeout步骤支持如下参数:
- time:整型,超时时间。
- unit(可选):时间单位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES(默认)、HOURS、DAYS。
- activity(可选):布尔类型,如果值为true,则只有当日志没有活动后,才真正算作超时。
waitUntil
等待条件满足。
不断重复waitUntil块内的代码,直到条件为true。waitUntil不负责处理块内代码的异常,遇到异常时直接向外抛出。waitUntil步骤最好与timeout步骤共同使用,避免死循环。示例如下:
timeout(50) {
waitUntil {
script {
def r = sh script: 'curl http://example', returnStatus: true
retturn (r == 0)
}
}
}
retry
重复执行块
执行N 次闭包内的脚本。如果其中某次执行抛出异常,则只中止本次执行,并不会中止整个retry的执行。同时,在执行retry的过程中,用户是无法中止pipeline的。
steps {
retry(20) {
script {
sh script: 'curl http://example', returnStatus: true
}
}
}
sleep
sleep步骤可用于简单地暂停pipeline
其支持的参数有:
- time:整型,休眠时间。
- unit(可选):时间单位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS(默认)、MINUTES、HOURS、DAYS。
sleep(120) //120秒
sleep(time:'2', unit:"MINUTES") //2分钟
自动清理空间
通常,当pipeline执行完成后,并不会自动清理空间。如果需要(通常需要)清理工作空间,则可以通过Workspace Cleanup插件实现。
注意:需要ws-cleanup插件
在post部分加入插件步骤
post {
always {
cleanWs()
}
}
七.ANT风格表达式
Ant是比Maven更老的Java构建工具。Ant发明了一种描述文件路径的表达式,大家都习惯称其为Ant风格路径表达式。Jenkins pipeline的很多步骤的参数也会使用此变道时。
Path | Description |
---|---|
/app/*.x | 匹配(Matches)app路径下所有.x文件 |
/app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern |
/**/example | 匹配项目根路径下 /project/example, /project/foow/example, 和 /example |
/app/**/dir/file. | 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java |
/**/*.jsp | 匹配项目根路径下任何的.jsp 文件 |
需要注意的是,路径匹配遵循最长匹配原则(has more characters),例如/app/dir/file.jsp符合/**/.jsp和/app/dir/.jsp两个路径模式,那么最终就是根据后者来匹配。
pipeline 步骤的更多相关文章
- Jenkins pipeline:pipeline 使用之语法详解
一.引言 Jenkins 2.0的到来,pipline进入了视野,jenkins2.0的核心特性. 也是最适合持续交付的feature. 简单的来说,就是把Jenkins1.0版本中,Project中 ...
- Jenkins pipeline:pipeline 语法详解
jenkins pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...
- 使用Jenkins pipeline流水线构建docker镜像和发布
新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...
- [持续交付实践] pipeline使用:语法详解
一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...
- 1. Tensorflow高效流水线Pipeline
1. Tensorflow高效流水线Pipeline 2. Tensorflow的数据处理中的Dataset和Iterator 3. Tensorflow生成TFRecord 4. Tensorflo ...
- Jenkins pipeline 语法详解
原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节 ...
- 转~Jenkins pipeline:pipeline 使用之语法详解
一.引言 Jenkins 2.0的到来,pipline进入了视野,jenkins2.0的核心特性. 也是最适合持续交付的feature. 简单的来说,就是把Jenkins1.0版本中,Project中 ...
- Apache Beam实战指南 | 大数据管道(pipeline)设计及实践
Apache Beam实战指南 | 大数据管道(pipeline)设计及实践 mp.weixin.qq.com 策划 & 审校 | Natalie作者 | 张海涛编辑 | LindaAI 前 ...
- pipeline 结构设计
目录 一.pipeline步骤 二.案例 pipeline详解 只生成一次制品 不同环境部署 系统集成测试 指定版本部署 一.pipeline步骤 当团队开始设计第一个pipeline时,该如何下手呢 ...
随机推荐
- pyhon-高并发测试
使用gevent.对注册.接口进行200的并发量进行测试. #!/usr/bin/env python # -*- coding:utf-8 -*- #设置路径:Defualt Settings--- ...
- [luogu4747]Intrinsic Interval
有一个结论,答案一定是所有包含其合法区间中$l$最大且$r$最小的 证明比较容易,考虑两个合法区间有交,那么交必然合法,同时交也必然包含该区间,因此这个区间一定是合法的(取$l$最大的和$r$最小的两 ...
- [atARC105D]Let's Play Nim
先对$n$分奇偶两种情况考虑-- $n$为奇数,显然先手希望最终产生的$x_{1}\oplus x_{2}\oplus...\oplus x_{n}=0$ 对于后手,考虑构造:将最大的未被选择的$a_ ...
- P6072 『MdOI R1』Path
考虑我们有这样操作. 我们只要维护两点在子树内和两点在子树外的异或和即可. 前者可以类似于线段树合并的trie树合并. 后者有两种做法: 一种是把dfn序翻倍:然后子树补变成了一个区间最大异或问题,可 ...
- CODE FESTIVAL 2017 qual C F - Three Gluttons(DP)
洛谷题面传送门 & Atcoder 题面传送门 DP 好题. 首先考虑如果我们知道 C 吃了哪些寿司,能够还原出多少种符合条件的序列.我们考虑倒着钦定,即,先钦定 A,B,C 三者最后吃的那三 ...
- Codeforces 582D - Number of Binominal Coefficients(Kummer 定理+数位 dp)
Codeforces 题目传送门 & 洛谷题目传送门 一道数论与数位 dp 结合的神题 %%% 首先在做这道题之前你需要知道一个定理:对于质数 \(p\) 及 \(n,k\),最大的满足 \( ...
- Prometheus_exporter安装与使用
Promethues概述:可以看一下更详细的介绍,以下为转载的博客,原文链接,支持原创,请多多支持!!:闫世成的博客园 Prometheus-node-exporter 1.简介: 内核公开的硬件和操 ...
- 【模板】无源汇有上下界可行流(网络流)/ZOJ2314
先导知识 网络最大流 题目链接 https://vjudge.net/problem/ZOJ-2314 题目大意 多组数据,第一行为数据组数 \(T\). 对于每一组数据,第一行为 \(n,m\) 表 ...
- == 和 equals() 方法的区别
== 在比较基本数据类型时,是比较两边的数据的值是否相等 // 整数类型 int num1 = 1; // 双精度浮点数类型 double num2 = 1.0; // 输出结果为 true Syst ...
- Docker快速上手入门
Docker 什么是Docker? Docker就是一种虚拟化的技术 可以通过Docker快速的下载使用第三方技术,方便搭建环境 目的:Securely build,share and run any ...