Как заставить 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"