Jenkins-Pipeline语法:input、if、Parallel、post
1、input
1.1、作用
stage的input指令允许我们中断当前的执行任务,以待进行确认和其它操作,如果我们确认没问题,那么就继续执行
1.2、命令参数
1.2.1、message
提示信息
1.2.2、ok
确认按钮信息
1.2.3、submitter
提交者信息
1.2.4、parameters
自定义参数,可以是各种类型的样式
1.3、格式示例
input { message "Should we continue?" ok "Yes, we should." submitter "user1,user2" parameters { string(参数格式) } }
1.4、简单测试示例
1.4.1、需求
我们在执行测试结束前,临时中断一下任务,让内部用户简单的确认一下
1.4.2、在之前的项目中增加此state
stage('Check') { input { message "Should we continue?" ok "Yes, we should." } steps { echo "检查项目" } }
1.4.3、鼠标确认,方可进行一步构建
结果显示:在最后一步多出来了一步确认步骤,提示信息是"Should we continue",继续选择是"Yes,we should",终止是"Abort". 如果我们不加ok的话,确认的信息默认是“Proceed”。
1.5、input->parameters实践
1.5.1、方式1:变量输入的定制
stage('Check') { input { message "Should we continue?" ok "Yes, we should." parameters { string(name:'PERSON',defaultValue:'大师',description:'请输入确认者的身份') } } steps { echo "经过 ${PERSON}的检查,该项目没有问题" } }
1.5.2、方式2:变量选择的定制
stage('Check') { input { message "Should we continue?" ok "Yes, we should." parameters { choice(name:'CHOICE',choices:['Dev','Test','Prod'],description:'请选择分支') password(name:'PASSWORD',defaultValue:'PWD',description:'请输入密码') } } steps { echo "经过 ${PERSON}的检查,该项目没有问题" } }
2、if-条件语法
2.1、作用
对于pipeline来说,我们一般会使用if语句或者try语句来进行条件的流程控制,这两种方式效果都差不多,我们这里以if语句为例,格式效果如下: 参考资料:https://www.jenkins.io/doc/book/pipeline/syntax/#flow-control
2.2、语法示例
node { stage('Example') { if (条件值 == '匹配内容') { echo 'xxx' } else { echo 'xxx' } } }
2.3、条件值:sh执行命令返回执行结果介绍
2.3.1、命令格式介绍
这里的条件值,我们一般使用shell命令的执行后的状态返回值来进行获取,由于jenkinsfile的特殊性, 普通shell命令的状态返回值必须以文件的方式落地,也就是说stdout的内容重定向到文件,在jenkins的sh语法中,需要开启 returnStatus: true 属性
格式效果如下
result = sh returnStdout: true ,script: "<shell command>" result = sh(script: "<shell command>", returnStdout: true)
2.3.2、语法示例
默认情况下,sh命令的状态返回值是 0 或者 非0,如果我们想要指定状态返回值的内容的话,可以使用如下格式: result = sh(script: "<shell command> && echo 'true' || echo 'false' ", returnStdout: true)
2.3.3、示例:判断目录是否存在,存在则删除目录
pipeline { agent any stages { stage('Hello') { steps { script { result = sh(script:"[ -d tomcat_pro ]",returnStatus:true) if(result == 0) { sh 'rm -rf tomcat_pro' } } sh 'git clone git@192.168.10.10:web/tomcat_pro.git' } } } }
3、Parallel【并行语法】
3.1、作用
声明性Parallel的代码块中的可以嵌套多个stage,从而让多个stage任务并行执行。
注意:
一个stage有且只能有一个steps,stages或parallel
嵌套的stages本身不能包含其他parallel stage
但在其他方面的行为与stage相同
任何包含parallel的stage都不能包含agent或者tools
3.2、语法格式
pipeline { stage('Parallel Stage') { parallel { stage('Parallel_Stage_1') { steps { echo "Parallel_Stage_1" } } ... stage('Parallel_Stage_n') { stages { stage('Parallel_Stage_n_1') { steps { echo "Parallel_Stage_n_1" } } ... stage('Parallel_Stage_n_2') { steps { echo "Parallel_Stage_n_1" } } } } } } }
3.3、并行流水线示例
3.3.1、pipeline代码
pipeline { agent any stages { stage('Prepare') { steps { echo "开始tomcat_web任务" } } stage('CloneCode') { steps { echo "git获取代码" sh 'rm -rf tomcat_pro' sh 'git clone git@192.168.10.10:web/tomcat_pro.git' sh 'cd tomcat_pro && pwd && git config --local user.name "jenkins" && git config --local user.email "jenkins@example.com"' } } stage('ArchiveROOT') { steps { echo "制作ROOT.tar.gz" sh 'cd tomcat_pro && tar -C tomcat-web -zcf tomcat-web/ROOT.tar.gz ROOT --remove-files' } } stage('MakeDockerImage') { steps { echo "制作Docker镜像" sh 'cd tomcat_pro && docker build -t tomcat-web:v0.1 ./tomcat-web' } } stage('Deploy') { parallel { stage('deploy_nginx') { steps { echo "并行任务:部署nginx应用" } } stage('deploy_tomcat1') { steps { echo "并行任务:部署deploy_tomcat1应用" } } stage('deploy_tomcat2') { stages { stage('delete_container') { steps { echo "串行:删除旧容器" sh 'docker stop tomcat-web' sh 'docker rm -f tomcat-web' } } stage('start_container') { steps { echo "串行:启动新容器" sh 'docker run -d --name tomcat-web -p 8081:8080 tomcat-web:v0.1' } } } } } } } }
3.3.2、运行结果
4、post【发送信息】
4.1、作用
post 部分定义了一个或多个在管道或阶段运行完成后运行的附加步骤(取决于 post 部分在管道中的位置)。
post 可以支持以下任何后置条件块: always、changed、fixed、regression、aborted、failure、success、unstable、unsuccessful、cleanup。
这些条件块允许根据管道或阶段的完成状态在每个条件内执行步骤。 条件块按如下所示的顺序执行。
4.2、post参数
4.2.1、always
无论任务执行的状态如何,都会触发执行动作
4.2.2、changed
如果当前流水线或阶段的运行与之前的运行具有不同的完成状态,则仅运行post 中的步骤。
4.2.3、fixed
仅当当前管道或阶段的运行成功且前一次运行失败或不稳定时,才运行 post 中的步骤。
4.2.4、regression
仅当当前管道或阶段的运行状态为失败、不稳定或中止并且前一次运行成功时才运行 post 中的步骤。
4.2.5、aborted
仅当当前流水线或阶段的运行处于“中止”状态时才运行 post 中的步骤,这通常是由于流水线被手动中止。 这通常在 Web UI 中用灰色表示。
4.2.6、failure
仅当当前管道或阶段的运行具有“失败”状态时才运行 post 中的步骤,通常在Web UI 中用红色表示。
4.2.7、success
仅当当前管道或阶段的运行具有“成功”状态时才运行 post 中的步骤,通常在Web UI 中用蓝色或绿色表示。
4.2.8、unstable
仅当当前流水线或阶段的运行处于“不稳定”状态时才运行 post 中的步骤,这通常是由测试失败、代码违规等引起的。 这通常在 Web UI 中用黄色表示。
4.2.9、unsuccessful
如果当前流水线或阶段的运行没有“成功”状态,则仅运行 post 中的步骤。 这通常在 Web UI 中表示,具体取决于前面提到的状态。
4.2.10、cleanup
在评估所有其他后置条件后运行此后置条件中的步骤,而不管管道或阶段的状态如何。
4.2、post实践
4.2.1、代码块
# 在 stages 同级别的位置,添加一个post 配置段 post { always { echo '任务执行结束就发出信息' } }
4.2.2、pipeline代码
pipeline { agent any post { always { echo '任务执行结束就发出信息' } } stages { stage('Prepare') { steps { echo "开始tomcat_web任务" } } stage('CloneCode') { steps { echo "git获取代码" sh 'rm -rf tomcat_pro' sh 'git clone git@192.168.10.10:web/tomcat_pro.git' sh 'cd tomcat_pro && pwd && git config --local user.name "jenkins" && git config --local user.email "jenkins@example.com"' } } stage('ArchiveROOT') { steps { echo "制作ROOT.tar.gz" sh 'cd tomcat_pro && tar -C tomcat-web -zcf tomcat-web/ROOT.tar.gz ROOT --remove-files' } } stage('MakeDockerImage') { steps { echo "制作Docker镜像" sh 'cd tomcat_pro && docker build -t tomcat-web:v0.1 ./tomcat-web' } } stage('Deploy') { parallel { stage('deploy_nginx') { steps { echo "并行任务:部署nginx应用" } } stage('deploy_tomcat1') { steps { echo "并行任务:部署deploy_tomcat1应用" } } stage('deploy_tomcat2') { stages { stage('delete_container') { steps { echo "串行:删除旧容器" sh 'docker stop tomcat-web' sh 'docker rm -f tomcat-web' } } stage('start_container') { steps { echo "串行:启动新容器" sh 'docker run -d --name tomcat-web -p 8081:8080 tomcat-web:v0.1' } } } } } } } }
4.2.3、运行结果查看
结果显示:多了一个 post的Actions