Jenkins高级篇之Pipeline语法篇-9-多个stage的关系:顺序和并行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/83627600

在Declarative Pipeline模式的代码中,可能会在一个stages{…}中声明一窜嵌套的stages{…}, 并以顺序执行。需要指出的是,一个stage{…}必须有且只有一个steps{…}, 或者parallel{…} 或者stages{…}

看看下面这个顺序嵌套例子代码

pipeline {
    agent none
    stages {
        stage('Non-Sequential Stage') {
            agent {
                label 'for-non-sequential'
            }
            steps {
                echo "On Non-Sequential Stage"
            }
        }
        stage('Sequential') {
            agent {
                label 'for-sequential'
            }
            environment {
                FOR_SEQUENTIAL = "some-value"
            }
            stages {
               stage('In Sequential 1') {
                   steps {
                       echo "In Sequential 1"
                   }
               }
               stage('In Sequential 2') {
                   steps {
                       echo "In Sequential 2"
                   }
               }
            }
        }
    }
}

这个例子展示了嵌套,其实更好的顺序执行stage的例子就是我们前面写过的 Build Test Deploy这三个stage.

认真看,可以看到这些特点。

  1. 所有的stage,都会内嵌在最外层的stages{…}
  2. 一个stage{…}下可以内嵌有且只有一个stages{…}
  3. 多层嵌套只支持在最后一个stage{…}里面
  4. 嵌套越多越复杂,最简单就是观察每一个stage的大括号的范围

原则上,我们尽量少写嵌套的stage{…},写了嵌套就意味很难维护。但是有时候,由于业务逻辑需要,和stage{…}组织结构好看,我们会写嵌套,嵌套里面可能存在顺序和平行的stage{…} 前面我们演示的demo都是顺序,也就是一个接着一个执行,下面我们来看看并行的stage{…}

并行stage{…}需要用到指令paraller, 有一个paraller{…} 里面包含多个stage{…},最后一个stage{…}内部支持嵌套多个stages{…}。在paraller{…}如果要设置只要里面有一个stage{…}运行失败就强制停止,可以使用表达式failFast true 来条件控制。

并行stage{…}举例:

pipeline {
    agent any
   pipeline {
    agent any	
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            failFast true
            parallel {
                stage('并行一') {
                    steps {
                        echo "并行一"
                    }
                }
                stage('并行二') {
                    steps {
                        echo "并行二"
                    }
                }
                stage('并行三') {
                    stages {
                        stage('Nested 1') {
                            steps {
                                echo "In stage Nested 1 within Branch C"
                            }
                        }
                        stage('Nested 2') {
                            steps {
                                echo "In stage Nested 2 within Branch C"
                            }
                        }
                    }
                }
            }
        }
    }
}

关于这个并行,我创建了一个jenkins job,跑一下就可以帮助你了解。

http://65.49.216.200:8080/job/paraller_demo/

运行完之后的stage 视图是这样的                               

并行1 并行2  并行3 三个stage之间的关系是并行的,上面截图显示都执行成功。这里我们测试一下如果并行二发生报错,会发生生成。在并行二里面的echo 改成echo1,再次运行。

由于我们添加了代码failFast true,但是并行二这个stage发生了报错。本来并行1 并行2 并行3下面两个嵌套的stage都在同一时间并发执行,但是这个job最终的结果是aborted, 从控制台日志或者UI显示灰色能看出来确实是中止了。

总结一下,paraller{…}这个要会使用,使用这个表示并行执行里面的多个stage。这里举例一下这个使用场景,例如我有一个模块的代码分别要在windows 和mac 和linux上三种环境下去测试。那么我可以提前准备好三个环境的agent node机器,然后一套环境写一个stage,把这三个stage都放在paraller{…}里面,让三个并行测试。paraller{…}上面一层这个stage名称就可以叫xxx模块兼容性测试。因为这三个环境都同等重要,你就可以设置failFast true,只要有一个不通过,就中止运行pipeline下面的代码。关于嵌套,非不得已,不要去使用,确实让其他人不好读代码和不好维护。

流程控制

由于pipeline是基于groovy语言开发的,所以支持在pipeline{...}代码块写流程控制语句代码和循环代码。原则上,大部分java和groovy的语法都可以在pipeline上得到很好的处理,但是还是有一些是不好兼容的,所以,Jenkins特意为了更好使用pipeline,开发了一些工具类,方便我们更好地在step中处理各种需求。接下来,我要带大家一起学习https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/

这个页面的一些常用的工具类的使用,算是一个实战练习过程吧。pipeline语法就学习完了,对了还有一种script pipeline我不打算介绍,从头到尾我们都在学习更容易维护和直观的Declarative Pipeline模式。下面写一个if控制语句来展开接下来我们要实战的练习。

项目job: http://65.49.216.200:8080/job/flow_control_demo/

jenkins pipeline代码

pipeline {
    agent any	
    stages {
        stage('flow control') {
            steps {
                script {
                    if ( 10 == 10) {
                        println "pass"
                    }else {
                        println "failed"
                    }
                }
            }
        }
    }
}

接下来,我会尽量把代码全部放github,真正模拟开发过程来介绍各种工具类的实战练习。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/83627600