我试图将Jenkins文件中的内容分成一个groovy脚本来制作。但它无法调用这些脚本: 这是代码:
#!/usr/bin/env groovy
node('test-node'){
stage('Checkout') {
echo "${BRANCH_NAME} ${env.BRANCH_NAME}"
scm Checkout
}
stage('Build-all-targets-in-parallel'){
def workspace = pwd()
echo workspace
parallel(
'first-parallel-target' :
{
// Load the file 'file1.groovy' from the current directory, into a variable called "externalMethod".
//callScriptOne()
def externalMethod = load("file1.groovy")
// Call the method we defined in file1.
externalMethod.firstTest()
},
'second-parallel-target' :
{
//callScriptTwo()
def externalMethod = load("file2.groovy")
// Call the method we defined in file1.
externalMethod.testTwo()
}
)
}
stage('Cleanup workspace'){
deleteDir()
}
}
file.groovy
#!groovy
def firstTest(){
node('test-node'){
stage('build'){
echo "Second stage"
}
stage('Cleanup workspace'){
deleteDir()
}
}
}
看起来Jenkinsfile能够调用file1.groovy但总是给我一个错误:
java.lang.NullPointerException: Cannot invoke method firstTest() on null object
答案 0 :(得分:6)
看起来您在正在加载的脚本中错过了返回:
return this
因此,您调用的已加载文件将具有如下结构:
def exampleMethod() {
//do something
}
def otherExampleMethod() {
//do something else
}
return this
这样你就不应该得到空对象
答案 1 :(得分:4)
如果您想从外部文件中获取Jenkinsfile
中的方法,则需要执行以下操作
在file1.groovy
中,返回对方法的引用
def firstTest() {
// stuff here
}
def testTwo() {
//more stuff here
}
...
return [
firstTest: this.&firstTest,
testTwo: this.&testTwo
]
修改强>
evaluate
似乎不是必需的
def externalMethod = evaluate readFile("file1.groovy")
或
def externalMethod = evaluate readTrusted("file1.groovy")
正如@Olia所提到的
def externalMethod = load("file1.groovy")
应该有效
以下是readTrusted
的参考资料。请注意,不允许参数替换(轻量级结账)
从轻量级结帐:
如果选择此选项,请尝试直接从SCM获取管道脚本内容,而不执行完整检出。这种模式的优点是效率高;但是,您不会根据SCM获得任何更改日志或轮询。 (如果在构建期间使用checkout scm,则会填充更改日志并初始化轮询。)此模式下,构建参数也不会替换为SCM配置。只有选定的SCM插件才支持此模式。
至少那对我有用