如何通过groovy脚本控制台批准jenkins文件中的脚本片段?

时间:2017-12-21 12:30:55

标签: jenkins jenkins-pipeline

在我的jenkins管道文件中,我使用JsonSlurperClassic从.json文件中读取构建配置。但是,这会引入需要通过进程内脚本批准页面批准的代码。当我在GUI上执行此操作时,此工作正常。

但是我还有一个脚本可以自动设置我的jenkins机器,它应该创建一个不需要进一步GUI操作的现成工作机器。此脚本已使用jenkins脚本控制台批准从属启动命令。在脚本控制台中执行此操作的groovy代码如下所示。

def language = 'system-command';
def scriptSnippet = 'ssh me@slavemachine java -jar ~/bin/slave.jar';

def scriptApproval = Jenkins.instance.getExtensionList(
    'org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval')[0];
def scriptHash = scriptApproval.hash(scriptSnippet, language);
scriptApproval.approveScript(scriptHash);

这很好用,但现在我想使用相同的代码来批准脚本 来自我的管道的片段。我用

交换了前两行
def language = 'groovy'
def scriptSnippet = 'new groovy.json.JsonSlurperClassic';

其中scriptSnippet取自scriptApproval.xml文件。 执行此操作会向<approvedScriptHashes>文件添加新的scriptApproval.xml条目,但不会删除包含脚本片段的<pendingSignature>条目。这意味着它不起作用。

我的猜测是,该语言是错误的,但我尝试的其他值groovy-shsystem-commands也不起作用。你有什么想法它不起作用吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:14)

您可以使用ScriptApproval#approveSignature方法。这是一个适用于我的Jenkins 2.85

的示例
def signature = 'new groovy.json.JsonSlurperClassic'
org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.get().approveSignature(signature)

答案 1 :(得分:2)

import org.jenkinsci.plugins.scriptsecurity.scripts.*
toApprove = ScriptApproval.get().getPendingScripts().collect()
toApprove.each {pending -> ScriptApproval.get().approveScript(pending.getHash())}