我有以下用例:
使用编写的管道脚本签出/拉取某个 Git 修订版
(我需要这个,因为我动态检索修订版)
从该修订版本中,加载位于之前签出的文件中的 Jenkins-pipeline-file
该文件将依赖于同一签出版本的文件
(因此,从same工作区)
问题:加载的 Jenkins-pipeline-file 在new工作区。但它是空的。我需要该文件在same old工作区。
我想,也许是因为周围的环境吧node
,因为node
关键字创建工作区,如文档中所述。但是当我尝试加载它时outside the node
,詹金斯以“离开沙箱”为由不允许这样做。
注意:jenkins-pipeline-file 被找到并真正被执行。问题是during执行。
请看示例代码:
内嵌管道脚本
node('master') {
def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'
checkout poll:false,
scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
doGenerateSubmoduleConfigurations:false,
extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
userRemoteConfigs:[[credentialsId:'...', url:'...']]]
load 'further-script-logic.jenkins'
}
文件:进一步脚本逻辑.jenkins
node('master') {
// make use of certain files
// assumption: pwd() is the *same* workspace which were checked-out before
// problem: it's not, it's a new empty workspace
}
一种解决方法是此处描述 https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#triggering-manual-loading.
- 你必须使用
{...}()
末尾的大括号调用者脚本
- 你必须重写称为脚本返回一个闭包(lambda)
{-> /* former code */ }
这样,您就不会将程序流的控制权“放弃”给执行的脚本。相反,您使用它返回的闭包并“自己调用它”。这会阻止 Jenkins 创建更多工作区。
遗憾的是,我不知道此解决方案是否允许在调用者脚本和/或被调用脚本中声明多个节点。
我已将这些更改合并到您的示例代码中。
查找标有以下内容的行"<--- CHANGE"
.
内嵌管道脚本
node('master') {
def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt'
checkout poll:false,
scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]],
doGenerateSubmoduleConfigurations:false,
extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[],
userRemoteConfigs:[[credentialsId:'...', url:'...']]]
load 'further-script-logic.jenkins'
}() // <--- CHANGE 1
文件:进一步脚本逻辑.jenkins
{-> // <--- CHANGE 2
node('master') {
// .....
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)