我距离用一个文件替换大量自定义的 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 文件的路径,但我不想重复该操作以在该级别创建另一个环境变量。
已咨询过:
- 获取 Job DSL 正在处理的脚本目录的绝对路径
- 获取 Jenkins Pipeline 插件中工作区目录的绝对路径
- 如何使用 Pipeline 引用 Jenkinsfile 目录?
- 以及更多 Google 点击和其他网站。
非常感谢您的帮助。
答案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/