• Jenkins Pipeline语法


    image-20220419081406065

    目录

    1、初识Pipeline核心语法

    image-20220419081505817

    1.什么是Pipeline

    image-20220419081538466

    image-20220419082541832

    • stage:流水线中的每一个阶段;

    • agent:流水线的运行节点;

    • jenkinsfile :以代码的方式描述流水线;Jenkins在运行Pipeline任务的时候会按照Jenkinsfile中定义的代码顺序执行;

    2.创建Pipeline作业

    作业的项目类型

    1.自由风格(图形化界面)被淘汰!

    image-20220419083804158

    2.Pipeline (代码)

    image-20220419083834187

    注意:

    jenkinsfile解决的难点、通点是:一次改变,随处可用,便于流水线的管理和维护!
    
    自由风格:全部都要在图形化界面上进行配置的。
    Pipeline:以代码方式定义流水线。
    
    使用场景:
    例如目前有250个流水线项目,如果都是自由风格类型,现在有个需求,想对这所有的项目统一配置一个参数,该如何做呢?
    
    1、自由风格类型(1.手动傻瓜式一个个项目做哈哈  2.如果可以,可调用api进行配置)
    2、流水线类型 (直接修改jenkinsfile即可实现,一次改变,随处可用效果!)
    
    学习完pipeline之后,你可以基于公司现有的流水线进行一些改造!
    

    要想使用这个Pipeline作业类型首先要安装Pipeline插件

    image-20220419083511738

    创建Pipeline作业方法

    image-20220419084045358

    day2-pipeline-demo

    image-20220419084124757

    全局的一些选项:

    image-20220419084250252

    构建触发器:

    image-20220419084337699

    流水线:

    第一种方式:Pipeline script

    image-20220419084511956

    第二种方式:Pipeline script from SCM

    3.运行第一条Pipeline

    image-20220419084650372

    亲自测试

    一个pipeline流水线无非就是如下几个动作
    1、创建一个Pipeline流水线项目
    2、编写Jenkinsfile文件
    3、触发构建
    4、调试

    这里选择一个Hello World测试案例,点击保存:

    image-20220419085513126

    构建:

    image-20220419085610383

    验证:

    image-20220419085637414

    image-20220419085654430

    image-20220419085730950

    一个简单的demo测试结束。

    4.调试-Pipeline-回放

    image-20220419085804351

    亲自测试

    image-20220419095722733

    image-20220419095736836

    这里修改下上一次构建过的jenkinsfile代码:

    image-20220419095931339

    image-20220419100012045

    image-20220419100035914

    测试结束。

    注意:如果某次的构建失败了的话,那么本次回放是不可用的,即上次的代码会丢失!(注意:推荐在本地编辑器编辑代码,然后复制到回放中就好)

    image-20220420075928437

    image-20220420080126050

    5.什么是Jenkinsfile

    image-20220419100603530

    image-20220419100702910

    1、Jenkinsfile-顶级块-pipeline{}

    image-20220419130008052

    2、Jenkinsfile-二级块-agent{}

    image-20220419130127033

    3、Jenkinsfile-二级块-options{}

    image-20220419130411596

    也就是如下的配置:

    image-20220419130722393

    4、Jenkinsfile-二级块-stages{}

    image-20220419130755277

    ⚠️ 注意

    • Jenkinsfile支持声明式命令式2种方式来写代码,一般推荐使用声明式。
    • 如果把命令式代码写在了steps里面,有的命令会报错的,因此一般要写在scriptP{}里面;
    • 这样一来的话,Jenkinsfile就由声明式代码,内嵌一部分命令式代码组成,更加增加了其灵活性;

    5、Jenkinsfile-二级块-post{}

    image-20220419164820299

    示例

    • 案例代码如下
    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        println("获取代码")
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    
    
    • 将案例代码拷贝到流水线里,然后保存,立即构建即可:

    image-20220419211753168

    可以运行成功,但是有个问题:

    image-20220419212045374

    image-20220419212113214

    • 我们再来使用Blue Ocean观察下现象:

    image-20220419212824038

    image-20220419212951447

    测试结束。

    2、Pipeline开发工具

    image-20220419165109656

    1.片段生成器

    image-20220419213134398

    亲自测试

    • 这里随便打开一个项目,点击流水线语法,点击片段生成器

    image-20220419213334453

    image-20220419213351458

    image-20220420072906176

    • 这里来测试下,我们先来使用下echo: Print Message测试下

    image-20220419214223919

    将生成的代码拷贝到源代码文件里:

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    echo 'i love you ,xyy'
                    script{
                        println("获取代码")
                        echo 'i love you ,xyy'
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    此时,有个问题:我将这个echo 'i love you ,xyy'语句分别写在steps和script里,那么等会构建下,是否会报错呢?

    image-20220419214417209

    在上次构建地方,点击回放,将新代码拷贝进去,点击运行,观察效果:

    image-20220419214647664

    可以看到,会正常构建的:

    image-20220419214829033

    • 此时,我们再选择sh: Shell Script,生成流水线脚本

    image-20220420071526670

    此时,有个问题:我将这个sh 'ehco "i love you, hurt"''语句分别写在steps和script里,那么等会构建下,是否会报错呢?

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    echo 'i love you ,xyy'
                    sh 'echo "i love you,hurt"'
                    script{
                        println("获取代码")
                        echo 'i love you ,xyy'
                        sh 'echo "i love you,hurt"' 
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    image-20220420071643118

    在上次构建地方,点击回放,将新代码拷贝进去,点击运行,观察效果:

    image-20220420071721930

    image-20220420071754483

    可以看到,shell命令放在stage里也是不会报错的。

    总结

    虽然有的shell命令放在stage里也不会报错的,但是为了代码的规范性及可读性,强烈建议将shell命令都放在script里!(有可能if else放在stage里可能会报错)

    image-20220420072705011

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        println("获取代码")
                        echo 'i love you ,xyy'
                        sh 'echo "i love you,hurt"' 
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    2.声明式语法生成器

    image-20220420072239972

    示例

    可以看到有很多Sample Directive:

    image-20220420073132156

    例如这里可以选择agent: Agent

    image-20220420073201221

    image-20220420073229033

    3.全局变量参考

    image-20220420073334406

    示例

    env是全局变量的:

    image-20220420073825339

    image-20220420073901706

    • 全局变量使用测试

    我们来使用下BUILD_ID这个全局变量下:

    image-20220420074203796

    ⚠️ 注意:这里一定要使用双引号,否则会把其当做字符串打印出的!(linux中单引号与双引号的区别)

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        println("获取代码")
                        echo 'i love you ,xyy'
                        echo "${BUILD_ID}"
                        echo "${env.BUILD_ID}"
                        echo "$BUILD_ID"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    image-20220420074146697

    可以看到会构建成功:

    image-20220420074133662

    创建全局变量并测试

    我们首先将全局变量的定义放在stage里面:

    image-20220420075702149

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    env.myName = "xyy"
                    script{
                        println("获取代码")
                        echo 'i love you ,xyy'
                        echo "${BUILD_ID}"
                        echo "${env.BUILD_ID}"
                        echo "$BUILD_ID"
                        echo "${myName}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    结果构建失败了:

    image-20220420075636291

    此时,我们修改下代码,再把其放在script里面,看能否构建成功:

    image-20220420080240591

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        env.myName = "xyy"
                        echo "${myName}"
                        println("获取代码")
                        echo 'i love you ,xyy'
                        echo "${BUILD_ID}"
                        echo "${env.BUILD_ID}"
                        echo "$BUILD_ID"
                        
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    image-20220420080225322

    可以看到,本次构建成功,原来就是把命令式代码写在stage位置了,导致构建失败!因此也验证了上面的结论脚本式的语法我们都写在script里面

    • 此时,有个问题:

    刚才在检出代码阶段定义的全局变量,是否可以在构建阶段里面使用?这边来测试下

    image-20220420080653894

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        env.myName = "xyy"
                        echo "${myName}"
                        env.branchName = "dev"
                        println("获取代码")
                        echo 'i love you ,xyy'
                        echo "${BUILD_ID}"
                        echo "${env.BUILD_ID}"
                        echo "$BUILD_ID"
                        
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    
    

    image-20220420080729187

    结论:可以看到,在某一个stage里定义的全局变量,在其他stage里也是可以使用的!

    示例:如何使用命令式语法来定义局部变量

    image-20220420095357211

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        //管道运行选项
        options {
            skipStagesAfterUnstable()
        }
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                        envType = "test"
                        echo "envType: ${envType}"
                        env.myName = "xyy"
                        echo "${myName}"
                        env.branchName = "dev"
                        println("获取代码")
                        echo 'i love you ,xyy'
                        echo "${BUILD_ID}"
                        echo "${env.BUILD_ID}"
                        echo "$BUILD_ID"
                        
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "envType: ${envType}"
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    
    

    进行构建:

    image-20220420095451385

    结论:发现在script里定义的局部变量,在其他stage里也是可以使用的。。。并且,也是可以在stage里引用局部变量的,也是不会报错的。

    3、深入Pipeline核心语法

    image-20220420102631248

    1.agent{}流水线运行节点

    image-20220420102722490

    image-20220420142212793

    注意

    none情况:适合于流水线的阶段分布在不同的agent上运行;

    还是指定节点这种方式用的多一些;

    2.stages{}流水线阶段

    image-20220420142304019

    3.post{}

    image-20220420142443462

    注意

    • always:例如每次执行后清理缓存动作;
    • success:执行成功后,也可触发下一动作,例如触发CD;(远程构建)
    • failure/aborted:可能要给开发人员发个邮件。

    4.enironment{}环境变量

    image-20220420142927195

    推荐:声明式语法里使用enironment这个语句块来写。

    示例:全局变量测试

    编写代码:

    image-20220420150316747

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            version = "1.1.1"
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                steps{
                    script{
                         echo "${branchName}"
                         echo "${version}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    立即构建:构建成功。

    image-20220420150217941

    示例:局部变量测试

    编写如下代码:

    image-20220420152144792

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            version = "1.1.1"
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                environment{
                    branchName = "test"
                }
                steps{
                    script{
                         echo "${branchName}"
                         echo "${version}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    运行:

    image-20220420152102228

    注意:这里涉及到一个作用域问题,局部变量优先级高于全局变量。

    5.options{}流水线运行时选项

    image-20220420143010960

    注意:以上不用硬记的,需要用到时可以到声明式语法生成器那里寻找就好

    image-20220420153728205

    image-20220420153838436

    6.parameters{}参数化构建

    image-20220420153919329

    示例:定义字符串参数和选项参数

    声明式语法生成器里选择参数构建-字符串构建:

    image-20220420155052168

    代码如下:

    image-20220420155746621

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                environment{
                    branchName = "test"
                }
                steps{
                    script{
                         echo "${branchName}"
                         echo "${version}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    进行构建:

    image-20220420155612088

    image-20220420155722370

    在配置这里也是可以看到参数化构建的选项的:

    image-20220420155651467

    • 我们再来定义下选项参数:

    image-20220420160031046

    image-20220420160310258

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
            choice choices: ['prod', 'test', 'dev'], name: 'envType'
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                environment{
                    branchName = "test"
                }
                steps{
                    script{
                         echo "${branchName}"
                         echo "${version}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    
    

    构建:

    image-20220420160144571

    image-20220420160501641

    • 参数定义好了,该如何引用呢?

    image-20220420162519820

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
            choice choices: ['prod', 'test', 'dev'], name: 'envType'
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                // environment{
                //     branchName = "test"
                // }
                steps{
                    script{
                         echo "${branchName}"
                         echo "${version}"
                         echo "${VERSION}"
                         echo "${env.VERSION}"
                         echo "${params.VERSION}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    构建:

    image-20220420162547454

    • 我们再来测试下如下现象:

    image-20220420163318179

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        
        environment{
            branchName = "dev"
            // version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
            choice choices: ['prod', 'test', 'dev'], name: 'envType'
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                // environment{
                //     branchName = "test"
                // }
                steps{
                    script{
                         echo "${branchName}"
                        //  echo "${version}"
                         echo "${VERSION}"
                         echo "${env.VERSION}"
                         echo "${params.VERSION}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        // echo "${version}" 
                    }
                }
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    构建:

    image-20220420163237501

    结论:

    如果同时有environmentparameters时,env.VERSIONVERSION默认会使用enironment的值的,因此要想使用parameters,推荐使用params.VERSION来引用。

    这里需要注意下,大小写变量问题。

    7.triggers{}触发器

    image-20220420183705454

    注意

    image-20220420183115814

    image-20220420183244496

    定时构建:例如代码扫描。

    SCM轮询构建:之前自由风格类型用的多,现在pipeline用的不多了,后面会讲一个更高级的工具。(xx webhook)

    8.input{}触发器

    image-20220420183716917

    示例

    生成代码:

    image-20220420185145348

    image-20220420185205555

    编写代码:

    image-20220420200034033

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        // triggers {
        //     cron 'H 11 * * *'
        // } 
        environment{
            branchName = "dev"
            // version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
            choice choices: ['prod', 'test', 'dev'], name: 'envType'
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                // environment{
                //     branchName = "test"
                // }
                steps{
                    script{
                         echo "${branchName}"
                        //  echo "${version}"
                         echo "${VERSION}"
                         echo "${env.VERSION}"
                         echo "${params.VERSION}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        // echo "${version}" 
                    }
                }
            }
            stage("deploy"){
                input {
                    message '选择开发环境'
                    ok '提交'
                    parameters {
                        choice choices: ['dev', 'prod', 'test'], name: 'envName'
                    }
    
                }
                steps{
                    echo "deploy ${envName}"
                }
    
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    构建:

    image-20220420200138690

    image-20220420200238063

    以BlueOcean方式打开构建过程:

    image-20220420200347569

    image-20220420200359220

    注意

    image-20220420200613222

    9.when{}阶段运行控制

    image-20220420200437059

    示例

    编写代码:

    image-20220420202509125

    pipeline{
        //指定运行此流水线的节点
        agent { node { label "build"}}
        // triggers {
        //     cron 'H 11 * * *'
        // } 
        environment{
            branchName = "dev"
            // version = "1.1.1"
        }
        parameters {
            string defaultValue: '1.1.2', description: '版本号', name: 'VERSION', trim: true
            choice choices: ['prod', 'test', 'dev'], name: 'envType'
        }
    
        //流水线的阶段
        stages{
            //阶段1 获取代码
            stage("CheckOut"){
                // environment{
                //     branchName = "test"
                // }
                steps{
                    script{
                         echo "${branchName}"
                        //  echo "${version}"
                         echo "${VERSION}"
                         echo "${env.VERSION}"
                         echo "${params.VERSION}"
                    }
                }
            }
            stage("Build"){
                steps{
                    script{
                        println("运行构建")
                        echo "${branchName}"
                        // echo "${version}" 
                    }
                }
            }
            stage("deploy"){
                when{
                    environment name: "branchName", value: "dev"
                }
                input {
                    message '选择开发环境'
                    ok '提交'
                    parameters {
                        choice choices: ['dev', 'prod', 'test'], name: 'envName'
                    }
    
                }
                steps{
                    echo "deploy ${envName}"
                }
    
            }
        }
        post {
            always{
                script{
                    println("流水线结束后,经常做的事情")
                }
            }
            
            success{
                script{
                    println("流水线成功后,要做的事情")
                }
            
            }
            failure{
                script{
                    println("流水线失败后,要做的事情")
                }
            }
            
            aborted{
                script{
                    println("流水线取消后,要做的事情")
                }
            
            }
        }
    }
    

    这里的自己现象:自己现象为什么和老师的不一样呢。。。

    image-20220420202358992

    image-20220420202435458

    老师现象:

    image-20220420202304793

    10.parallel{}阶段并行

    image-20220420202656159

    示例

    我们先来给master节点打个master标签:

    image-20220420203845288

    编写代码:

    image-20220420204056637

    pipeline {
        agent any
        stages {
            stage('Parallel Stage') {
                failFast true
                parallel {
                    stage('windows') {
                        agent {
                            label "master"
                        }
                        steps {
                            echo "windows"
                        }
                    }
                    stage('linux') {
                        agent {
                            label "build"
                        }
                        steps {
                            echo "linux"
                        }
                    }
                }
            }
        }
    }
    

    构建:

    image-20220420204021169

    image-20220420203954937

    关于我

    我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

    各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

    1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

      image-20211002091450217

    2. 个人微信公众号:云原生架构师实战

      image-20211002141739664

    3. 个人博客地址:www.onlyonexl.cn

      image-20211002092057988

    4. 个人csdn

      https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

      image-20211002092344616

    5. 个人已开源干货

      不服来怼:宇宙中最好用的云笔记 & 其他开源干货:https://www.yuque.com/go/doc/73723298?#

      image-20220423100718009

    最后

    好了,关于Jenkins Pipeline语法就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

    image-20220423100835738

  • 相关阅读:
    大数据知识简单总结
    机器学习pipeline总结
    spark SQL、RDD、Dataframe总结
    hbase介绍
    git命令教程
    hive查询语句入门(hive DDL)
    hive安装部署
    调用高德地图,通过获取的区域名称得到行政区域详情
    搭建SSM框架的配置文件
    jquery实现get的异步请求
  • 原文地址:https://www.cnblogs.com/520ZXL/p/16183230.html
Copyright © 2020-2023  润新知