Вызовы библиотеки 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, чтобы сделать ее доверенной, то она будет работать так, как я хочу, без исключений.