我需要一些有关以下场景的帮助。我正在通过 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 参数,并且代理选择应该被忽略。那个阶段的一切都应该被忽略。
在
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)
}
}
}