seed job запрашивает одобрение сценария в jenkins

Я пытался выполнить начальное задание (имея URL-адрес github с отличными скриптами) в jenkins и получил следующую ошибку.

Первая сборка. Пропуск журнала изменений.
Обработка сценария DSL APIServerDeployer.groovy
ОШИБКА: сценарий еще не утвержден для использования
Завершено: ОТКАЗ


person ricky    schedule 29.04.2017    source источник
comment
Может ли это быть связано с JobDSL 1.60, представляющим безопасность скриптов?   -  person StephenKing    schedule 29.04.2017


Ответы (7)


Чтобы обойти эту функцию безопасности Jenkins, вам необходимо утвердить свой скрипт. Перейдите в раздел «Управление Jenkins» -> «Утверждение сценария в процессе». На этом экране вы увидите сценарий, который пытаетесь выполнить. Должна быть кнопка одобрения, которую вам нужно будет нажать, чтобы утвердить этот скрипт.

введите описание изображения здесь

person Erwin Alberto    schedule 19.08.2017
comment
Но как это сделать (утвердить сценарий) программно? - person Highway of Life; 22.06.2018
comment
Я думаю, мы все это знаем ... вопрос в том, как избежать постоянной необходимости одобрять - person uberrebu; 26.02.2019

В Job DSL версии 1.60 представлена ​​защита сценариев. Чтобы восстановить прежнее поведение, снимите флажок Включить безопасность сценариев для сценариев DSL заданий в разделе Защита CSRF на странице «Настройка глобальной безопасности». Это следует делать только в том случае, если у вас есть другой способ утверждения скриптов, например, с помощью утверждения запроса на перенос с помощью git, если ваше начальное задание создает рабочие места, живущие в git.

person edst    schedule 22.02.2018
comment
снятие отметки с этой опции не повлияло на меня (Jenkins 2.107.2). - person Alex; 22.04.2018
comment
Снятие отметки с этой опции, похоже, не удаляет список сценариев, которые уже заблокированы / ожидают утверждения, поэтому вам нужно утвердить сценарии, которые уже были там. Это предотвращает необходимость утверждения новых изменений в job-dsl. - person Willem M.; 25.03.2019
comment
Снятие этого флажка у меня тоже не сработало (Jenkins 2.198) - person Dexter Lakin; 24.07.2020

Вот отличный сценарий, который мы используем для предварительного заполнения утверждений сценария:


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();
}
person Jason Kulatunga    schedule 16.04.2019
comment
супер полезно, спасибо! для чего вы используете printArgumentTypes? или ты там просто забыл? - person fersarr; 16.08.2019

Версия 1.60 Job DSL представила Script Security, которая требует внесения в белый список скрипты.

Прочтите также советы о переходе на 1.60.

person StephenKing    schedule 30.04.2017

Если вы используете 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.

person jeffwtribble    schedule 01.05.2019
comment
Я попытался использовать этот фрагмент, но столкнулся с некоторыми исключениями параллелизма. Я изменил его, чтобы избавиться от each итерации, которая, как я подозревал, была связана с проблемой, и тогда все работало именно так: `` import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval ScriptApproval scriptApproval = ScriptApproval.get () while (scriptApproval.pendingScripts) {scriptApproval.approveScript (scriptApproval.pendingScripts [0] .hash)} `` ` - person mkorvas; 31.07.2020

Если вы хотите отключить его программно, перетащите следующий скрипт в $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()
person al.    schedule 19.03.2018
comment
Может быть, вы хотите, чтобы не отключался весь параметр, а программно был предварительно одобрен отдельный сценарий? - person Highway of Life; 22.06.2018
comment
У меня это не сработало. Я сбросил этот файл и перезапустил Jenkins, но мне по-прежнему требовалось утвердить скрипт из пользовательского интерфейса. - person jeffreyveon; 02.01.2019
comment
Работал у меня; Предложение @ HighwayofLife определенно было бы предпочтительнее, но я работаю в тестовой песочнице, поэтому не обязательно обеспокоен моим вариантом использования. - person kian; 29.05.2019

Попробуйте отключить безопасность сценариев для сценариев DSL заданий в разделе «Настройка глобальной безопасности». Отключить безопасность сценариев для сценариев DSL заданий

person Amal CP    schedule 18.08.2020