Jenkins 管道中作业 DSL 中的工作区路径

Gra*_*eme 5 jenkins jenkins-job-dsl devops jenkins-pipeline

我正在创建一个 jenkins 管道作业来使用 jenkins 作业 DSL 插件播种作业。如何获取 DSL 文件中的工作区路径?jenkins 管道代码如下:

#!groovy
  node{
    stage("build jobs"){
      ws{
        git poll: true,  credentialsId: 'xxx', url: 'ssh://git@aaaaa.cc.xxx.com:/xxx/xxx.git'
        checkout scm
        jobDsl(removedJobAction: 'DISABLE', removedViewAction: 'DELETE', targets: 'jobs/*.groovy', unstableOnDeprecation: true)
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

失败的 DSL 代码是:

hudson.FilePath workspace = hudson.model.Executor.currentExecutor().getCurrentWorkspace()
Run Code Online (Sandbox Code Playgroud)

随着错误:

Processing DSL script pipeline.groovy
java.lang.NullPointerException: Cannot invoke method getCurrentWorkspace() on null object
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at pipeline.run(pipeline.groovy:1)
    at pipeline$run.call(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

在作业 DSL 步骤中无法访问在管道区域中创建的变量

Pet*_*utz 5

我偶然发现了这一点,因为似乎没有什么好方法。这是我如何做到的:

node {
    stage('test') {
        sh 'pwd > workspace.txt'
        jobDsl scriptText: '''
            String workspace = readFileFromWorkspace('workspace.txt').trim()
            def file = new File(workspace, 'test.txt')
            file.append('It worked!')'''
    }
}
Run Code Online (Sandbox Code Playgroud)

所以首先在管道脚本中抓取工作空间,然后将其传递给作业 dsl。如果您的脚本中不仅仅需要工作区变量,我建议您通过属性文件进行传输:

node {
    stage('test') {
        sh 'echo "workspace="$(pwd) > build.properties'
        jobDsl scriptText: '''
            Properties props = new Properties();
            props.load(streamFileFromWorkspace('build.properties'))
            def file = new File(props.getProperty('workspace'), 'test.txt')
            file.append('It worked!')'''
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 4

SEED_JOB这可以通过使用变量来实现:

 String workspacePath = SEED_JOB.lastBuild.checkouts[0].workspace
Run Code Online (Sandbox Code Playgroud)

项目的 wiki中对此进行了描述:

可通过 SEED_JOB 变量访问种子作业。该变量包含对代表种子作业的内部 Jenkins 对象的引用。对象的实际类型取决于运行 DSL 的作业类型。对于自由式项目,该对象是 hudson.model.FreeStyleProject 的实例。有关详细信息,请参阅 Jenkins API 文档。

SEED_JOB 变量仅在脚本中可用,而不在脚本使用的任何类中可用。它仅在 Jenkins 中运行时可用,例如在“Process Job DSL”构建步骤中。

以下示例显示如何对生成的作业应用与种子作业相同的安静期。

作业('示例'){ QuietPeriod(SEED_JOB.quietPeriod)}