下面的场景我需要一些帮助。我要通过主代理开通詹金斯的渠道。我的管道是分阶段构建的。前两个阶段分配给主代理(更确切地说,我没有声明另一个代理)。第三阶段,在我的例子中称为Polyspace,包含节点{}结构。这样做的目的是使用另一个代理来执行此阶段。
面临的问题如下:
当我禁用'Polyspace'阶段的参数(参数设置为'false')时,Polyspace代理被选择用于签出(我使用git作为SCM)。我想,如果可能的话,不选择代理,当表达式在那个阶段被设置为false。这背后的原因是,由于只有一个节点代理可以执行"polyspace"。在一个大的持续集成系统(所有的管道)中的步骤。所以,如果这个代理被选中,即使在"polyspace"阶段被禁用,管道将需要等待,直到代理可用。(我只有一个执行人)。
信息:XXX_1→詹金斯是《Init》阶段的主要经纪人。'Compile',默认分配给'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参数,代理选择应该被忽略。那个阶段的一切都应该被忽略。
在when
条件块中使用beforeAgent
指令,在agent
块之前。在选择代理之前移动要评估的when
块。
默认情况下,如果定义了某个阶段的when条件,则将在进入该阶段的代理后评估该阶段的when条件。但是,这可以通过在when块中指定beforeAgent选项来更改。如果beforeAgent设置为true,则首先求值when条件,并且只有当when条件求值为true时才会进入代理。Jenkins用户手册-管道语法-在进入agent阶段前计算时间
指令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)
}
}
}