问题描述
最近,我尝试将共享库添加到我的Jenkins实例中,以便更轻松地维护在每个项目中运行的所有代码。
我有一个名为myorg/jenkins
的仓库。在其中,我有一个Jenkinsfile和一个用于包含库的Groovy文件。Jenkinsfile如下所示:
@Library('utils@develop')_
import com.*
def jenkinsSlave = "slave.myorg.com"
node(jenkinsSlave) {
stage('Test') {
def var = "kek"
myorg.echoTest(var)
}
}
我尝试在这里执行echoTest
方法,并传递一个参数。
共享库的结构如下(Jenkinsfile位于此仓库的根目录):
src
└── com
└── myorg
└── Utils.groovy
Utils.groovy文件内容如下:
#!/usr/bin/groovy
package com.myorg
def echoTest(test) {
println("Test + ${test}")
}
return this
我已经在Jenkins中将这个仓库添加到全局库部分,并指向主分支,这里是develop分支。
不幸的是,当我运行构建时,Jenkins报错如下:
groovy.lang.MissingPropertyException: No such property: myorg for class: groovy.lang.Binding
...
我尝试了各种配置,但到目前为止,我无法使其工作。我尝试了一些关于实现这一点的教程,但我无法通过这个问题。
有没有人注意到这个设置中是否存在任何配置错误?
解决方案
请注意以下操作可能涉及版本差异,请谨慎操作并备份数据。
方案1:修复引用问题
根据您的报错信息,似乎您在Jenkinsfile中的代码中没有正确地实例化Utils
类,因此无法引用echoTest
方法。您可以尝试以下方法来修复这个问题:
1. 将Jenkinsfile中的myorg.echoTest(var)
更改为Utils.echoTest(var)
,以正确引用Utils
类中的方法。
2. 或者,您可以直接使用echoTest(var)
来调用方法,因为您已经在Jenkinsfile中导入了com.*
。
修复后的Jenkinsfile可能如下所示:
@Library('utils@develop')_
import com.*
def jenkinsSlave = "slave.myorg.com"
node(jenkinsSlave) {
stage('Test') {
def var = "kek"
Utils.echoTest(var) // 或者直接使用 echoTest(var)
}
}
方案2:脚本批准
当您看到scriptsecurity.sandbox
错误时,意味着您需要在Jenkins的脚本批准页面允许该脚本。您可以访问Jenkins的脚本批准页面,地址为https://<你的Jenkins地址>/scriptApproval/
。在该页面中,您可以批准您的脚本,从而解除该脚本的沙箱限制。
另外,我建议您不要在管道中直接导入您的自定义包。相反,我建议您在./vars
文件夹下定义一个步骤,在该步骤中导入自定义包。
请注意,共享库被视为可信任的,不会触发沙箱错误。更多详情请参阅官方文档。
请尝试上述两种方案之一,看看是否能够解决您的问题。
希望这些解决方案对您有帮助!如果您需要进一步的帮助,请随时问我。