как избежать, чтобы Дженкинс запрашивал внутрипроцессное одобрение вызова в доверенном разделяемом конвейере - PullRequest
0 голосов
/ 08 июля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...