私はジェンキンスでシードジョブ(groovyスクリプトでgithubのURLを持っている)を実行しようとしていて、次のエラーが発生しました。
初回ビルド。変更ログをスキップします。
DSLスクリプトAPIServerDeployer.groovyの処理
エラー:スクリプトはまだ使用が承認されていません
完了:失敗
Job DSLバージョン1.60では、「セキュリティの構成」ページのCSRF保護セクションで、古い動作を復元するためにスクリプトセキュリティを導入し、ジョブDSLスクリプトのスクリプトセキュリティを有効にするのチェックを外しました。これは、シードジョブがgitに存在するジョブを構築する場合にgit pull request承認など、スクリプトを承認する別の方法がある場合にのみ行う必要があります。
Job DSLバージョン1.60では、スクリプトをホワイトリストに登録する必要がある Script Security が導入されました。
1.60への移行 に関するヒントもお読みください。
スクリプト承認の事前入力に使用するグルーヴィーなスクリプトは次のとおりです。
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();
}
プログラムで無効にする場合は、次のスクリプトを$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()
Jenkins Groovy DSLを使用している場合、保留中のすべてのスクリプトを承認するために使用できるスニペットを次に示します。
import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval
ScriptApproval scriptApproval = ScriptApproval.get()
scriptApproval.pendingScripts.each {
scriptApproval.approveScript(it.hash)
}