pipeline步骤

pipeline步骤

2023年7月13日发(作者:)

pipeline步骤⽬录⼀.简介步骤是pipeline⾥执⾏的最⼩单位了,这⾥列举内置的相关步骤⽅便使⽤,省的去写很多shell,也不⽅便维护。⼆.⽂件相关删除当前⽬录⽆参步骤,删除的是当前⼯作⽬录。通常它与dir步骤⼀起使⽤,⽤于删除指定⽬录下的内容。deleteDir切换到⽬录默认pipeline⼯作在⼯作空间⽬录下(/root/.jenkins/workspace/xx项⽬名),dir步骤可以让我们切换到其他⽬录。dir('/xx') { deleteDir}判断⽂件是否存在判断/tmp/⽂件是否存在fileExists('/tmp/')输出状态script { def status=fileExists('/tmp/') print "${status}"}判断是否为类Unix如果当前pipeline运⾏在⼀个类Unix系统上,则返回truescript { 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: "", text: "$BUILD_NUMBER" stash(name: "abc", include: "") } } } stage("unstash") { agent { label "node2" } steps { script { unstash("abc") def content = readFile("") echo "${content}" } } } }}三.命令相关script直接执⾏groovy的命令会报错,需要⽤script括起来。与命令相关的步骤其实是Pipeline:Nodes and Processes插件提供的步骤。由于它是Pipeline插件的⼀个组件,所以基本不需要单独安装。script { def browsers = ['chrome', 'firefox'] for (int i = 0; i < (); ++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/", returnStdout: true)bat、powershellbat步骤执⾏的是Windows的批处理命令。powershell步骤执⾏的是PowerShell脚本,⽀持3+版本。这两个步骤⽀持的参数与sh步骤的⼀样。四.调⽤其它pipeline在Jenkins pipeline中可以使⽤build步骤实现调⽤另⼀个pipeline功能。build步骤是pipeline插件的⼀个组件,所以不需要另外安装插件,可以直接使⽤。build步骤其实也是⼀种触发pipeline执⾏的⽅式,它与triggers指令中的upstream⽅式有两个区别:步骤是由上游pipeline使⽤的,⽽upstream⽅式是由下游pipeline使⽤的。步骤是可以带参数的,⽽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:'anbncn'), string(name:'CHOICES00', value:'dev')]我们注意到choice类型的参数没有对应的传参⽅法,⽽是使⽤string传参⽅法代替的。除此之外,build步骤还⽀持其他三个参数propagate(可选): 布尔类型,如果值为true,则只有当下游pipeline的最终结构状态为SUCCESS时,上游pipeline才算成功;如果值为flase,则不论下游pipeline的最终构建状态是什么,上游pipeline都忽略。默认值为truequietPeriod(可选): 整形,触发下游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 (S == 'test') { echo "deploy to test" } } }}这样写起来很不优雅,Conditional BuildStep插件可以让我们像使⽤when指令⼀样进⾏条件判断。⼀下代码是安装后的写法pipeline { agent any parameters { choice(name:'CHOICES', choices:'devntestnstaging', description:'请选择部署的环境') } stages { stage("deploy test") { when { expression {return S == 'test'} } steps { echo "deploy to test" } } stage("deploy staging") { when { expression {return S == '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('').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: 'ool' echo "${t}" //打印 /var/lib/docker }}tool步骤⽀持的参数有:name:⼯具名称。type(可选):⼯具类型,指该⼯具安装类的全路径类名。每个插件的type值都不⼀样,⽽且绝⼤多数插件的⽂档根本不写type值。除了到该插件的源码中查找,还有⼀种⽅法可以让我们快速找到type值,就是前往Jenkins pipeline代码⽚段⽣成器中⽣成该tool步骤的代码即可。timeout代码块超时时间。为timeout步骤闭包内运⾏的代码设置超时时间限制。如果超时,将抛出⼀个terruptedException异常。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 example', returnStatus: true retturn (r == 0) } }}retry重复执⾏块执⾏N 次闭包内的脚本。如果其中某次执⾏抛出异常,则只中⽌本次执⾏,并不会中⽌整个retry的执⾏。同时,在执⾏retry的过程中,⽤户是⽆法中⽌pipeline的。steps { retry(20) { script { sh script: 'curl example', returnStatus: true } }}sleepsleep步骤可⽤于简单地暂停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/app/*.x/app/p?ttern/**/example匹配(Matches)app路径下所有.x⽂件Description匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern匹配项⽬根路径下 /project/example, /project/foow/example, 和 /example/app/**/dir/file.匹配(Matches) /app/dir/, /app/foo/dir/,/app/foo/bar/dir/, 和 /app/dir//**/*.jsp匹配项⽬根路径下任何的.jsp ⽂件需要注意的是,路径匹配遵循最长匹配原则(has more characters),例如/app/dir/符合/**/.jsp和/app/dir/.jsp两个路径模式,那么最终就是根据后者来匹配。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689200620a220073.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信