3.3 pipeline 内置基础步骤
3.3.1 pipeline中使用脚本
在实际项目,可能在某些步骤需要使用少量
的脚本,这个时候可以使用script
来实现,示例如下所示:
pipeline{
agent any
stages{
stage("Script demo"){
steps{
script{
def personInfo=["Surpass",28,"Shanghai"]
for(int i=0;i
script 里面实际运行就是Groovy
代码,如果script里面需要大量的代码,需要进行拆分到不同的阶段
或者使用共享库
来实现。
3.3.2 pipeline内置步骤
3.3.2.1 目录和文件相关步骤
dir
主要功能是切换目录
,默认pipeline是运行其工作目录中,使用该dir可以切换到其他目录
deleteDir
主要功能是删除当前目录
,是一个无参步骤,通常与dir
一起使用。示例如下所示:
pipeline{
agent any
stages{
stage("delete dir demo"){
steps{
dir("/var/log/jenkins"){
echo "delete dir /var/log/jenkins"
deleteDir()
}
}
}
}
}
fileExists
主要功能是判断文件是否存在
,支持绝对路径
和相对路径
,结果返回boolean类型,示例如下所示:
pipeline{
agent any
stages{
stage("check file exists demo"){
when {
expression {
return fileExists("/etc/hosts")
}
}
steps{
echo "file /etc/hosts exists"
}
}
}
}
或
pipeline{
agent any
options {
timestamps()
}
stages{
stage("check file exists demo"){
steps{
script {
println "check /etc/hosts exists"
def ret=fileExists("/etc/hosts")
println "ret is ${ret}"
}
}
}
}
}
运行结果如下所示:
isUnix
主要功能是判断是否为UNIX系统
,结果返回boolean类型,示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("check os type demo"){
steps{
script {
println "check os type"
def isUnix=isUnix()
println "isUnix:${isUnix}"
}
}
}
}
}
pwd
主要功能是打印当前目录
,与Linux中pwd命令类似,示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("print current workdir demo"){
steps{
script {
println "print current workdir "
def curDir=pwd()
println "current workdir is:${curDir}"
}
}
}
}
}
运行结果如下所示:
pwd还有一个boolean类型的
可选参数
,示例为:pwd(tmp:true),用于打印与当前工作空间关联的临时目录
writeFile
主要功能是将指定内容写入文件
,其主要参数如下所示:
file:文件路径,支持绝对路径
和相对路径
text:写入文件的数据
encoding:为可选参数
,写入文件的编码格式,如果为空,则默认使用系统默认的编码。
readFile
主要功能是将指定内容读取文件
,其主要参数如下所示:
file:文件路径,支持绝对路径
和相对路径
encoding:为可选参数
,读取文件的编码格式,如果为空,则默认使用系统默认的编码。
writeFile
和readFile
示例如下所示:
pipeline{
agent any
options {
timestamps()
}
parameters{
string(name:"filePath",
defaultValue:"/var/log/surpass.log",
description:"read and write file demo"
)
}
stages{
stage("write and read file demo"){
steps{
script {
writeFile(
file:"${params.filePath}",
text:"name:Surpass\nage:28\nlocation:Shanghai\n",
encoding:"utf8"
)
def content=readFile(
file:"${params.filePath}",
encoding:"utf8"
)
println "read file:${params.filePath}\nContent is\n${content}"
}
}
}
}
}
运行结果如下所示:
3.3.2.2 命令相关步骤
pipeline 支持的命令相关步骤主要涉及到命令sh
、bat
和powershell
,sh主要用于Unix/Linux,bat和powershell主要用于Windows,三者支持参数一样,我们主要以sh为例,主要参数如下所示:
- script: 要运行的脚本
- encoding: 脚本运行后输出日志的编码,默认为系统编码
- returnStatus:
boolean类型
,默认值为脚本返回的状态码,如果返回是非零
值,则触发pipeline运行失败,如果returnStatus为true
,则忽略返回的状态码值,pipeline不受其影响 - returnStdout:
boolean类型
,如果returnStdout为true
,则标准输出将做为返回值
,而不是打印到构建日志中。
returnStatus 和 returnStdout 两个参数一般不会同时使用,如果同时使用,则只有 returnStatus 参数生效。示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("run script cmd demo"){
steps{
script {
println "将sh的返回值做为参数使用"
def getReturnResult=sh(
script:"date '+%Y%m%d-%H%M%S'",
encoding:"utf8",
returnStdout:true
)
println "getReturnResult is ${getReturnResult}"
sh(
script:"ls /var/log/suprass.txt",
encoding:"utf8",
returnStatus:false
)
}
}
}
}
}
运行结果如下所示:
为了做对比,修改returnStatus为true
pipeline{
agent any
options {
timestamps()
}
stages{
stage("run script cmd demo"){
steps{
script {
println "将sh的返回值做为参数使用"
def getReturnResult=sh(
script:"date '+%Y%m%d-%H%M%S'",
encoding:"utf8",
returnStdout:true
)
println "getReturnResult is ${getReturnResult}"
sh(
script:"ls /var/log/suprass.txt",
encoding:"utf8",
returnStatus:true
)
}
}
}
}
}
运行结果如下所示:
3.3.2.3 其他相关步骤
error
用于主动报错,中止pipeline的运行,主要有一个参数message
,示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("throw error demo"){
steps{
script {
println "主动抛出异常示例"
error(
message:"主动抛出异常示例"
)
}
}
}
}
}
运行结果如下所示:
timeout
用于为被timeout包含的代码块设置超时时间。主要支持的参数如下所示:
time:整型,超时时间
unit:可选参数
,为时间单位,支持的值有NANOSECONDS
、MICROSECONDS
、MILLISECONDDS
、
SECONDS
、MINUTES(默认)
、HOURS
、DAYS
activity:可选参数
,如果为true,则代表在日志没有活动后,才算作超时。
示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("timeout demo"){
steps{
script {
timeout(time:1,unit:"NANOSECONDS"){
sh(
script:"sleep 10",
encoding:"utf8",
returnStatus:true
)
}
}
}
}
}
}
运行结果如下所示:
waitUntil
不断重复运行waitUntil里面的代码,直至条件为true。waitUntil不负责处理代码里面的异常异常,若遇到错误,则直接抛出异常。
示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("waitUntil demo"){
steps{
script {
timeout(time:1,unit:"SECONDS"){
waitUntil{
def statusCodes=sh(
script:"curl -X GET -o /dev/null -I -s -w %{http_code} https://www.baidu.com/",
encoding:"utf8",
returnStdout:true
)
println "status code is ${statusCodes}"
def ret=(statusCodes == 400)
println "ret is ${ret}"
return ret
}
}
}
}
}
}
}
运行结果如下所示:
waitUntil
一般常与timeout
一起使用,从而避免死循环
retry
将被retry包含的脚本按指定次数重复执行。如果其中某一次出现异常,则中止本次执行,再次进行下一次执行。示例如下所示:
pipeline{
agent any
options {
timestamps()
}
stages{
stage("retry demo"){
steps{
script {
retry(3){
sh(
script:"echo surpass",
encoding:"utf8",
returnStatus:true
)
error(
message:"throw error"
)
}
}
}
}
}
}
运行结果如下所示:
sleep
sleep 与Linux中的sleep命令类似,一般用于暂停pipeline,其支持的参数如下所示:
time:整型,超时时间
unit:可选参数
,为时间单位,支持的值有NANOSECONDS
、MICROSECONDS
、MILLISECONDDS
、
SECONDS(默认)
、MINUTES
、HOURS
、DAYS
pipeline{
agent any
options {
timestamps()
}
stages{
stage("timeout demo"){
steps{
script {
sleep(
time:10,
unit:"SECONDS"
)
println "after pause 10s"
}
}
}
}
}
运行结果如下所示: