我有一个有点独特的设置,我需要能够动态加载位于我正在构建的src之外的Jenkinsfile。Jenkinsfiles文件本身通常调用node(),然后调用一些构建步骤。这会导致多个执行器不必要地被占用,因为我需要已经调用node()来使用load步骤来运行Jenkinsfile,或者如果我将Jenkinsfile作为字符串读取并执行它,则需要执行groovy。
我今天在作业UI中的内容:
@Library(value='myGlobalLib@head', changelog=fase) _
node{
load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}
加载的Jenkinsfile通常也会调用node()。例如:
node('agent-type-foo'){
someBuildFlavor{
buildProperty = "some value unique to this build"
someConfig = ["VALUE1", "VALUE2", "VALUE3"]
runTestTarget = true
}
}
这会导致在流水线运行期间消耗2个执行器。理想情况下,我不需要首先调用node()就可以加载Jenkinsfiles文件,但无论何时尝试,我都会收到一条错误消息,指出:
"Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node"
有没有办法在没有hudson.FilePath上下文的情况下加载Jenkinsfile或执行groovy?我好像在文件里找不到任何东西。我准备对Jenkinsfile进行预处理,删除它们对node()的初始调用,并使用Jenkinsfile使用的值调用node(),然后加载文件的其余部分,但是,这有点太脆弱了,我不会满意的。
发布于 2019-01-02 03:10:41
在使用load
步骤时,Jenkins会评估文件。您可以将Jenkinsfile的逻辑封装到一个函数中(在我的示例中名为run()
),这样它将加载但不会自动运行。
def run() {
node('agent-type-foo'){
someBuildFlavor{
buildProperty = "some value unique to this build"
someConfig = ["VALUE1", "VALUE2", "VALUE3"]
runTestTarget = true
}
}
}
// This return statement is important in the end of Jenkinsfile
return this
从您的工作脚本中调用它,如下所示:
def jenkinsfile
node{
jenkinsfile = load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}
jenkinsfile.run()
这样就不会再有嵌套的node
块了,因为第一个块在调用run()
函数之前就被关闭了。
https://stackoverflow.com/questions/53950119
复制相似问题