pipline 简介
pipline运行在jenkins 2.X版本的核心插件,Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化。流水线的优势:
可持续性:jenkins的重启或者中断后不影响已经执行的Pipline Job 支持暂停:pipline可以选择停止并等待人工输入或批准后再继续执行。 可扩展性:通过groovy的编程更容易的扩展插件。 并行执行:通过groovy脚本可以实现step,stage间的并行执行,提高构建效率。流水线的分类及对比:
pipline流水线分为脚本式流水线与声明式流水线: 1.语法差异,声明式的在pipline {}块中定义,脚本式直接以node开始 2.脚本式的在一台节点执行所有操作,而声明式可以将不同的节点定义到不同的节点执行。 3.声明式比脚本式的写法更复杂,但功能更强大 4.目前主要使用声明式较多pipline 语法简介:
流水线过程定义在 Pipeline{}块中,在Pipeline 块定义了整个流水线中完成的所有的操作。 Stage阶段:一个pipline可以划分为若干个stage,每个stage都是一个操作阶段,比如代码clone、代码编译、代码测试和代码部署,阶段是一个逻辑分组,在pipline中可以实现跨多个node执行不同的stage。 Step步骤:step是jenkins pipline最基本的操作单元,一个stage中可以有多个step,例如在代码clone的stage中需要定义代码clone的step、在代码编译stage需要定义代码编译的step。 Node:jenkins工作节点,可以是jenkins master也可以是jenkins slave,node是执行step的具体服务器。1、pipline 语法-指定节点:
基于agent指令选择jenkins节点: (1) any:可以在任何可用的节点执行,有jenkins自动分配 (2) none:表示pipline脚本没有定义在默认执行的jenkins节点,需要在后续的每一个stage中单独定义节点pipeline { agent any stages { stage('代码clone'){ agent any steps{ sh 'echo 代码clone' } } stage('代码部署'){ agent any steps{ sh 'echo 代码部署' } } stage('镜像更新'){ agent any steps{ sh 'echo 镜像更新' } } } }
在下面位置输入pipline脚本
构建结果视图
(3) label:通过标签指定在指定的节点执行从操作:
pipeline{ //agent any //全局必须带有agent,表明此pipeline执行节点 agent { label 'jenkins-node1' } //基于label指定具体执行的步骤节点,非必须 stages{ stage("代码clone"){ //#agent { label 'master' } //基于label指定具体执行的步骤节点,非必须 steps{ sh "cd /var/lib/jenkins/workspace/pipline-test01 && rm -rf ./*" git credentialsId: 'bbe90a97-a6fd-4429-9023-4d527f5d01c4', url: '[email protected]:gxn/app1.git' echo "代码 clone完成" } } stage("代码构建"){ //#agent { label 'master' } //基于label指定具体执行的步骤节点,非必须 steps{ sh "tar czvf frontend.tar.gz --exclude=.git --exclude=.gitignore --exclude=README.md ./" } } } }
注:git credentialsId: 'bbe90a97-a6fd-4429-9023-4d527f5d01c4', url: '[email protected]:gxn/app1.git' 以如下方式生成
点击构建 最终会在jenkins-node1 /var/lib/jenkins/workspace/pipline-test01 下生成frontend.tar.gz文件
(4) node:和 label 的功能类似都是用于指定节点,区别是node可以额外设置一些参数配置,比如设置customWorkspace(设置当前stage的自定义工作目录) pipeline { agent none stages { stage('代码clone'){ agent { node { label 'jenkins-master' customWorkspace "/data/gitdata/magedu" } } steps { sh "echo 代码clone" } } stage('代码部署'){ agent { node { label 'jenkins-master' customWorkspace "/data/gitdata/magedu" } } steps { sh "echo 代码部署" } } } }
2、pipline 语法-基于input实现交互式操作:
Input 指令可以在流水线中实现必要的交互式操作,比如选择要部署的环境、是否向后继续执行任务等。 input配置简介: message:必选,在input界面的提示信息,比如:“是否继续?”等,内容可自定义。 id:可选,input 的标识符,默认为 stage 的名称。 ok:可选,确认按钮的显示信息,比如可以是“确定”、“允许”等 自定义内容,默认继续为Proceed 、取消为 Abort。 submitter:可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input。 parameters:提供一个参数列表供 input 使用。 代码:pipeline { agent any stages { stage('交互测试') { input { message "是否继续部署?" ok "继续部署" submitter "jenkinsadmin" } steps { echo "Hello jenkins!" } } } }
3、pipline 语法-post指令
post一般用于pipline流水线执行后的进一步处理,比如错误通知等,post可以针对流水线不同的执行结果做出不同的处理,比如执行成功做什么处理、执行失败做什么处理等。 post条件简介:Post 可以定义在 Pipeline 或 stage 中,目前支持以下条件always:无论Pipeline或stage的最后是执行成功还是失败,都执行post中定义的指令。 changed:只有当前Pipeline或stage的完成状态与它之前的运行不同时,比如从成功转换为失败、或从失败转换为成功,才执行post中定义的指令。 fixed:当本次Pipeline或stage成功,且上一次构建是失败或不稳定时,就执行post中定义的指令,从失败转换为成功。 regression:当本次Pipeline或stage的状态为失败、不稳定或终止,且上一次构建的状态为成功时,就执行post中定义的指令,从成功转换为失败。 failure:只有当前Pipeline或stage的完成状态为失败(failure),才允许在post部分运行该步骤,而且通常这时在Web界面中显示为红色。 success:当前执行状态为成功(success),执行post步骤,通常在Web界面中显示为蓝色或绿色。 unstable:当前状态为不稳定(unstable),执行post步骤,通常原因是由于测试失败或代码违规等造成,而且会在Web界面中显示为黄色。 aborted:当前状态为终止(aborted),执行该post步骤,通常由于流水线被手动终止触发,这时在在Web界面中显示为灰色。 unsuccessful:当前状态只要不是success时,执行该post步骤; cleanup:无论pipeline或stage的完成状态如何,都允许运行该post中定义的指令,和always的区别在于cleanup会在post其它条件执行之后执行(最后执 行cleanup)。post发送邮件通知示例: pipline-job-test9 演示在这执行异常后post阶段的操作,cleanup会晚于always执行,发送邮件需要提前配置好jenkins的邮件通知配置:
pipeline { agent any stages { stage('post测试-代码clone阶段') { steps { sh 'echo git clone' sh 'cd /data/xxx' //此步骤会执行失败,用于验证构建失败的邮件通知 } post { cleanup { script { mail to: '[email protected]', subject: "Pipeline Name: ${currentBuild.fullDisplayName}", body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -cleanup 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情" } } always { script { mail to: '[email protected]', subject: "Pipeline Name: ${currentBuild.fullDisplayName}", body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -always 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情" } } aborted { echo "post aborted" } success { script { mail to: '[email protected]', subject: "Pipeline Name: ${currentBuild.fullDisplayName}", body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} - 构建成功!\n 点击链接 ${env.BUILD_URL} 查看详情" } } failure { script { mail to: '[email protected]', subject: "Pipeline Name: ${currentBuild.fullDisplayName}", body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -failure 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情" } } } } } }
邮件通知:
4、pipline 语法-基于environment传递环境变量
示例:
pipeline { agent any environment { //全局的变量,在当前pipline所有的stage中都会生效 NAME='user1' PASSWD='123456' } stages { stage('环境变量stage1') { environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效 GIT_SERVER = '[email protected]:gxn/app1.git' } steps { sh """ echo '$NAME' echo '$PASSWD' echo '$GIT_SERVER' """ } } stage('环境变量stage2') { steps { sh """ echo '${NAME}' echo '$PASSWD' """ } } } }
测试结果
5、pipline 语法-pipline参数:
基于parameters给step传递参数:可以基于parameters自定义参数,参数用于在执行pipline流水线的时候传递给step进行使用,比如传递选项参数、gitlab的分支、镜像仓库、镜像tag等信息。
parameters简介 string: //字符串类型参数,可以传递账户名、密码等参数 text: //文本型参数,一般用于定义多行文本内容的变量。 booleanParam://布尔型参数 choice://选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值使用 password: //密码型变量,一般用于定义敏感型变量,在 Jenkins 控制台会输出为*隐藏密码
相当于配置-参数化构建过程,如下
示例
pipeline { agent any parameters { string(name: 'BRANCH', defaultValue: 'develop', description: '分支选择') //字符串参数,会配置在jenkins的参数化构建过程中 choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择') //选项参数,会配置在jenkins的参数化构建过程中 } stages { stage('测试参数1') { steps { sh "echo $BRANCH" } } stage('测试参数2') { steps { sh "echo $DEPLOY_ENV" } } } }
6、pipline 语法-options选项配置参数简介:
buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本 timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS, MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS timestamps() //在控制台显示命令执行的时间,格式为10:58:39 retry(2) //流水线构建失败后重试次数为2次
示例:
pipeline { agent any environment { //全局的变量,在当前pipline所有的stage中都会生效 NAME='user1' PASSWD='123456' } options { //定义pipline参数 buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本 timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,MICROSECONDS,MILLISECONDS, SECONDS,MINUTES,HOURS,DAYS timestamps() //在控制台显示命令执行的时间,格式为10:58:39 retry(2) //流水线构建失败后重试次数为2次 } stages { stage('代码clone') { environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效 GIT_SERVER = '[email protected]:gxn/app1.git'
}
steps {
sh " echo '代码clone' "
}
}
}
}
7、pipline 语法-基于if指令实现流程判断:
示例:
pipeline { agent any environment { //代码仓库变量 def BRANCH_NAME = 'master' } stages { stage('if指令测试') { steps { script { if (env.BRANCH_NAME == 'master') { echo '我是master' }else if (env.BRANCH_NAME == 'develop'){ echo '我是develop' }else { echo '我是默认的' } } } } } }
标签:agent,echo,详解,jenkins,post,pipline,stage From: https://www.cnblogs.com/gengxiaonuo/p/16923611.html