Вызовы библиотеки Jenkins внутри закрытий вызывают исключения безопасности

Мы используем многоотраслевые конвейеры с организационными папками (плагин ветки Bitbucket). Я СУХОЙ из наших конвейеров, используя общие библиотеки, намекая на документы из Jenkins и сообщения на форуме. Я также предоставляю сценарии другим разработчикам, пытаясь найти баланс между теми, кто хочет, чтобы все "просто работало", и теми, кто хочет настроить.

Я написал общую библиотеку, включающую конвейеры и шаги по умолчанию. Эта библиотека настраивается на уровне папок в Jenkins.

jenkins-lib
    vars
        pipeline_main.groovy
        pipeline_pullRequest.groovy
        ...
        default_init.groovy

pipeline_main.groovy выполняет некоторую инициализацию, с предоставленной пользователем стадией, если есть запись Map с ключом 'init' или default_init если не:

#!groovy

def call(Map config) {
    pipeline {
        agent any
        ...
        stages {
            stage ('Init') {
                steps {
                  script {
                     config['init'] ? config['init'](config) : default_init(config)
                  }
                }
            }
            ....
        }
    }
}

И Дженкинсфайл:

@Library('repo/jenkins-lib') _

def customInit = { Map config ->
   echo 'Custom Init function override'
//   default_init(config)   // causes security exception if uncommented
}

if (env.BRANCH_NAME ==~ /PR-\d+/ ) {
    pipeline_pullRequest(maven: 'maven3.3.9')
}
else if (env.BRANCH_NAME ==~ /master|develop/ ) {
    pipeline_main(maven: 'maven3.3.9', init: customInit)
}
else {
    pipeline_feature(maven: 'maven3.3.9')
}

Вызов конвейеров, определенных в библиотеке, прекрасно работает, когда используются только значения по умолчанию.

Теперь обратите внимание customInit метод в Дженкинсфайле. Для тестирования я добавил строку отладки и вызов default_init шаг из библиотеки. Когда я запускаю тестовую сборку с этой конфигурацией (default_init без комментариев), сборка завершается с исключением безопасности:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: сценариям не разрешено использовать метод groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object ...

Если customInit Метод это просто echo Шаг конвейер успешно выполняется.

Я знаю, что могу добавить в белый список invokeMethod, но, похоже, я должен соблюдать предупреждение, которое Дженкинс говорит, чтобы отклонить запрос, чтобы избежать возможной уязвимости безопасности. И я знаю, что могу определить библиотеку на глобальном уровне Дженкинса, чтобы сделать ее надежной; однако я бы предпочел придерживаться метода для каждой папки, если это возможно.

Мне интересно, почему библиотечные методы, вызываемые непосредственно из Jenkinsfile, не вызывают исключения безопасности, а библиотечные методы, заключенные в замыкания, делают? Или я просто что-то пропустил?

PS Jenkins 2.89.3, Bitbucket Branch Source 2.2.9, все библиотеки "Pipeline: ..." в последних версиях.

default_init.groovy содержание, если это имеет значение:

#!groovy

import java.util.Map

def call(Map config) {
    echo sh(returnStdout: true, script: 'env | sort')
}

1 ответ

Решение

Я посмотрел на JENKINS-26481 и связанные с ним вопросы JIRA. Действительно, я думаю, что это ключевой случай, который команда Дженкинса еще не решила (пока?).

Если я определю библиотеку на глобальном уровне Jenkins, чтобы сделать ее доверенной, то она будет работать так, как я хочу, без исключений.

Другие вопросы по тегам