如何从sh step命令获取curl退出状态?

时间:2018-08-27 12:41:54

标签: jenkins groovy jenkins-pipeline

我正在尝试将命令的结果放入Jenkinsfile中的布尔变量中。命令为:curl -o/dev/null -sfI "$url",可以在sh中使用,如下所示:

if ( curl -o/dev/null -sfI "$url" ); then
  echo "URL exists"
else
  echo "URL does not exist"
fi

因此,我的jenkinsfile中需要此条件,但我不知道如何重新创建它。这是我尝试过的:

def fileAlreadyExists = sh(
                script: "curl -o/dev/null -sfI \"$url\"",
                returnStdout: true
        )

但是似乎总是返回false。

1 个答案:

答案 0 :(得分:3)

由于-o /dev/null的切换,您的命令不返回任何输出。如果要捕获退出代码,则必须设置returnStatus而不是returnStdout选项,例如:

def fileAlreadyExists = sh(
            script: "curl -o/dev/null -sfI \"$url\"",
            returnStatus: true
)

或者,您可以在curl命令之后扩展Bash命令以执行echo $?以回显最后一个命令退出代码:

def fileAlreadyExists = sh(
            script: "curl -o/dev/null -sfI \"$url\"; echo \\\$?",
            returnStdout: true
) as Integer // explicit casting needed, because it returns String

变量fileAlreadyExists存储一个整数值,因此您可以在if ()语句中使用它(Groovy将if (0)评估为false,因此如果您期望{{1} }退出代码,那么最好使此比较显式,如:

0

请注意:如果要将if (fileAlreadyExists == 0) { /* exists */ } else { /* not exist */ } 传递给sh命令,请记住将其转义-Jenkins会删除单个转义字符,因此如果要传递例如用双引号标记基础脚本,然后您必须通过以下方式对其进行转义:\