Jenkins声明式流水线 - 如何获取使用的Jenkinsfile路径?

15
我们有一系列的Jenkinsfile脚本,它们是相同的,除了每个脚本都配置了一个环境项,指向在SCM检出中包含Jenkinsfile的目录。这用于引用同一目录中的文件。 SCM存储库中有所有这些Jenkinsfile脚本位于不同的目录中。如果我只能检索包含Jenkinsfile的目录路径,那么我可以使每种情况下的流水线脚本相同。
我尝试过包含步骤的几件不同事物
script {
    println __FILE__
}

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

这两个都没有运行(在__FILE__的情况下给出不存在的变量,第二个情况则是权限问题)。我尝试了"${__FILE__}"和其他变体。

我需要在步骤-sh块中使用目录,因此我认为它需要在环境项中。

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

已经咨询过:

谢谢您的帮助。


始终将Jenkinsfile保留在您的目录根目录中。然后使用“分支”条件(when { branch 'develop' })按环境获取配置。 - sridesmet
1
那不起作用。一个SCM仓库包含许多独立的流水线。我不会将仓库分裂成100个不同的仓库,只是为了在每种情况下获得相同的Jenkinsfiles。令人惊讶的是,Jenkins Pipeline没有简单地提供访问此信息的方法。 - Kevin Buchs
稀疏检出? - sridesmet
1
@KevinBuchs 我也处于同样的情况。你找到解决办法了吗? - keda
@keda - 不行。我希望能够回到这个问题,因为一定有办法解决,但我必须深入研究Java对象等内容。 - Kevin Buchs
3个回答

6

另一个帖子中发现:

def currentScriptPath = new File(currentBuild.rawBuild.parent.definition.scriptPath).parent

但是需要批准很多方法。

这是唯一一个在最新的Jenkins中在共享管道库和Jenkins文件本身中都能正常工作的,谢谢! - daniilyar
不幸的是,此方法仅适用于实际节点上下文 - 您无法在Jenkinsfile顶部使用它来确定例如从哪里获取Kubernetes pod定义 {yamlFile}。 - mikepurvis
这并没有给我一个路径,而只是文件名(当使用减去文件和父级部分时,否则为null)。 - kjyv

1
如果你真的需要这个,你可以获取"${JOB_URL}config.xml"并解析scriptPath。但这不是一个干净的解决方案,请求需要进行身份验证。

这看起来很有前途。我可以看到作业配置通过JOB_URL正确引用。当从经过身份验证的浏览器会话查看时,我可以看到Config中的ScriptPath。我无法从Pipeline脚本中http获取文件,因为我们在Jenkins上进行了身份验证。我不知道如何从Pipeline groovy脚本中获取该文件。我需要确定另一种获取该信息的方法。鉴于作业配置数据结构,我必须相信该信息必须加载到内存中的JVM中,并且通过在Groovy中加载正确的对象,我可以获取此信息。 - Kevin Buchs

-2

最简单的方法是将Jenkinsfile放在您的代码库根目录,并获取Jenkins设置的WORKSPACE环境变量的值。

考虑到Groovy基本上就是Java,您可以这样获取绝对路径:

new File("{env.WORKSPACE}").absolutePath

3
不是这样的。我们有一个SCM仓库,其中包含不同目录中的许多Jenkinsfile。当创建Jenkins流水线时,会指定Jenkinsfile的位置。 - Kevin Buchs
@KevinBuchs Jenkins 是如何获取位置信息的? - rohit thomas
当创建一个管道作业时,使用来自SCM的脚本(Jenkinsfile),您需要在作业配置中指定脚本路径。屏幕截图:https://1drv.ms/u/s!AgKA2HL-SveIgYJEJIfTqbccHIBFFw - Kevin Buchs
强烈建议为自己简化生活,只需指定Jenkinsfile而不是路径,然后您可以通过访问Jenkins为所有作业设置的环境变量{env.WORKSPACE}来获取绝对路径。 - Andrew Gray
我假设大多数人在做这个的时候都有一个包含多个项目的单一代码库。如果可以的话,我建议你重新调整你的设置。我不确定你在这里的意思是什么。有没有一种好的方法在根目录的 Jenkinsfile 中加载子项目的 Jenkinsfile?这样就可以解决我这个使用案例中的问题(找到 Jenkinsfile 的路径)。 - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接