ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Jenkins Pipeline语法讲解

2022-05-25 14:31:49  阅读:189  来源: 互联网

标签:文件 Pipeline 步骤 pipeline stash 讲解 Jenkins 执行 stage


pipeline最简结构

pipeline {
	agent any
	stages {
		stage("build") {
			steps {
				echo "hello world"
			}
		}
	}
}
  • pipeline:代表整条流水线,包括整条流水线的逻辑
  • stages:流水线中多个stage的容器。stages部分至少包含一个stage
  • stage:阶段,代表流水线的阶段。每个阶段都必须有名称。上述例子中,build就是此阶段的名称
  • steps:代表阶段中的一个或多个具体步骤的容器。steps部分至少包含一个步骤。上述例子中,echo就是一个步骤。在一个stage中有且只有一个steps
  • agent:指定流水线的执行位置(jenkins agent)。流水线中的每个阶段都必须在某个地方(物理机、虚拟机或Docker容器)执行,agent部分即指定具体在哪里执行。

注意:以上每一个部分都是必需的,少一个,jenkins都会报错

步骤

pipeline基本结构决定的是pipeline整体流程,但是真正“做事”的还是pipeline中的每一个步骤。步骤是pipeline中已经不能再拆分的最小操作。

post部分

...
post {
	failure {
		mail to: "team@example.com",subject:“The Pipeline failed”
	}
}

post部分包含的是在整个pipeline或阶段完成后一些附加的步骤。post部分是可选的,并不包含在pipeline最简结构中。

根据pipeline或阶段的完成状态,post部分分成多种条件块,比如:

  • always:不管当前完成状态是什么,都执行
  • changed:只要当前完成状态和上一次完成状态不同就执行
  • fixed:上一次完成状态为失败或者不稳定(unstable),当前完成状态为成功时执行
  • regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止时执行
  • aborted:当前执行结果状态是中止状态时执行
  • failure:当前完成状态为失败时执行
  • success:当前完成状态为成功时执行
  • unstable:当前完成状态为不稳定时执行
  • cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。

post部分可以同时包含多个条件块,代码如下:

pipeline {
	agent any 
    stages {
    	stage("build") {
    		steps {
    			echo "build stage"
    		}
    		post {
    			always {
    				echo "stage post always"
    			}
    		}
    	}
    }
    post {
    	changed {
    		echo "pipeline post changed"
    	}
    	always {
    		echo "pipeline post always"
    	}
    	...
    }
}

pipeline支持的指令

pipeline的基本结构满足不了现实多变的需求。所以,jenkins pipeline通过各种指令(directive)来丰富自己。

Jenkins pipeline支持的指令有:

  • environment:用于设置环境变量,可定义在stage或pipeline部分
  • tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中
  • input:定义在stage部分,会暂停pipeline,提示你输入内容
  • options:用于配置jenkins pipeline本身的选项,比如options { retry(3) }表示,当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分
  • parallel:并行执行多个step。
  • parameters:与input不同,parameters是执行pipeline前传入的一些参数
  • triggers:用于定义执行pipeline的触发器
  • when:当满足when定义的条件时,阶段才执行。

注意:在使用指令时,需要注意的是每个指令都有自己的作用域。如果指令使用的位置不正确,Jenkins将会报错。

pipeline内置基础步骤

文件目录相关步骤

deleteDir:删除当前目录

deleteDir是一个无参步骤,删除的是当前工作目录。通常它与dir步骤一起使用,用于删除指定目录下的内容。

dir:切换到指定目录

默认pipeline工作在工作空间目录下,dir步骤可以让我们切换到其他目录。

dir("/var/logs"){
	deleteDir()
}

fileExists:判断文件是否存在

fileExists("/tmp/a.jar")判断/tmp/a.jar文件是否存在。如果参数是相对路径,则判断在相对于当前工作目录下,该文件是否存在。结果返回布尔类型

isUnix:判断是否为类Unix系统

如果当前pipeline运行在一个类Unix系统上,则返回true

pwd:确定当前目录

pwd和Linux系统中pwd命令一样,返回当前所在目录。它有一个布尔类型的可选参数:tmp,如果参数值为true,则返回与当前工作空间管理的临时目录

writeFile:将内容写入指定文件中

writeFile支持的参数有:

  • file:文件路径,可以是绝对路径,也可以是相对路径
  • text:要写入的文件内容
  • encoding(可选):目标文件的编码。如果留空,则使用操作系统默认编码。

readFile:读取文件内容

读取指定文件的内容,以文本返回。readFile支持的参数有:

  • file:
  • 文件路径,可以是绝对路径,也可以是相对路径
  • encoding(可选):目标文件的编码。如果留空,则使用操作系统默认编码。

