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

ric*_*cky 12 jenkins jenkins-job-dsl

我试图在jenkins中执行一个种子作业(使用groovy脚本的github url)并得到以下错误.

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

小智 19

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

在此输入图像描述

  • 但是,如何以编程方式执行此操作(批准脚本)? (13认同)
  • 我想我们都知道这一点......问题是如何避免不得不批准所有该死的时间 (8认同)

eds*_*dst 11

作业DSL版本1.60引入了脚本安全性,以恢复旧行为,取消选中"配置全局安全性"页面的"CSRF保护"部分中的" 为作业DSL脚本启用脚本安全性 ".只有在您有另一种批准脚本的方式时才能执行此操作,例如,如果您的种子作业构建生活在git中的作业,则通过git pull请求批准.

  • 取消选中该选项对我没有任何影响(Jenkins 2.107.2)。 (2认同)
  • 取消选中该选项似乎并不会删除已被阻止/待批准的脚本列表,因此您必须批准已经存在的脚本。它确实避免了必须批准新的job-dsl更改。 (2认同)
  • 取消选中该框对我来说也不起作用(Jenkins 2.198) (2认同)

Jas*_*nga 10

这是我们用来预填充脚本批准的 groovy 脚本:


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();
}
Run Code Online (Sandbox Code Playgroud)

  • 超级有用,谢谢!你用“printArgumentTypes”做什么?或者你只是忘记了? (3认同)

Ste*_*ing 8

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

另请阅读有关迁移到1.60的提示.


al.*_*al. 7

如果您想以编程方式禁用它,请将以下脚本放入$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()
Run Code Online (Sandbox Code Playgroud)

  • 也许您不希望禁用整个设置,而是希望以编程方式预先批准单个脚本? (9认同)
  • 这对我不起作用。我删除了该文件并重新启动了 Jenkins,但它仍然要求我从 UI 批准该脚本。 (3认同)

jef*_*ble 6

如果您使用的是 Jenkins Groovy DSL,这里有一个片段,您可以使用它来批准每个待处理的脚本:

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

ScriptApproval scriptApproval = ScriptApproval.get()
scriptApproval.pendingScripts.each {
    scriptApproval.approveScript(it.hash)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我尝试使用此代码片段,但遇到了一些并发异常。我修改了它以摆脱“each”迭代,我怀疑它与该问题有关,然后它就这样工作了: ``` import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval ScriptApproval scriptApproval = ScriptApproval.get () while (scriptApproval.pendingScripts) { scriptApproval.approveScript(scriptApproval.pendingScripts[0].hash) } ``` (2认同)
  • 像@mkorvas一样,我也遇到了**java.util.ConcurrentModificationException**。但是,我想检查脚本内容中的特定值_某些文本_,然后才批准它。所以我分两圈做了。第一个将脚本哈希添加到数组中,第二个 for 循环进行批准。`ScriptApproval scriptApproval = ScriptApproval.get() def hashesToApprove = [] scriptApproval.pendingScripts.each { if (it.script.contains("Some text")) { hashesToApprove.add(it.hash) } } for (String hash : hashesToApprove) { scriptApproval.approveScript(hash) }` (2认同)