种子工作要求jenkins的脚本批准

时间:2017-04-29 18:35:07

标签: jenkins jenkins-job-dsl

我试图在jenkins中执行一个种子作业(使用groovy脚本的github url)并且出现了以下错误。

  

第一次构建。跳过更改日志   处理DSL脚本APIServerDeployer.groovy
  错误:尚未批准使用的脚本
  完成:失败

7 个答案:

答案 0 :(得分:15)

为了通过此Jenkins安全功能,您需要批准您的脚本。转到管理Jenkins - >进程内脚本批准。在该屏幕中,您将看到您尝试执行的脚本。应该有一个批准按钮,您需要单击以批准该脚本。

enter image description here

答案 1 :(得分:9)

Job DSL版本1.60引入了脚本安全性,要恢复旧行为,请在"配置全局安全性"的“CSRF保护”部分中取消选中为作业DSL脚本启用脚本安全性。页。只有当你有另一种批准脚本的方式时,才应该这样做,例如,如果种子作业构建了生活在git中的作业,则通过git pull请求批准。

答案 2 :(得分:8)

Job DSL版本1.60引入了Script Security,这要求您将脚本列入白名单。

另请阅读有关migrating to 1.60

的提示

答案 3 :(得分:3)

如果要以编程方式禁用它,请将以下脚本放入$JENKINS_HOME/init.groovy.d/disable-script-security.groovy

import javaposse.jobdsl.plugin.GlobalJobDslSecurityConfiguration
import jenkins.model.GlobalConfiguration

// disable Job DSL script approval
GlobalConfiguration.all().get(GlobalJobDslSecurityConfiguration.class).useScriptSecurity=false
GlobalConfiguration.all().get(GlobalJobDslSecurityConfiguration.class).save()

答案 4 :(得分:1)

这是一个用于常规填充脚本批准的常规脚本:


import java.lang.reflect.*;
import jenkins.model.Jenkins;
import jenkins.model.*;
import org.jenkinsci.plugins.scriptsecurity.scripts.*;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.*;

scriptApproval = ScriptApproval.get()
alreadyApproved = new HashSet<>(Arrays.asList(scriptApproval.getApprovedSignatures()))


// add all manual whitelist methods here.

approveSignature('method groovy.json.JsonBuilder call java.util.List')
approveSignature('method groovy.json.JsonSlurper parseText java.lang.String')
approveSignature('method groovy.json.JsonSlurperClassic parseText')
approveSignature('method groovy.lang.Binding getVariables')
approveSignature('method groovy.lang.Binding getVariable java.lang.String')
approveSignature('method groovy.lang.Binding hasVariable java.lang.String')
approveSignature('method groovy.lang.Closure getMaximumNumberOfParameters')
approveSignature('method groovy.lang.GString plus java.lang.String')
approveSignature('method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object')
approveSignature('method hudson.model.Actionable getAction java.lang.Class')
approveSignature('method hudson.model.Actionable getActions')
approveSignature('method hudson.model.Cause$UpstreamCause getUpstreamProject')
approveSignature('method hudson.model.Cause$UserIdCause getUserId')
approveSignature('method hudson.model.ItemGroup getItem java.lang.String')
approveSignature('method hudson.model.Item getUrl')
approveSignature('method hudson.model.Job getBuildByNumber int')
approveSignature('method hudson.model.Job getLastBuild')
approveSignature('method hudson.model.Job getLastSuccessfulBuild')
approveSignature('method hudson.model.Job isBuilding')
approveSignature('method hudson.model.Run getCauses')
approveSignature('method hudson.model.Run getEnvironment hudson.model.TaskListener')
approveSignature('method hudson.model.Run getParent')
approveSignature('method hudson.model.Run getNumber')
approveSignature('method hudson.model.Run getResult')
approveSignature('method hudson.model.Run getUrl')
approveSignature('method hudson.model.Run getLogFile')
approveSignature('method java.util.Map containsKey java.lang.Object')
approveSignature('method java.util.Map entrySet')
approveSignature('method java.util.Map get java.lang.Object')
approveSignature('method java.util.Map keySet')
approveSignature('method java.util.Map putAll java.util.Map')
approveSignature('method java.util.Map remove java.lang.Object')
approveSignature('method java.util.Map size')
approveSignature('method java.util.Map values')
// ... your list here ...

scriptApproval.save()

void approveSignature(String signature) {
    if (!alreadyApproved.contains(signature)) {
       scriptApproval.approveSignature(signature)
    }
}

// Utility methods
String printArgumentTypes(Object[] args) {
    StringBuilder b = new StringBuilder();
    for (Object arg : args) {
        b.append(' ');
        b.append(EnumeratingWhitelist.getName(arg));
    }
    return b.toString();
}

答案 5 :(得分:0)

如果您使用的是Jenkins Groovy DSL,则可以使用以下代码片段批准待处理的每个脚本:

import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval

ScriptApproval scriptApproval = ScriptApproval.get()
scriptApproval.pendingScripts.each {
    scriptApproval.approveScript(it.hash)
}

请参阅:https://javadoc.jenkins.io/plugin/script-security/org/jenkinsci/plugins/scriptsecurity/scripts/ScriptApproval.html

答案 6 :(得分:0)

尝试在“配置全局安全性”设置下为Job DSL脚本禁用脚本安全性。 Disable script security for Job DSL scripts