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

Kev*_*chs 6 jenkins

我距离用一个 Jenkins 文件替换大量定制的 Jenkins 文件仅一步之遥。我需要获取的是包含正在执行的 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'
}
Run Code Online (Sandbox Code Playgroud)

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

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

script {
    println __FILE__
}
Run Code Online (Sandbox Code Playgroud)

script { 
    scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent
    println scriptDir
}
Run Code Online (Sandbox Code Playgroud)

两者都没有运行(在FILE情况下给出了不存在的变量,在第二种情况下给出了权限冲突)。我尝试了“${ FILE }”和其他变体。

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

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

已经咨询过:

感谢帮助。

jay*_*ren 2

有很多方法可以做到这一点。我可以立即想到以下两种方法:

steps {
  println(WORKSPACE)
}
Run Code Online (Sandbox Code Playgroud)

或者

steps {
  def foo = sh(script: 'pwd', returnStdout: true)
  println(foo)
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,我打赌您假设我的 Jenkinsfile 将位于工作区的顶部。它位于子目录中。使用 WORKSPACE 或 pwd 仅给出作业的工作空间目录,而不是它正在执行的 Jenkinsfile 的位置。 (4认同)