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

时间:2017-01-12 10:08:00

标签: jenkins jenkins-pipeline devops jenkins-job-dsl

我正在创建一个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)
      }
    }
  }

失败的DSL代码是:

hudson.FilePath workspace = hudson.model.Executor.currentExecutor().getCurrentWorkspace()

错误:

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)

在作业DSL步骤

中无法访问管道区域中创建的变量

4 个答案:

答案 0 :(得分:3)

我偶然发现了这一点,因为似乎没有好办法。我是这样做的:

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!')'''
    }
}

首先在管道脚本中抓取工作区,然后将其传递给作业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!')'''
    }
}

答案 1 :(得分:2)

您可以使用Job DSL脚本中的__FILE__变量来获取当前脚本的路径。也许您可以使用它来派生工作区目录。有关详细信息,请参阅Script Location

def scriptDir = new File(__FILE__).parent.absolutePath

答案 2 :(得分:2)

这可以通过使用SEED_JOB变量:

来实现
 String workspacePath = SEED_JOB.lastBuild.checkouts[0].workspace

project's wiki

中对此进行了描述
  

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

     

SEED_JOB变量仅在脚本中可用,而不在任何类中   由脚本使用。它只在Jenkins运行时才可用,   例如在"处理作业DSL"建立步骤。

     

以下示例显示如何为a应用相同的静默期   为种子工作创造了工作。

     

工作('示例'){       quietPeriod(SEED_JOB.quietPeriod)}

答案 3 :(得分:1)

您可以将工作区参数传递给作业 dsl。例如:

流水线代码如下:

node {
    step([
        $class: 'ExecuteDslScripts',
        scriptText: 'job("example-2")'
    ])
    step([
        $class: 'ExecuteDslScripts',
        targets: ['jobs/projectA/*.groovy', 'jobs/common.groovy'].join('\n'),
        removedJobAction: 'DELETE',
        removedViewAction: 'DELETE',
        lookupStrategy: 'SEED_JOB',
        additionalClasspath: ['libA.jar', 'libB.jar'].join('\n'),
        additionalParameters: [
            message: 'Hello from pipeline',
            credentials: 'SECRET'
            WORKSPACE: env.WORKSPACE
        ]
    ])
}

https://github.com/jenkinsci/job-dsl-plugin/wiki/User-Power-Moves#use-job-dsl-in-pipeline-scripts