当前位置: 首页 > 知识库问答 >
问题:

Jenkins管道内作业DSL中的工作空间路径

诸经略
2023-03-14

我正在使用jenkins job DSL插件创建一个jenkins pipeline作业来播种作业。如何获得DSL文件中的工作空间路径?詹金斯管道代码是这样的:

#!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步骤中不可访问

共有3个答案

东郭弘
2023-03-14

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

def scriptDir = new File(__FILE__).parent.absolutePath
谭池暝
2023-03-14

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

 String workspacePath = SEED_JOB.lastBuild.checkouts[0].workspace

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

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

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

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

作业(“示例”){quietPeriod(SEED_job.quietPerio)}

寿子默
2023-03-14

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

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!')'''
    }
}
 类似资料:
  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档

  • 是否有可能通过一个作业DSL创建多分支管道作业,该作业通过“管道脚本”而不是每个Git存储库包含的Jenkinsfile来定义作业? 我们希望避免在100个Git存储库中生成和维护相同的Jenkins文件(除了一些参数)。 目前,我们正在使用管道作业和工厂作业播种的作业DSL,但目前我们在多分支构建(功能分支)方面受到限制。因此,我们希望切换到多分支管道作业,但在播种方面我们受到了限制。 我知道我

  • 我试图从流水线步骤中运行一个job-dsl脚本。一般来说,这应该是可能的,正如这里所描述的,在管道步骤中添加了以下代码片段: null 我如何知道脚本的真实位置,以及如何指定一个jobDsl作为目标,它本身位于不同的repo中?还是我完全走错了方向? 编辑 经过进一步的研究,共享库存储库被签出到“真实”工作区旁边的一个目录中,后缀为@libs,这似乎是事实。所以我认为使用以下方法是个好主意: 与此

  • 我试图使用Jenkins DSL groovy来创建Jenkins工作。我对Git参数使用的方法,很少有参数无法识别,并出现以下错误。 方法:javaposse.jobdsl.dsl.helpers.gitParamContext.SelectedValue()的签名不适用于参数类型:(java.lang.String)值:[NONE] 方法:javaposse.jobdsl.dsl.helper

  • 我有两个管道作业作业作业A和作业B。我需要通过作业A的工作空间url(比如 /var/lib/jenkins/workspace/JobA)被作业B使用。主要的想法是我试图复制由于maven构建而生成的目标文件夹的内容,但我不想使用复制工件插件或存档工件插件来实现同样的目的。 我尝试过使用“此作业已参数化”选项,其中作业A是作业B的上游,但我无法使用该选项。 有人能帮助实现同样的目标吗?

  • 问题内容: 我想在管道作业中使用EnvInject插件。因此,我可以设置复选框“为运行准备一个环境”,但是 没有动作“注入环境变量”,就像在自由式作业中一样。我在“属性内容”块中声明了变量:在此处输入图片说明 如何使用EnvInject在管道作业中注​​入环境变量? 问题答案: 如果在“属性内容”块中声明了以下变量: 然后,您可以将它们放入管道中,以便: