Следующий конвейер 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.
Я не могу сделать (или сделал) это административное одобрение, поэтому, к сожалению, это предложение не может быть для меня вариантом.
new File(URI uri)
? - person injecteer   schedule 23.07.2021def f = new File("/path/to/my/dir")
, что мне нужно сделать, чтобы использоватьnew File(URI uri)
? - person StoneThrow   schedule 23.07.2021new File( String )
не разрешено. КлассFile
имеет еще один конструктор сURI
в качестве аргумента. Что-то вродеnew File( new URL( 'file:///home/user/workspace/prj/bar' ).toURI() )
- person injecteer   schedule 23.07.2021Scripts not permitted to use method java.net.URL toURI
. У нас нет возможности административного утверждения этой функции, поэтому я должен исключить этот обходной путь :(. Я оставлю этот вопрос открытым, потому что я думаю, что он имеет ценность для сообщества, но его приоритет для моих личных нужд уменьшен, потому что приемлем обходной путь, то есть использованиеutils.MkDir()
из общей библиотеки.Все же было бы полезно понять, почему эта странная разница между способностью конвейера и общей библиотеки выполнять одну и ту же функцию. - person StoneThrow   schedule 30.07.2021