在 jenkinsfile 中移动到自定义类时命令失败

Cra*_*igt 1 groovy jenkins jenkins-pipeline

我正在建立一个新版本。运行一个简单的 shell 命令效果很好,如下所示:

stage("Demo") {    
    sh "echo 'Hi There'"
}
Run Code Online (Sandbox Code Playgroud)

我一直试图将我的 shell 脚本“打包”到它们自己的类中,只是为了使事情变得更整洁。问题是,当尝试从一个类中执行相同的 shell 脚本时,jenkins 构建失败:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未分类的方法 java.lang.Class sh java.lang.String

这是一个简单的例子,在将上述方法移动到它自己的类中后对我来说失败了:

stage('Demo stage') {
    Tools.PrintMe("Hi There")   
}

public class Tools {
    public static void PrintMe(String message) {
        sh "echo " + message
    }
}
Run Code Online (Sandbox Code Playgroud)

脚本管理器中也没有提供选项来将这个被拒绝的方法列入白名单。

有没有办法解决这个问题?还是有我不知道的限制?

ssh*_*pel 7

@Crait 要在您自己的类中调用预定义的步骤,您需要将脚本对象路径到您的类。

所以,试试这个:

stage('Demo stage') {
    Tools.PrintMe(this, "Hi There")   
}

public class Tools {
    public static void PrintMe(def script, String message) {
        script.sh "echo " + message
    }
}
Run Code Online (Sandbox Code Playgroud)


Cra*_*igt 5

正如@sshepel 上面指出的那样,在普通脚本中执行的代码与类中的代码不在同一个上下文中。我通过创建对脚本对象的静态引用,然后在我的类中对其执行,以与上述类似的方式解决了它。

//Set the static reference in the script
Script.environment  = this

public class Script {
    public static environment
}

public class Tools {
    public static void PrintMe(String message) {
        Script.environment.sh "echo " + message
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做是为了避免通过传递脚本对象来污染方法签名。缺点是我所有的类都依赖于设置“Script.environment = this”。