Jenkins声明式管道:矩阵构建轴的顺序执行

时间:2020-03-12 12:51:54

标签: jenkins matrix jenkins-pipeline declarative

我正在尝试建立一个矩阵构建,并在几个问题上运行。 矩阵如下:

stage( 'BuildAll' ) {
    matrix {
        axes {
            axis {
                name 'PLATFORM'
                values 'win32vc9', 'win32vc19' 
            }                   
            axis {
                name 'VARIANT'
                values 'debug', 'release'                   
            }
            axis {
                name 'MODULES'
                values 'repo1/module1', 'repo1/module2', 'repo2/module1', 'repo2/module2'
            }
        }

        stages {                                                
            stage( 'Checkout' ) {
            }
            stage( 'Build' ) {
            }
            stage( 'Test' ) {
            }
       }

我遇到的问题:

  • jenkins正在执行自己工作区中矩阵的每个单元,但是我的模块彼此依赖。这就是为什么我要签出它们并在同一工作区中构建它们的原因。顺便说一句:我的构建系统可以在同一工作区中使用所有变体(调试/发行版x vc9 / vc19)。

  • jenkins正在并行执行所有单元。我需要的是MODULES轴的执行序列化。

有什么办法可以解决这个问题吗?

例如有没有办法描述像几个模块上的循环这样的东西,它们在一行中而不是并行地产生一系列的阶段?在这个序列中,我只能在2个轴上实现矩阵。

我知道扩展的工作区插件,但是没有找到有关如何在声明式管道中使用此文档的任何文档。

非常感谢! 问候, 克里斯多夫(Christoph)

3 个答案:

答案 0 :(得分:0)

声明性管道matrix指令当前不支持顺序执行。
在当前的matrix语法中,您可以做的最好的事情是:

 stage( 'BuildAll' ) {
    matrix {
        axes {
            axis {
                name 'PLATFORM'
                values 'win32vc9', 'win32vc19' 
            }                   
            axis {
                name 'VARIANT'
                values 'debug', 'release'                   
            }
        }
        stages {                
            stage('repo1/module1') {
                stages {
                    stage( 'Checkout' ) {
                    }
                    stage( 'Build' ) {
                    }
                    stage( 'Test' ) {
                    }
                }
            }
            stage('repo1/module2') {
                stages {
                    stage( 'Checkout' ) {
                    }
                    stage( 'Build' ) {
                    }
                    stage( 'Test' ) {
                    }
                }
            }
            stage('repo2/module1') {
                stages {
                    stage( 'Checkout' ) {
                    }
                    stage( 'Build' ) {
                    }
                    stage( 'Test' ) {
                    }
                }
            }
            stage('repo2/module2') {
                stages {
                    stage( 'Checkout' ) {
                    }
                    stage( 'Build' ) {
                    }
                    stage( 'Test' ) {
                    }
                }
            }
        }
    }
}

其他人也要求类似。我根据这个问题提出了JENKINS-62085

答案 1 :(得分:0)

我使用for循环而不是matrixaxis语法。我的解决方法不像使用matrix语法那样漂亮,但是可以完成它应该做的事情。

String[] platformList = ['win32vc9', 'win32vc19']
String[] variantList = ['debug', 'release']

pipeline{
    agent any
    stages {
        stage('Deploy'){
            steps{
                script{
                    for(platform in platformList){
                        for(variant in variantList){
                            stage("Checkout"){
                                powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Checkout" """
                            }
                            stage("Build"){
                                powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Build" """
                            }
                            stage("Test"){
                                powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Test" """
                            }
                        }
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

您或许可以通过使用 locks 来做您想做的事。

就我而言,我只是希望矩阵按顺序构建而不是并行构建,所以我只是将所有内容都包裹在一个阶段并锁定它。类似的东西:

stage( 'BuildAll' ) {
    matrix {
        axes {
            ...
        }
        stages {                                                
            stage( 'Sequential Matrix' ) {
                options {
                    lock( 'synchronous-matrix' )
                }
                stages {
                    ...
                }
            }
        }
    }
}

一次只能构建一个矩阵配置,因为在当前配置完成之前,其他矩阵配置无法获取锁。

不过,在您的情况下,您希望模块一个接一个地按顺序构建。 锁定资源的字符串可以是动态的,因此我认为您可以使用由其他 2 个轴构造的名称来防止同时构建多个模块:

stage( 'BuildAll' ) {
    matrix {
        axes {
            axis {
                name 'PLATFORM'
                values 'win32vc9', 'win32vc19' 
            }                   
            axis {
                name 'VARIANT'
                values 'debug', 'release'                   
            }
            axis {
                name 'MODULES'
                values 'repo1/module1', 'repo1/module2', 'repo2/module1', 'repo2/module2'
            }
        }

        stages {                                                
            stage( 'Force Sequential' ) {
                options {
                    lock( "synchronous-${PLATFORM}-${VARIANT}" )
                }
                stages {
                    stage( 'Checkout' ) {

                    }
                    stage( 'Build' ) {

                    }
                    stage( 'Test' ) {

                    }
                }
            }
        }
    }
}

请注意,这只会保证相同平台和变体的模块不会同时构建,并且不会说明任何有关订购的信息。我不知道 Jenkins 选择构建轴的顺序是否已定义,但我发现 matrix-sorter-plugin 可能有助于排序(如果有问题)。