从 jenkins groovy 脚本中的 bash 脚本中捕获退出代码



执行来自 Jenkins Groovy 脚本copy_file.sh的 bash 脚本,并尝试根据从 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: "xyz@abc.com"       
        System.exit(0)
    } 
    else 
    {
        mail body: 'Passed!',   
        subject: 'File copy successful',
        to: "xyz@abc.com"
    }
}

现在,无论 bash 脚本中的exit 1如何,groovy 脚本总是在 rc 中获取返回代码0并拍摄Passed!邮件!

有什么建议为什么我无法从这个 Groovy 脚本中的 bash 脚本接收退出代码?

我是否需要使用返回代码而不是退出代码?

你的时髦代码没问题。

我创建了一个新的管道作业来检查您的问题,但对其进行了一点更改。

我没有运行你的 shell 脚本copy_file.sh我创建了~/exit_with_1.sh脚本,它只以退出代码 1 退出。

该作业有 2 个步骤:

  1. 创建~/exit_with_1.sh脚本

  2. 运行脚本并检查存储在 rc 中的退出代码。

在这个例子中,我得到了1作为退出代码。如果您认为groovy <-> bash配置有问题,请考虑仅将copy_file.sh内容替换为 exit 1然后尝试打印结果(在发布电子邮件之前(。

我创建的 Jenkins 作业:

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}"
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新