如何在Jenkins Pipeline中使用Run参数

3

我正在尝试在Jenkinsfile中使用这个看似简单的模式:

def params = input message: 'Define versions to use:', parameters: [
    [
        $class: 'RunParameterDefinition',
        description: '',
        filter: 'SUCCESSFUL',
        name: 'pr1_run',
        projectName: 'MyProject1'
    ], [
        $class: 'RunParameterDefinition',
        description: '',
        filter: 'SUCCESSFUL',
        name: 'pr2_run',
        projectName: 'MyProject2'
    ]
]

// ...
step([
    $class: 'CopyArtifact',
    fingerprintArtifacts: true,
    projectName: 'MyProject1', // resorted to this
    selector: [
        $class: 'ParameterizedBuildSelector',
        parameterName: '${params.pr1_run}'
    ],
    target: _dir
])

使用以上方法,我得到
java.io.NotSerializableException: org.jenkinsci.plugins.workflow.job.WorkflowRun

我也尝试使用了SpecificBuildSelector
step([
    $class: 'CopyArtifact',
    fingerprintArtifacts: true,
    projectName: 'MyProject1',
    selector: [
        $class: 'SpecificBuildSelector',
        buildNumber: params.pr1_run.number
    ],
    target: 'pr1'
])

我得到了

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use field hudson.model.Run number

我希望将用户选择的多个上游项目构建组合成一个最终构建。

2个回答

1

嗯,脚本安全插件1.18.1仍然出现org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method hudson.model.Run getNumber的错误。

有效的方法是:

def pr1_number = (''+params.pr1_run).split('#')[1]

然后明确设置param = null并在CopyArtifact中使用pr1_number

这表明Pipeline的功能还不够成熟,不能进行任何项目间操作。


0

这两个问题都是同一个问题的症状,即RunParameterValue.getValue()返回一个活动的Run对象,而getNumber()--或者更一般地说,buildEnvironment--在Pipeline中更合适。我提交了JENKINS-34101来跟踪此问题。

如果您成功绕过了NotSerializableException(可能只是幸运),那么RejectedAccessException通过将该方法¹批准为管理员轻松解决。您应该始终使用SpecificBuildSelector与Pipeline(参见JENKINS-33577)。

¹更新Script Security插件,以便询问您是否批准method hudson.model.Run getNumber(),而不是field hudson.model.Run number


不明白如何完成¹。无论如何,我想理想情况下是不需要使用构建选择器的,只需要step([ $class: 'CopyArtifact', fingerprintArtifacts: true, run: pr1_run ])就可以了。因为如果手头有一个完美描述我想要的确切运行的对象,为什么还要两次指定项目名称呢? - Stefan Seidel
(a) 将_Script Security_插件更新到1.18或更高版本。(b) 如果您将项目名称保存在本地变量中,则不需要两次指定它。(c) 如上所述,因为“运行”不可序列化,所以您不能保留对它们的引用。最好处理平面数据,如构建号码。 - Jesse Glick
更新脚本安全插件在这里没有帮助(至少在1.27版本中)。 - Justin Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接