Захват кода выхода из сценариев bash в сценариях jenkins groovy

Выполнение сценария bash copy_file.sh из сценария Jenkins Groovy и попытка отправки почты в зависимости от кода выхода, сгенерированного из сценария bash.

copy_file.sh:

#!/bin/bash

$dir_1=/some/path
$dir_2=/some/other/path

if [ ! -d $dir ]; then
  echo "Directory $dir does not exist"
  exit 1
else
  cp $dir_2/file.txt $dir_1
  if [ $? -eq 0 ]; then
      echo "File copied successfully"
  else
      echo "File copy failed"
      exit 1
  fi
fi

Часть groovy script:

stage("Copy file")  {
    def rc = sh(script: "copy_file.sh", returnStatus: true)
    echo "Return value of copy_file.sh: ${rc}"
    if (rc != 0) 
    { 
        mail body: 'Failed!',       
        subject: 'File copy failed',        
        to: "[email protected]"       
        System.exit(0)
    } 
    else 
    {
        mail body: 'Passed!',   
        subject: 'File copy successful',
        to: "[email protected]"
    }
}

Теперь, независимо от exit 1 в bash-скрипте, groovy-скрипт всегда получает код возврата 0 в rc и отправляет Passed! писем!

Любые предложения, почему я не могу получить код выхода из сценария bash в этом сценарии Groovy?

НУЖНО ЛИ МНЕ ИСПОЛЬЗОВАТЬ КОД ВОЗВРАТА ВМЕСТО КОДА ВЫХОДА?


person Foobar-naut    schedule 09.01.2018    source источник
comment
Я не вижу здесь ничего плохого. Может быть, вы не проверяете самую последнюю версию сценария?   -  person mkobit    schedule 10.01.2018
comment
сценарий bash, как и сценарий groovy, написан мной. Кажется, что всякий раз, когда сценарий bash сталкивается с exit 1, он возвращает управление сценарию groovy, но сценарий groovy не получает код возврата от bash должным образом.   -  person Foobar-naut    schedule 10.01.2018


Ответы (1)


Ваш заводной код в порядке.

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

Вместо запуска вашего сценария оболочки copy_file.sh я создал сценарий ~/exit_with_1.sh, который завершается только с кодом выхода 1.

Работа состоит из 2-х шагов:

  1. Создание ~/exit_with_1.sh скрипта

  2. Запустите скрипт и проверьте код выхода, хранящийся в rc.

В этом примере я получил 1 в качестве кода выхода. Если вы считаете, что с вашей groovy <-> bash конфигурацией что-то не так, рассмотрите возможность замены вашего copy_file.sh содержимого только exit 1, а затем попробуйте распечатать результат (перед публикацией электронных писем).

Работа Дженкинса, которую я создал:

node('master') {
    stage("Create script with exit code 1"){
            // script path
            SCRIPT_PATH = "~/exit_with_1.sh"

            // create the script
            sh "echo '# This script exits with 1' > ${SCRIPT_PATH}"
            sh "echo 'exit 1'                    >> ${SCRIPT_PATH}"

            // print it, just in case
            sh "cat ${SCRIPT_PATH}"

            // grant run permissions
            sh "chmod +x ${SCRIPT_PATH}"
    }
    stage("Copy file")  {
        // script path
        SCRIPT_PATH = "~/exit_with_1.sh"

       // invoke script, and save exit code in "rc"
        echo 'Running the exit script...'
        rc = sh(script: "${SCRIPT_PATH}", returnStatus: true)

        // check exit code
        sh "echo \"exit code is : ${rc}\""

        if (rc != 0) 
        { 
            sh "echo 'exit code is NOT zero'"
        } 
        else 
        {
            sh "echo 'exit code is zero'"
        }
    }
    post {
        always {
            // remove script
            sh "rm ${SCRIPT_PATH}"
        }
    }
}
person natansun    schedule 30.08.2018