Jenkins管道:从文件加载属性
以下管道代码运行良好:Jenkins管道:从文件加载属性,jenkins,jenkins-pipeline,jenkins-shared-libraries,Jenkins,Jenkins Pipeline,Jenkins Shared Libraries,以下管道代码运行良好: pipeline { agent { label "test_agent" } stages { stage("test") { steps { script { sh "echo 'number=${BUILD_NUMBER}' >log" if (fileExists
pipeline {
agent {
label "test_agent"
}
stages {
stage("test") {
steps {
script {
sh "echo 'number=${BUILD_NUMBER}' >log"
if (fileExists('log')) {
load 'log'
retVal = "${number}"
}
echo "${retVal}"
}
}
}
}
}
但是,当我尝试将读取文件的逻辑放入一个lib(名为getNumber.groovy
)并在管道中调用它时,如下所示:
getNumber.groovy
def call() {
def retVal
if (fileExists('log')) {
load 'log'
retVal = "${number}"
}
return retVal
}
管道(test.groovy)就是这样调用这个库的:
@Library('lib') _
pipeline {
agent {
label "test_agent"
}
stages {
stage("test") {
steps {
script {
sh "echo 'number=${BUILD_NUMBER}' >log"
def retVal = getNumber()
echo "${retVal}"
}
}
}
}
}
它总是失败,并出现以下错误:
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: number for class: getNumber
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:34)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
有什么建议吗?如果我想将逻辑封装在lib中,如何修复它
[编辑]
如果我改变这一部分
load 'log'
retVal = "${number}"
为此:
def matcher = readFile('log') =~ '^number=(.+)'
retVal=matcher ? matcher[0][1] : null
它起作用了。但是我只是好奇为什么前一个不能工作。不是getNumber。调用{}?@好奇,不需要,调用getNumber可以调用该函数,因为我们可以发现它成功加载了文件。但是,它无法识别属性“number”。您是如何在Jenkins中配置库的?作为全球图书馆?可以尝试直接在
@Library
注释(@Library(@Library”)中指定它(至少用于测试)http://github.com/my/library)
)。实际上。。工作输出说明了什么?它应该从加载库开始…
。如果缺少此代码,则表示您没有正确配置库。@StephenKing我在那里试过代码。共享库设置和启动正确。这个问题是关于load
步骤是如何工作的,以及为什么它在共享库中的工作方式不同。