尽管跟随this answer和其他人,我无法在我的Jenkins文件中成功使用本地groovy文件(两者都在同一个存储库中)。
def deployer = null
...
...
...
pipeline {
agent {
label 'cf_slave'
}
options {
skipDefaultCheckout()
disableConcurrentBuilds()
}
stages {
stage ("Checkout SCM") {
steps {
checkout scm
}
}
...
...
...
stage ("Publish CF app") {
steps {
script {
STAGE_NAME = "Publish CF app"
deployer = fileLoader.load ('deployer')
withCredentials(...) {
if (BRANCH_NAME == "develop") {
...
...
...
} else {
deployer.generateManifest()
}
}
}
}
}
...
...
}
deployer.groovy :
#!/usr/bin/env groovy
def generateManifest() {
sh "..."
echo "..."
}
在控制台日志(stack)中:
[Pipeline] stage
[Pipeline] { (Publish CF app)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
before loading groovy file
[Pipeline] echo
Loading from deployer.groovy
[Pipeline] load
[Pipeline] // load
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
更新
似乎问题不是加载文件而是加载文件的内容,我执行以下操作显然效果不佳:
sh "node $(pwd)/config/mustacher manifest.template.yml config/environments/common.json config/environments/someFile.json"
echo "..."
当只有echo
时,this is the stack。
所以不是sh "node ..."
也不是echo
。即使将其更改为sh "pwd"
也会失败。会是什么呢?文件中的语法?在管道中调用它的方式?
如果我将在管道中进行相同的节点调用(例如在withCredentials
if
语句中,它可以正常工作。
答案 0 :(得分:2)
在return this
文件的底部添加deployer.groovy
,然后将load
步骤更改为使用相对路径和扩展名为load('deployer.groovy')
等groovy文件。
jenkins.io上记录了return this
:
在工作区中获取文件名并将其作为Groovy源文本运行。 加载的文件可以包含顶级语句,也可以只加载并运行闭包。例如:
def pipeline node('slave') { pipeline = load 'pipeline.groovy' pipeline.functionA() } pipeline.functionB()
结尾之前定义functionA和functionB函数(以及其他函数)的位置
pipeline.groovy
在以return this