我正在创建自己的Jenkins共享库,以便在管道之间重用一些代码。我知道如何创建步骤(确实非常容易)但是当我想要访问我的" utils类时,我遇到了问题"在jenkins文件中(或Jenkins在日志中说的WorkflowScript)。 我打电话给" Util class"位于文件夹src / my / domain / ...中的groovy类有很多方法,例如,我想创建一个这样的日志类:
# src/my/domain/group
package my.domain.group
class Console implements Serializable {
def log(msg) {
spit(msg, '\033[34m')
}
def error(msg) {
spit(msg, '\033[31m')
}
def warning(msg){
spit(msg, '\033[33m')
}
def success(msg){
spit(msg, '\033[32m')
}
private def spit(msg, color){
ansiColor('xterm') {
echo color + msg + '\033[0m'
}
}
}
然后我尝试在/vars/library.groovy中的文件中实例化,因此可以使用一些代码从Jenkinsfile访问,例如:
node("mynode"){
console.log("Hello World!")
}
我的想法是避免在所有脚本中实例化控制台并自动生成,我尝试过几样的事情,如
# vars/library.groovy
import my.domain.group.Console
import groovy.transform.Field
@Field String console = new Console()
或
# vars/library.groovy
import my.domain.group.Console
def load(){
this.console = new Console()
// And also
console = new Console()
}
但是当试图从jenkins文件访问时,我总是得到错误: groovy.lang.MissingPropertyException:没有这样的属性:类的控制台:WorkflowScript
我理解这意味着实例不在正确的范围内,因此脚本无法直接看到,但我该怎么做?
谢谢!
答案 0 :(得分:8)
看起来你在Jenkins文件中错误地使用了vars
脚本,但我会尝试解决一些混淆:)
vars
目录中定义的Groovy脚本的文件名为" custom"进入你的Jenkins文件。假设您的脚本名称保持library.groovy
,您的Jenkins文件应该如下所示
node ("mynode") {
library("Hello World!")
}
或者(因为括号是可选的)
node ("mynode") {
library "Hello World!"
}
此外,vars
脚本只应包含一个名为call
的函数和必要的导入。由于您希望将日志消息作为字符串传递,因此call
函数还需要一个参数。因此,library.groovy
中的vars
脚本可能如下所示
# vars/library.groovy
import my.domain.group.Console
def call(msg){
Console console = new Console(steps)
console.log(msg)
}
在call
函数中,您可以使用Jenkins文件中的所有基本Jenkins步骤(sh
,bat
等),以及通过{导入的任何Groovy / Java类{1}}(与您的import
课程一样)。
您可能已经注意到,我还向Console
类的构造函数添加了一个steps
变量(不必手动声明或实例化)。这是必要的,因为您无法直接在Console
目录中定义的任何类中使用任何Jenkins步骤。结果,方法
src
不起作用,因为private def spit(msg, color){
ansiColor('xterm') {
echo color + msg + '\033[0m'
}
}
是詹金斯的一步。要在类中使用echo
,可以将echo
变量传递给构造函数,并将其存储在类中的另一个变量中。然后,您可以调用所有Jenkins步骤,例如steps
steps.echo "Hello World"
这应该让它发挥作用。
您应该考虑重新命名# src/my/domain/group
package my.domain.group
class Console implements Serializable {
def steps
Console(steps) {
this.steps = steps
}
def log(msg) {
spit(msg, '\033[34m')
}
def error(msg) {
spit(msg, '\033[31m')
}
def warning(msg){
spit(msg, '\033[33m')
}
def success(msg){
spit(msg, '\033[32m')
}
private def spit(msg, color){
ansiColor('xterm') {
steps.echo color + msg + '\033[0m'
}
}
}
library.groovy
内的vars
(例如myLog.groovy
)。然后你的Jenkinsfile看起来像这样
node ("mynode") {
myLog "Hello World!"
}
为了使用Console
类的其他方法,您可以在vars
中创建其他脚本。使用它们可能看起来像这样
node ("mynode") {
myLog "Hello World!"
myWarning "Hello World!"
myError "Hello World!"
mySuccess "Hello World!"
}
(我使用my
前缀来避免与现有的Jenkins步骤发生名称冲突。例如,error
步骤已经存在,并且在Jenkins文件中调用它将取消您的构建)
有关共享库的更多信息,请查看https://jenkins.io/doc/book/pipeline/shared-libraries/
上的Jenkins文档您可以在https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/
找到所有基本Jenkins步骤的完整列表让詹金斯和管道工作可能是一个巨大的麻烦,但最终它是值得的。我希望这段文字能有所帮助。祝你好运,编码愉快:)。