如何确保在运行Jenkins管道之前更新参数列表?

如何确保在运行Jenkins管道之前更新参数列表?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,Jenkins管道项目配置为从Git回购获取其Jenkins文件: 如果我更改参数列表,例如,从: properties([ parameters([ string(name: 'FOO', description: 'Choose foo') ]) ]) 致: 并运行生成,第一次运行时不显示新添加的条参数: 由于更新后的Jenkins文件期望出现BAR参数,这会导致更改后的第一次生成失败,因为用户没有输入此值 有没有办法防止

Jenkins管道项目配置为从Git回购获取其
Jenkins文件

如果我更改参数列表,例如,从:

properties([
        parameters([
                string(name: 'FOO', description: 'Choose foo')
        ])
])
致:

并运行生成,第一次运行时不显示新添加的
参数:

由于更新后的Jenkins文件期望出现
BAR
参数,这会导致更改后的第一次生成失败,因为用户没有输入此值


有没有办法防止这种情况?在显示参数输入页面之前,要确保
Jenkinsfile
是最新的?

我有一个函数,除非作业具有所有必需的参数,否则跳过生成,例如:

if (job.hasParameters(['FOO', 'BAR'])) {
    // pipeline code
}

简短回答:没有。如果有一些工具可以独立于构建来解析和处理Jenkins文件,那就好了,但是没有

Jenkins在检索、解析并运行Jenkins文件之前不知道新参数,唯一的方法是运行构建


实际上,构建历史将始终“落后于”Jenkins文件;当您更改Jenkins文件中的某些内容时,下一个构建将使用“old”Jenkins文件运行,但随后将为构建拾取并处理新的Jenkins文件。

解决此问题的唯一方法是手动添加“skip_run”布尔参数,而不是在作业的每个阶段添加when{}子句

    properties([
        parameters([
                BooleanParameter(name: 'skip_run', description: 'Skips all stages. Used to update parameters in case of changes.', default: False)
        ])
    ])

当然,这很容易出错

或者,您可以添加一个阶段作为管道的开始,并故意使构建失败

stage('Update Build Info only') {
        when {
            expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
        }
        steps {
            error("This was done deliberately to update the build info.")
        }
    }
更新: 多亏了,我想出了这个解决方案:

为了防止构建实际显示为红色,可以使用try-catch将其包装起来,然后优雅地退出构建

final updateOnly = 'updateOnly'     
try {
      stage('Update Build Info only') {
            when {
                expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
            }
            steps {
                error(updateOnly)
            }
        }
...
//other stages here
...
    } catch (e) {
      if (e.message == updateOnly) {
        currentBuild.result = 'ABORTED'
        echo('Skipping the Job to update the build info')
        // return here instead of throwing error to keep the build "green"
        return
      }
      // normal error handling
      throw e
    }

几年前,詹金斯报道了一个与此相关的问题


仍然开放,因此还没有优雅的解决方案。

您(您是从'17年起)如何调用
BAR
?我发现了同样的问题,我的解决方案是测试
params.BAR
if(params.BAR==null){def BAR=“baz”}否则{echo“yes,BAR已设置”}
Jenkins bug tracker上对此问题进行了一些讨论:
stage('Update Build Info only') {
        when {
            expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
        }
        steps {
            error("This was done deliberately to update the build info.")
        }
    }
final updateOnly = 'updateOnly'     
try {
      stage('Update Build Info only') {
            when {
                expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
            }
            steps {
                error(updateOnly)
            }
        }
...
//other stages here
...
    } catch (e) {
      if (e.message == updateOnly) {
        currentBuild.result = 'ABORTED'
        echo('Skipping the Job to update the build info')
        // return here instead of throwing error to keep the build "green"
        return
      }
      // normal error handling
      throw e
    }