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

Commands fail when moving to them custom class in jenkinsfile

我正在设置一个新版本。 运行 一个简单的 shell 命令就可以完美运行,如下所示:

stage("Demo") {    
    sh "echo 'Hi There'"
}

我一直在尝试 "package" 我的 shell 脚本变成它们自己的 classes 只是为了让事情变得更整洁。问题是,当尝试从 class 中执行完全相同的 shell 脚本时,jenkins 构建失败:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified method java.lang.Class sh java.lang.String

这是一个简单的例子,在将上述方法移到它自己的方法后我失败了 class:

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

public class Tools {
    public static void PrintMe(String message) {
        sh "echo " + message
    }
}

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

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

@Crait 调用您自己的预定义步骤 class 您需要将脚本对象指向您 class.

所以,试试这个:

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

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

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

//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
    }
}

我这样做是为了避免在传递脚本对象时污染方法签名。缺点是我所有的 classes 都依赖于设置 "Script.environment = this"。