Jenkins 管道脚本 - 具有自我意识 - 需要 Jenkinsfile 目录

Jenkins 管道脚本 - 具有自我意识 - 需要 Jenkinsfile 目录

我距离用一个文件替换大量自定义的 Jenkinsfile 仅一步之遥。我只需要获取包含正在执行的 Jenkinsfile 的目录。我使用的是声明式管道语法。

我查看了 Groovy 代码中的几种想法,但找不到如何实现它。

对于那些需要查看特定内容的人来说,Jenkinsfile 在顶部如下所示:

#!/usr/bin/env groovy
pipeline {
  agent any
  environment {
    tf='/var/lib/jenkins/tools/terraform0108/terraform'
    dir='clients/xyz/us-east-1/dev'
}

那个变量目录被分配给该 Jenkinsfile 的位置。稍后在 groovy 代码中访问 dir。我希望能够省略该分配,而只需从执行脚本的上下文中获取该目录。

我尝试了几种不同的方法,例如包含

script {
    println __FILE__
}

script { 
    scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent
    println scriptDir
}

两者都没有运行(给出了不存在的变量文件情况和第二种情况中的权限违规)。我尝试了“${文件}” 和其他变体。

我需要在步骤--sh 块中使用该目录,所以我相信它需要位于环境项中。

现在,Jenkins 作业配置提供了 Jenkins 文件的路径,但我不想重复该操作以在该级别创建另一个环境变量。

已咨询过:

非常感谢您的帮助。

答案1

有很多方法可以做到这一点。以下是我能想到的两种方法:

steps {
  println(WORKSPACE)
}

或者

steps {
  def foo = sh(script: 'pwd', returnStdout: true)
  println(foo)
}

答案2

在我的 MultiBranchPipeline 中,我使用这个共享库代码实现了目标:

#!groovy
import jenkins.model.Jenkins

String call() {
    String thisMultiBranchProjectName = JOB_NAME.split('/')[0]
    def thisMultiBranchProject = Jenkins.getInstance().getItemByFullName(thisMultiBranchProjectName)
    def thisBranchProjectFactory = thisMultiBranchProject.getProjectFactory()
    String thisStringPath = thisBranchProjectFactory.getScriptPath()

    return thisStringPath
}

我承认这看起来更像是一次黑客攻击……

答案3

您询问的是管道,而不是 JobDSL,但希望这有帮助/适用:

在我的 DSL 种子作业中我使用:

// Boilerplate
def dslWorkspacePath = new File(__FILE__).parent
evaluate(new File("${dslWorkspacePath}/scaffolding.groovy"))

以便确定 JobDSL 当前正在处理的种子作业的路径,然后运行一些设置代码。

我的种子作业并不位于被克隆的仓库的根目录中,而是类似/src/main/groovy/jobdsl/

相关内容