我正在创建自己的Jenkins共享库,以便在管道之间重用一些代码。我知道如何创建步骤(确实很容易),但是当我想在jenkinsfile中访问我的“utils类”(或者如Jenkins在日志中所说的工作流脚本)时,我有一个问题。我叫"Util类"位于文件夹src/我的/域/...,有很多方法,例如,我想创建一个日志类,这样:
# 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 so可以通过一些代码从Jenkins文件访问,例如:
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
我知道这意味着实例不在正确的范围内,所以脚本不能直接看到,但是我怎么做呢?
谢谢
看起来您在Jenkins文件中错误地使用了vars
脚本,但我将尝试解决一些困惑:)
>
vars
目录中定义的Groovy脚本在您的Jenkins文件中以文件名作为“自定义”步骤调用。假设您的脚本名保留在库中。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
,等等),以及通过import
导入的任何Groovy/Java类(如控制台
类)。
您可能已经注意到,我还添加了一个步骤
变量(不需要手动声明或实例化)到您的控制台
类的构造函数中。这是必要的,因为您不能直接在src
目录中定义的任何类中使用任何Jenkins步骤。结果,方法
private def spit(msg, color){
ansiColor('xterm') {
echo color + msg + '\033[0m'
}
}
不起作用,因为echo
是詹金斯步骤。为了在类中使用echo
,可以将步骤
变量传递给构造函数,并将其存储在类中的另一个变量中。然后可以调用所有Jenkins步骤,如步骤。回显“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'
}
}
}
这应该会让它起作用。
您应该考虑重命名库。groovy
insidevars
though(例如myLog.groovy
)。那么你的Jenkins文件可能是这样的
node ("mynode") {
myLog "Hello World!"
}
为了使用控制台
类的其他方法,您可以在变量
中创建其他脚本。使用它们可能看起来像这样
node ("mynode") {
myLog "Hello World!"
myWarning "Hello World!"
myError "Hello World!"
mySuccess "Hello World!"
}
(im使用my
前缀以避免与已存在的Jenkins步骤发生名称冲突。例如,错误
步骤已经存在,在Jenkinsfile中调用它将取消您的构建)
有关共享库的更多信息,请查看Jenkins留档https://jenkins.io/doc/book/pipeline/shared-libraries/
您可以在https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/找到所有基本Jenkins步骤的完整列表
让Jenkins和管道工作可能是一个巨大的麻烦,但最终它是值得的。我希望这段文字能对你有所帮助。祝你好运和快乐:)
目前,我正在我的项目中创建一个Jenkins共享库,在实例化一个对象时遇到了一个问题。 我的应用程序的树结构 -day#1 --/詹金斯档案 --/src/File1。groovy --/测试/文件1规范。groovy --/vars/file1。groovy 从我的Jenkins文件中,我可以调用file1。函数,inturn将创建写入文件中的类对象/src/File1。groovy和它工作得很
我有一个Jenkins文件,我正在尝试从共享库实例化groovy类。我得到“无法解决类测试” 我有一个src/com/org/foo。共享库中的groovy文件: 我正试图在我的Jenkins文件中实例化它 如果我将文件作为一个类引用(我没有对其构造函数的访问权限),那么它就会起作用。即: 这很好,让我使用foo函数。但是,我失去了赋予类常量并用参数构造它的能力。 知道如何定义和使用共享库中的类吗
我将我的Jenkins Pipeline存储为Jenkins共享库中的Groovy脚本。我想为不同的工作使用不同的版本。我的共享库脚本称为如下: 我已将sharedLib repo中的不同版本标记为。万一我想用v1。0,我用注释引用了它,如下所示。 在我的工作中,我通过调用groovy脚本访问了共享库,并使用了上面的注释,如图所示: 我运行这项工作时出错了。以下是我看到的错误。 当我使用。我哪里出
我正在寻找一些关于Jenkins共享库类设计的指导。使用全局变量作为共享库可以很好地工作,但每次我在src/中定义一个类并希望导入它时,都会遇到无法解析该类的错误。 这是我的共享库结构: 类测试员。棒极了 下面是我想在管道作业中初始化的类的代码。 你好。棒极了 管道作业 在第2行中,我得到错误:无法解析类de.schlumpf.测试器。全局变量sayHello就像一个魅力...有人知道我在这里做错
问题内容: 我在Jenkins管道的共享库中有一个方法。想法是使用该库并将文件上传到远程主机。该库将导入到单例库中。 实例化的类如下所示: 即使我在日志中看到该行。我看不到命令正在执行。我缺少某种无法调用的功能吗? 编辑 当我直接在库中使用时,它可以工作。 但是,尝试使用时不起作用。 我得到的异常是: 问题答案: 如此处所述,您需要捕获stdout / stderr才能 _看到_任何内容。 至少:
我通过jenkins管道(共享库)运行此代码。 它在本地工作,但在Jenkins管道中,我得到以下错误: 请帮帮我