Jenkins/Groovy: почему функции запрещены скриптами, разрешенными импортированными библиотеками?

Следующий конвейер Jenkins успешно создает каталог:

@Library('my-shared-libs') _

pipeline {
  agent any
  stages {
    stage( "1" ) {
      steps {
        script {
          utils.MkDir("/home/user/workspace/prj/foo")
        }
      }
    }
  }
}
// vars/utils.groovy
import java.io.File

def MkDir(the_dir) {
  def f = new File(the_dir)
  if ( ! f.mkdirs() ) { echo "Failed creating ${the_dir}" }
  else { echo "Succeeded creating ${the_dir}" }
}

Но следующий конвейер:

pipeline {
  agent any
  stages {
    stage( "1" ) {
      steps {
        script {
          def the_dir = "/home/user/workspace/prj/bar"
          def f = new File(the_dir)
          if ( ! f.mkdirs() ) { echo "Failed creating ${the_dir}" }
          else { echo "Succeeded creating ${the_dir}" }
        }
      }
    }
  }
}

... терпит неудачу с этой ошибкой:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.io.File java.lang.String

Почему идентичный код создания каталога выполняется успешно, если он вызывается из общей библиотеки основным файлом Jenkinsfile, но не работает, если вызывается непосредственно из того же файла Jenkinsfile?

Возникает более широкий вопрос: в чем основное различие между файлом Jenkinsfile и общими библиотеками, которые он использует? Существует какое-то разграничение или различие между сценариями декларативного синтаксиса Jenkinsfile и Groovy, а также общими библиотеками, которые не совсем укладываются в моей голове. Буду признателен, если кто-нибудь поможет мне понять.


Следуя предложению @injecteer, я попробовал следующую модификацию второго Jenkinsfile:

def the_dir = "/home/user/workspace/prj/bar"
def u = new URL( "file://${the_dir}" ).toURI()
def f = new File(u)
if ( ! f.mkdirs() ) { echo "Failed creating ${the_dir}" }
else { echo "Succeeded creating ${the_dir}" }

... что привело к этой ошибке:

Scripts not permitted to use method java.net.URL toURI. Administrators can decide whether to approve or reject this signature.

Я не могу сделать (или сделал) это административное одобрение, поэтому, к сожалению, это предложение не может быть для меня вариантом.


person StoneThrow    schedule 22.07.2021    source источник
comment
что, если вы позвоните конструктору: new File(URI uri)?   -  person injecteer    schedule 23.07.2021
comment
@injecteer - извините, я не понимаю, как реализовать ваше предложение. Если мой исходный код def f = new File("/path/to/my/dir"), что мне нужно сделать, чтобы использовать new File(URI uri)?   -  person StoneThrow    schedule 23.07.2021
comment
Я не уверен, что это сработает, но ваше исключение говорит, что new File( String ) не разрешено. Класс File имеет еще один конструктор с URI в качестве аргумента. Что-то вроде new File( new URL( 'file:///home/user/workspace/prj/bar' ).toURI() )   -  person injecteer    schedule 23.07.2021
comment
@injecteer - извиняюсь за медленный ответ. Я попробовал ваше предложение, но получил ошибку Scripts not permitted to use method java.net.URL toURI. У нас нет возможности административного утверждения этой функции, поэтому я должен исключить этот обходной путь :(. Я оставлю этот вопрос открытым, потому что я думаю, что он имеет ценность для сообщества, но его приоритет для моих личных нужд уменьшен, потому что приемлем обходной путь, то есть использование utils.MkDir() из общей библиотеки.Все же было бы полезно понять, почему эта странная разница между способностью конвейера и общей библиотеки выполнять одну и ту же функцию.   -  person StoneThrow    schedule 30.07.2021
comment
ладно, в любом случае стоило попробовать. Я не эксперт по Дженкинсу и не могу помочь вам, извините.   -  person injecteer    schedule 30.07.2021
comment
Вы смотрели на stackoverflow.com/questions/42654875/ ?   -  person Shane Bishop    schedule 02.08.2021
comment
@ShaneBishop - спасибо, я этого не видел, а информация полезная. Однако мой вопрос немного отличается от этого. Мой вопрос несколько академический в том смысле, что я просто хочу понять ради понимания, несмотря на то, что у меня есть рабочий обходной путь. т.е. почему функция разрешена, если она вызывается из общей библиотеки (которая импортируется Jenkinsfile), но не разрешена, если вызывается непосредственно из Jenkinsfile. Кажется странным ограничением; Я не могу интуитивно понять намерение этого (предположительно) преднамеренного выбора дизайна создателями Jenkins/Groovy.   -  person StoneThrow    schedule 03.08.2021
comment
@StoneThrow Поскольку ваш вопрос сформулирован сейчас, все, что касается создания каталога, отвлечет потенциальных ответчиков от того, что вы действительно хотите знать. Я бы предложил вам отредактировать свой вопрос, чтобы он в целом касался того, почему функции запрещены в конвейерах/заданиях, но не в общих библиотеках. Я думаю, что это изменение повысит ваши шансы получить хороший ответ.   -  person Shane Bishop    schedule 03.08.2021