示例:

...
script{
	// "amVua2lucyBib29r" 是 “jenkins book”进行base64编码后的值
	writeFile(file:"base64File",text:"amVua2lucyBib29r",encoding:"Base64")
	def content = readFile(file:"base64File",encoding:"UTF-8")
	echo "${content}"
	
	//打印结果:jenkins book
}

命令相关步骤

与命令相关的步骤其实是Pipelin:Node and Processes插件提供的步骤。由于它是Pipeline插件的一个组件,所以基本不需要单独安装。

sh:执行shell命令

sh步骤支持的参数有:

  • script:将要执行的shell脚本,通常在类UNIX系统上可以是多行脚本
  • encoding:脚本执行后输出日志的编码,默认值是脚本运行所在系统的编码
  • returnStatus:布尔类型,默认脚本返回的是状态码,如果是一个非零的状态码,则会引发pipeline执行失败。如果returnStatus参数为true,则不论状态码是什么,pipeline的执行都不会受影响。
  • returnStdout:布尔类型,如果为true,则任务的标准输出将作为步骤的返回值,而不是打印到构建日志中(如果有错误,则依然会打印到日志中)

注:除了script参数,其他参数都是可选的。returnStatus和returnStdout参数一般不同时使用,因为返回值只能有一个;如果同时使用,则只有returnStatus参数生效。

bat、powershell步骤

bat步骤执行的是Windows的批处理命令;powershell步骤执行的是Powershell脚本,这两个步骤支持的参数和sh步骤一样。

制品相关步骤

stash:保存临时文件

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文件

unstash步骤只有一个name参数,即stash时的唯一标识。通常stash和unstash步骤同时使用。

pipeline {
	agent none
	stages {
		stage("stash"){
			agent {label "master"}
			steps {
				writeFile(file: "a.txt",text: "$BUILD_NUMBER")
				stash(name: "abc",includes: "a.txt")
			}
		}
		stage("unstash") {
			agent {label "node2"}
			steps {
				script{
					unstash("abc")
					def content = readFile("a.txt")
					echo "${content}"
				}
			}
		}
	}
}

以上示例中,stash步骤在master节点上执行,而unstash步骤在node2节点上执行

其他步骤

error:主动报错,中止点前pipeline

error步骤的执行类似抛出一个异常。它只有一个必需参数:message。通常省略参数:error("there's an error")

tool:使用预定义的工具

如果在Global Tool Configuration(全局工具配置)中配置了工具,那么可以通过tool步骤得到工具路径。

tool步骤支持的参数有:

  • name:工具名称
  • type(可选):工具类型,指该工具安装类的全路径类名。

timeout:代码块超时时间

为timeout步骤闭包内运行的代码设置超时时间限制。如果超时,将抛出一个org.jenkinssci.plugins.workflow.steps.FlowInterruptedException异常。timeout步骤支持如下参数:

  • time:整型,超时时间
  • unit(可选):时间单位,默认是MINUTES
  • activity(可选):布尔类型,如果值为true,则只用当日志没有活动后,才真正算作超时。

waitUntil:等待条件满足

不断重复waitUntil块内的代码,直到条件为true。waitUntil不负责处理块内代码的异常,遇到异常时直接向外抛出。waitUntil步骤最好与timeout步骤共同使用,避免死循环。

timeout(50) {
	waitUntil {
		script {
			def r = sh script:"curl http://example",returnStatus:true
			return (r == 0)
		}
	}
}

retry:重复执行块

执行N次闭包内的脚本。如果其中某次执行抛出异常,则只中止本次执行,并不会中止整个retry的执行。同时,在执行retry的过程中,用户是无法中止pipeline的。

steps {
	retry(20){
		script {
			sh script:"curl http://example",returnStatus:true
		}
	}
}

sleep:让pipeline休眠一段时间

sleep步骤可用于简单地暂停pipeline,其支持的参数有:

  • time:整型,休眠时间
  • unit(可选),默认是SECONDS
sleep(120)  //休眠120秒
sleep(time:"2",unit:"MINUTES")

Ant风格路径表达式

Ant是比maven更老的java构建工具、Ant发明了一种描述文件路径的表达式,大家都习惯称其为Ant风格路径表达式。其包括3中通配符:

  • ?:匹配任何单个字符
  • *:匹配0个或任意数量的字符
  • **:匹配0个或多个目录

标签:文件,Pipeline,步骤,pipeline,stash,讲解,Jenkins,执行,stage
来源: https://www.cnblogs.com/Torres-tao/p/16309188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有