Задача Jenkins Pipeline не может найти script из-за создания пути @tmp
Я пишу задание на конвейер, которое вызывает другой script для выполнения. Файлы Jenkins и script существуют в одном каталоге, но в задании не удается найти script.
Это соответствующий бит script;
stage ('Update') {
try {
dir('jenkins/pipeline/update-jenkins-plugins-ppln') {
sh 'ls -l'
sh 'update-plugins.sh'
}
}
который возвращает следующую ошибку:
[update-jenkins-plugins-ppln] Running shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 2441 Dec 20 09:34 Jenkinsfile
-rwxr-xr-x 1 jenkins jenkins 506 Dec 19 14:06 update-plugins.sh
[Pipeline] sh
[update-jenkins-plugins-ppln] Running shell script
+ update-plugins.sh
/var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/[email protected]/durable-11cefdd0/script.sh: 2: /var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/[email protected]/durable-11cefdd0/script.sh: update-plugins.sh: not found
Как вы можете видеть, путь, который я использую, является правильным, потому что в соответствии с ls
файл, который мне нужен update-plugins.sh
, находится в каталоге, к которому я привязался. По какой-то причине, хотя при поиске script Дженкинса добавляется @tmp/durable-8d48734f/script.sh
на путь.
Различные способы устранения неполадок:
- Я прочитал, что вам нужно снова проверить ветку, даже если вы уже проверяете ее, чтобы получить файл Jenkins, так что я.
- У меня есть ssh'd в поле Jenkins, чтобы проверить и да, script есть.
Почему Дженкинс добавляет бит @tmp, и есть ли способ предотвратить это поведение?
Ответы
Ответ 1
Пробовали ли вы использовать переменную среды рабочего пространства jenkins WORKSPACE
(абсолютный путь рабочей области)? При этом ваша строка будет выглядеть примерно так:
sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
Ответ 2
Я думаю, ваш pwd не находится в PATH, поэтому вы должны называть его следующим образом: sh './update-plugins.sh'
Ответ 3
У меня была такая же проблема. Я думаю, что @Oren технически ответил на ваш вопрос о том, почему Дженкинс создает это пространство tmp
, но я могу поделиться некоторой информацией о том, как я решил это.
По сути, мой хост Jenkins содержит ссылки bin/sh
на dash
; не bash
. Таким образом, использование POSIX-совместимого сценария оболочки решило эту проблему для меня.
Например, я пытался использовать shopt -s extglob
для сопоставления с образцом:
stage {
def shellCommand = $/ "rm -rf ! (_data|_includes|_plugins|Gemfile|_config.yml|page-builder)"/$
sh(returnStdout: true, script: shellCommand).trim()
}
Поскольку dash
не поддерживает extglob
, extglob
замена POSIX-совместимой команды find
:
stage {
sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
}
Ответ 4
Папка @tmp предназначена для статистики работы Дженкинса и этапов (продолжительность этапов и т.д.), Вы можете удалить ее, если хотите быть в этом уверены. Я предполагаю, что ваша проблема связана с неверным путем, дважды проверьте ее.
Ответ 5
Я предполагаю, что этот конкретный случай не имеет ничего общего с конвейерами Jenkins, поскольку его можно воспроизвести за пределами Jenkins в консоли. Однажды я получил эту проблему из -за окончания строки DOS в моем скрипте, который я запустил в конвейере "sh()". Посмотрите на этот пример:
$ cat -v dos_formatted.sh
#! /bin/sh^M
pwd^M
$ cat script.sh
./dos_formatted.sh
$ sh -xe script.sh
+ ./dos_formatted.sh
script.sh: 1: script.sh: ./dos_formatted.sh: not found
Это хорошо иллюстрирует, что сообщение "not found" вводит в заблуждение. Сценарий находится в нужном месте, и разрешения достаточно, но при запуске его из другого сценария происходит сбой с таким сообщением об ошибке.
Код плагина Durable Task (https://github.com/jenkinsci/durable-task-plugin/blob/master/src/main/java/org/jenkinsci/plugins/durabletask/BourneShellScript.java) показывает, что плагин запускает автоматически сгенерированный script.sh как "sh -xe...", поэтому это точно наш случай.
Описанная выше ситуация может возникнуть, если вы "git clone" в каком-то (возможно, стороннем) проекте Git и не уверены, что он был клонирован с LF в стиле Unix.