即使舞台在表达时被禁用,也会选择代理

问题描述 投票:0回答:1

我需要一些有关以下场景的帮助。我正在通过 main agent 启动 Jenkins 管道。我的管道是分阶段构建的。前两个阶段分配给主要代理(更准确地说,我没有声明另一个代理)。第三阶段,在我的例子中称为 Polyspace,包含 node{} 结构。这样做的目的是使用另一个代理来执行此阶段。

面临的问题如下:

当我禁用“Polyspace”阶段的参数(参数设置为“false”)时,将选择 Polyspace 代理进行结帐(我使用 git 作为 SCM)。我希望,当该阶段的表达式设置为 false 时,是否可以不选择代理。其背后的原因是,只有 1 个节点代理可以在大型持续集成系统(所有管道)中执行“Polyspace”步骤。因此,如果选择此代理,即使禁用“Polyspace”阶段,管道也将需要等待,直到代理可用。 (我只有 1 个执行人)。

信息: XXX_1 -> 'Init' 和 'Compile' 阶段的 Jenkins 主代理默认分配给 'main' 代理。

YYY_1 -> “Polyspace”舞台的“抢手”代理 您可以在参数块中看到参数“POLYSPACE”默认设置为“false”,因此由于“when”条件块,该阶段将被跳过。

我的管道:

@Library('SLXXX') _

log.init("info")

pipeline {
    agent {
        node {
            label 'XXX_1'
        }
    }
    triggers {
        cron('H 1 * * *')
    }
    options {
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '10'))
        timeout(time: 4, unit: 'HOURS')
        timestamps ()
    }
    
    parameters {
        booleanParam(name: 'INIT', defaultValue: true, description: 'Init after yaml script update')
        booleanParam(name: 'COMPILE', defaultValue: true, description: 'Run COMPILE')
        booleanParam(name: 'POLYSPACE', defaultValue: false, description: 'Run polyspace')

        
    }
    
    stages {
        stage('Init') {
            when { expression { params.INIT } }
            steps {
                script {
                    xxx
                }
                script {
                    xxx
                }
            }
        }
    
        stage('Compile') {
            when { expression { params.COMPILE } }
            steps {
                dir('ThirdParty/Jenkins') {
                    xxx
                }
                
                archiveArtifacts artifacts: 'xxx'
                archiveArtifacts artifacts: 'xxx'
                archiveArtifacts artifacts: 'xxx'
            }
        }
        stage('Polyspace') {
            agent {
                node {
                    label 'YYY_1'
                }
            }
            when { expression { params.POLYSPACE } }
                options {
                    timeout(time: 3, unit: 'HOURS') 
                }
            steps {
                script {
                    // run polyspace build from yaml file description
                        mqPipelineConfigPolyspace(config)
                }
            }
        }   

    }
    
        
    post { 
        always { 
            echo 'This will always run for saving artifacts from failed tests'
        }
        
        success {
            echo 'This will run only if successful'
            script
                {
                xxx
                }
        }
        failure {
            echo 'This will run only if failed'
            script
                {
                xxx
                }
        }
    }

}

我想禁用 POLYSPACE 参数,并且代理选择应该被忽略。那个阶段的一切都应该被忽略。

jenkins jenkins-pipeline jenkins-groovy
1个回答
1
投票

beforeAgent
条件块中、
when
块之前使用
agent
指令。在选择代理之前移动要评估的
when
块。

默认情况下,如果定义了阶段的条件,则在输入该阶段的代理后将评估该阶段的条件。但是,可以通过在when块中指定beforeAgent选项来更改这一点。如果beforeAgent设置为true,则将首先评估when条件,并且只有当when条件评估为true时才会进入代理。 Jenkins 用户手册 - 管道语法 - 在进入阶段中代理之前评估时间

放置在

beforeAgent true
块中的指令
when
将在决定与代理执行任何操作之前首先进行评估。因此,如果参数值设置为 false,则阶段将
skip due to conditional
,这将避免选择/等待/旋转声明的代理来运行条件/阶段。

将 jenkinsfile 'Polyspace' 阶段更新为以下内容:

stage('Polyspace') {
    when { 
        expression { params.POLYSPACE.toBoolean() } 
        beforeAgent true
    }
    agent {
        node {
            label 'YYY_1'
        }
    }
    options {
        timeout(time: 3, unit: 'HOURS') 
    }
    steps {
        script {
            // run polyspace build from yaml file description
            mqPipelineConfigPolyspace(config)
        }
    }
}   
© www.soinside.com 2019 - 2024. All rights reserved.