Как заставить Jenkins 2.0 выполнить команду sh в том же каталоге, что и проверка?
Вот мой трубопровод Jenkins 2.x:
node ('master'){
stage 'Checkout'
checkout scm
stage "Build Pex"
sh('build.sh')
}
Когда я запускаю этот конвейер, checkout помещает код в рабочую область, как ожидалось, но вместо того, чтобы ожидать, что он найдет script в рабочей области/(он действительно там!), он смотрит в несвязанный каталог: workspace @tmp/долговечны-d812f509.
Entering stage Build Pex
Proceeding
[Pipeline] sh
[workspace] Running shell script
+ build.sh
/home/conmonsysdev/deployments/jenkins_ci_2016_interns/jenkins_home/jobs/pex/branches/master/[email protected]/durable-d812f509/script.sh: line 2: build.sh: command not found
Как мне изменить этот файл Jenkins, так что build.sh выполняется в том же каталоге, где я проверил исходный код проекта?
Ответы
Ответ 1
Вы можете заключить свои действия в блок dir
.
checkout scm
stage "Build Pex"
dir ('your new directory') {
sh('build.sh')
}
...
your new directory
является владельцем места вашего фактического каталога. По умолчанию это относительный путь к рабочему пространству. Вы можете определить абсолютный путь, если вы уверены, что это присутствует в агенте.
Ответ 2
Причина, по которой ваш script не работает, заключается в том, что "build.sh" не находится в вашем PATH.
В файле Jenkinsfile находится "sh" script, все содержимое которого является строкой build.sh
. Родительский script находится в каталоге "@tmp" и всегда будет там - каталог "@tmp", где Дженкинс хранит файл Jenkins, по существу, во время прогона.
Чтобы устранить проблему, измените вашу строку на sh "./build.sh"
или sh "bash build.sh"
, так что блок sh
в файле Jenkins может правильно найти build.sh
script, который вы хотите выполнить.
Ответ 3
У меня такая же проблема, и dir не помогает, возможно, потому, что я работаю внутри подкаталога самого tmp-dir (по причине не здесь). Мой код выглядит следующим образом:
dir(srcDir){
sh 'pwd; la -l; jenkins.sh "build.sh"'
}
(операторы pwd
и la -l
были добавлены только для отладки. Проблема существует без них.) С ними я получаю вывод, например:
+ pwd
/jenkins/workspace/[email protected]/repos/2
+ ls -l
total 72
-rw-r--r-- 1 jenkins jenkins 394 May 19 12:20 README.md
drwxr-xr-x 3 jenkins jenkins 4096 May 19 12:20 api-automation
-rwxr-xr-x 1 jenkins jenkins 174 May 19 12:20 build-it.sh
-rwxr-xr-x 1 jenkins jenkins 433 May 19 12:20 build-release.sh
-rwxr-xr-x 1 jenkins jenkins 322 May 19 12:20 build.sh
drwxr-xr-x 3 jenkins jenkins 4096 May 19 12:20 ix-core
drwxr-xr-x 3 jenkins jenkins 4096 May 19 12:20 ix-java-client
drwxr-xr-x 3 jenkins jenkins 4096 May 19 12:20 ix-rest-models
drwxr-xr-x 4 jenkins jenkins 4096 May 19 12:20 ix-service
drwxr-xr-x 7 jenkins jenkins 4096 May 19 12:20 ixternal
drwxr-xr-x 5 jenkins jenkins 4096 May 19 12:20 ixtraneous-stuff
-rwxr-xr-x 1 jenkins jenkins 472 May 19 12:20 jenkins.sh
-rw-r--r-- 1 jenkins jenkins 16847 May 19 12:20 pom.xml
+ jenkins.sh build.sh
/home/jenkins/workspace/[email protected]/repos/[email protected]/durable-a3ec0501/script.sh: line 2: jenkins.sh: command not found
В итоге я сделал это:
dir(srcDir){
sh 'cdr=$(pwd); $cdr/jenkins.sh "build.sh"'
}
Ответ 4
Дженкинс создает папку, когда она делает клон из вашего проекта следующим образом:
///Jenkins// вакансии имя рабочего пространства вар Lib @script
Для этого вы должны установить файл как исполняемый, если вы находитесь в среде linux, а затем вызываете оболочку script.
Что-то вроде этого:
// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"
// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"