почему mkdir пытается (и по праву терпит неудачу) создать существующие корневые каталоги? - PullRequest
0 голосов
/ 12 октября 2018

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

steps.println 'target file path: ' + folder.toString()
    steps.println 'who am i?: ' + "whoami".execute().text

    def sout = new StringBuilder()
    def serr = new StringBuilder()
    def cmd = ('mkdir -v -p ' + folder.toString())
    steps.println 'cmd = ' + cmd
    def proc = cmd.execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(1000)

    if (proc.exitValue() == 0){
        steps.println 'Success: ' + sout
    }
    else {
        steps.println 'ERROR: ' + serr
        throw new Exception('Could not create directory "' + folder.toString() +'"')
    }

Однако, когда код выполняется, я получаю следующий вывод:

Destination Path = 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs/Storfirst Release Notes.pdf
[Pipeline] echo
target file name: Storfirst Release Notes.pdf
[Pipeline] echo
target file path: 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs
[Pipeline] echo
who am i?: jenkins

[Pipeline] echo
cmd = mkdir -v -p 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs
[Pipeline] echo
ERROR: mkdir: cannot create directory ‘/home/jenkins’: Permission denied

Я проверил, что разрешения правильны для всехпапки (home принадлежит root, остальные принадлежат jenkins и имеют разрешения для всего, кроме глобальной записи).Только две нижние папки не существуют, остальные существуют и имеют соответствующие права доступа.

Когда я выполняю команду на узле jenkins вручную, она работает, как и ожидалось, но, как вы можете видеть, даже если этоработает как владелец папки, похоже, что он пытается создать корневую папку (/ home / jenkins), которую он явно не имеет разрешения на создание.

Стоит отметить причину, по которой я используюкоманда mkdir вместо функции groovy File.mkdirs () вызвана тем, что ей тоже не удалось создать каталоги.

Может кто-нибудь подсказать, что я здесь не так делаю?Спасибо

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Скрипт конвейерного Groovy всегда будет выполняться на мастере Jenkins.

То есть: Для взаимодействия с файловой системой агента сборки вам необходимо использовать предоставленные шаги, такие как dir, readFile, writeFile, ...

Чтобы выполнить что-либо на этом агенте сборки, вы должны использовать шаг bat или sh в зависимости от ОС, на которой он работает.

Есливы используете метод String.execute(), он создаст процесс на главном сервере Jenkins.

Задания не должны взаимодействовать с файловой системой или создавать процессы на главном компьютере, поскольку это может сделать всю систему нестабильной.

Чтобы убедиться в этом, вы всегда должны пытаться использовать песочницу, так как она не допускает таких вещей.

0 голосов
/ 13 октября 2018

Первый ответ правильный - вам нужно использовать методы, указанные Джергом, потому что они работают с файлами в рабочей области вашей сборки.

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

0 голосов
/ 12 октября 2018

Когда я вручную выполняю команду на узле jenkins, она работает как положено

Выполнение команды, вошедшей в систему как пользователь 'jenkins'?

Надеюсьне думаю, что он пытается создать корневую папку, я просто говорю, что у него нет доступа для создания чего-либо в корневой папке.В идеале пользователь jenkins должен иметь доступ к своей корневой папке / home / jenkins, и похоже, что здесь неправильные разрешения?

Был ли быстрый тест для создания папки в корневом каталоге jenkins, вошел в систему как другой пользователь, и я получилниже ошибки, как ожидалось.Корневая папка jenkins уже существует, и ей отказано в разрешении на создание чего-либо в этой папке, как и ожидалось.

mkdir -v -p /home/jenkins/hello/newfolder
mkdir: cannot create directory ‘/home/jenkins’: Permission denied

Войдите в систему как пользователь jenkins и выполнили команду

mkdir -v -p /home/jenkins/hello/newfolder
mkdir: created directory ‘/home/jenkins/hello’
mkdir: created directory ‘/home/jenkins/hello/newfolder’
...