TLDR;
Как настроить jenkins
неинтерактивным способом, чтобы люди могли использовать мою общую библиотеку без необходимости нажимать кнопку Одобрить для внутрипроцессный скрипт.
длинный рассказ ...
Я создал общую библиотеку в Jenkins, которая выглядит примерно так (упрощенная версия):
def call(body) {
// evaluate the body block, and collect configuration into the object
def pipelineParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = pipelineParams
body()
pipeline { stages { stage { steps { script {
pipelineParams.test()
}
}
Таким образом, пользователь может просто вызвать мою библиотеку следующим образом:
@Library('my-shared-library@master') _
MyPipeline {
test = {
sh "./gradlew test"
}
}
Библиотека также настроена в jenkins / configure .
Проблема в том, что Дженкинсвсегда запрашивать утверждение сценария в процессе для подписи:
подпись: staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods invokeMethod java.lang.Object java.lang.Stringjava.lang.Object
Однако в документации говорится, что разделяемые библиотеки должны быть доверенными : https://jenkins.io/doc/book/pipeline/shared-libraries/#global-shared-libraries...
Это то, что я пытался:
1.полностью отключить утверждение сценария в процессе
это кажется невозможным: см. Как отключить проверки безопасности для сборок конвейера Jenkins и открыть jenkins
ticket: https://issues.jenkins -ci.org / browse / JENKINS-28178
2.использовать Конфигурацию как код, чтобы предварительно сконфигурировать jenkins, чтобы разрешить этот конкретный метод
В настоящее время это еще не возможно ... работа кажется в основном готовой, но все еще нуждается в объединении с мастером на сегодняшний день: https://github.com/jenkinsci/script-security-plugin/pull/250
3.GET и POST в jenkins / scriptApproval
Я использовал отладчик браузера, чтобы увидеть, какие звонки были сделаны.GET на странице дал мне правильный идентификатор, и тогда POST было бы достаточно, но так как оба запроса делаются отдельно, идентификатор меняется между ними, и я получаю ошибку 404 ...
import requests
id = [line for line in requests.get("http://localhost:8080/scriptApproval/").text.strip().split() if 'makeStaplerProxy' in line][0].split("'")[1]
postUrl = "http://localhost:8080" + id + "/approveSignature"
print(postUrl)
r = requests.post(postUrl)
print(r.status_code)
даст:
http://localhost:8080/$stapler/bound/8488d0c2-9fce-4091-8b9f-747ae0016421/approveSignature
404
4.неявная загрузка библиотеки
Я неявно загружаю библиотеку и удаляю
@Library('my-shared-library@master') _
из файла Jenkinsfile.Одобрение все еще требуется.
из идей
У меня совсем нет идей.Обычно предполагается, что shared-pipe является доверенным, поэтому я не совсем понимаю, почему он все еще запрашивает одобрение для этих внешних вызовов ... или я делаю что-то не так в реализации моего общего ресурса-library