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

时间:2016-10-02 12:54:23

标签: jenkins groovy jenkins-pipeline

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

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

我一直在尝试将我的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
    }
}

脚本管理器中也没有为白名单提供此拒绝方法的选项。

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

2 个答案:

答案 0 :(得分:4)

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

所以,试试这个:

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

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

答案 1 :(得分:4)

正如@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
    }
}

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