声明性Jenkins管道-如何仅在满足条件时设置代理任意?

m3eecexj  于 2022-11-02  发布在  Jenkins
关注(0)|答案(1)|浏览(226)

是否可以仅在满足条件时指定代理'any'?
上下文:我有一个并行的管道,有一些共同的步骤。该管道在Linux和Windows上运行两个不同的代理。有一些参数定义是两个都运行,还是只运行Linux,或者只运行Windows。我希望使用尽可能少的代理。
通过下面的管道,Linux测试在 main 代理上执行。Windows测试在不同的代理上执行。因此,如果只需要运行Linux,我只使用1个代理,这很好。但是如果只需要运行Windows,main 代理将被阻塞,直到Windows代理完成。

pipeline {
    agent any    // main agent
    parameters {
        booleanParam( name: 'RUN_WINDOWS' )
        booleanParam( name: 'RUN_LINUX' )
    }
    stages {
        stage('Common step') {
            ...
        }
        stage("Test") {
            parallel {
                stage('Windows') {
                    agent any
                    when {
                        expression { return params.RUN_WINDOWS }
                    }
                    stages {
                        stage('Test Windows') {
                            ...
                        }
                    }
                }
                stage('Linux') {    // no agent specified, so will use the main agent
                    when {
                        expression { return params.RUN_LINUX }
                    }
                    stages {
                        stage('Test Linux') {
                            ...
                        }
                    }
                }
            }
            post {
                ...
            }
        }
    }
}

在Windows阶段,我需要这样的代码,它只根据条件指定代理:

if (params.RUN_WINDOWS && params.LINUX) { agent any }

编辑:我正在寻找一个不使用标签的解决方案。

qoefvg9y

qoefvg9y1#

作为一种解决方法,您可以有条件地设置代理标签,而不是设置any。如下所示。

def labels = "Windows"

if (params.RUN_WINDOWS && params.LINUX) { 
  labels = "windows || linux"
}

pipeline {
    agent any    // main agent
    parameters {
        booleanParam( name: 'RUN_WINDOWS' )
        booleanParam( name: 'RUN_LINUX' )
    }
    stages {
        stage('Common step') {
            ...
        }
        stage("Test") {
            parallel {
                stage('Windows') {
                agent {
                   label "${labelSelected}"
                   }
                    when {
                        expression { return params.RUN_WINDOWS }
                    }
                    stages {
                        stage('Test Windows') {
                            ...
                        }
                    }
                }
                stage('Linux') {    // no agent specified, so will use the main agent
                    when {
                        expression { return params.RUN_LINUX }
                    }
                    stages {
                        stage('Test Linux') {
                            ...
                        }
                    }
                }
            }
            post {
                ...
            }
        }
    }
}

相关问题