首页 > 解决方案 > 无法使用 Jenkins 在 ssh bash 中获取先前的状态命令

问题描述

我正在使用 Jenkins 在管道中工作。

我想在设备中运行的 docker 容器中运行一些测试,使用 ssh 和以下命令:

echo 'balena exec <container> nosetests tests/ ;exit;' | balena ssh <UUID>

我遇到的问题是,即使测试失败,ssh 命令的状态码也会为 0,因为代码已经执行。

如果我打印每个执行的状态代码:

echo 'balena exec <container> nosetests tests/: echo $? ;exit;' | balena ssh <UUID>; echo $?

我获得的输出是:

第一个回声为 1,第二个回声为 0。

这就是我编写 Jenkins 执行和检索状态代码的阶段的方式:

stage('stage name'){
    agent { node { label 'master' } }
    steps{
         
           script {
                   status = sh(script: 'echo "balena exec <container> nosetests tests/; exit;" | balena ssh <UUID>',  returnStdout:true)

    }
  }
} 

如何获取我在设备内部获得的状态并将其放入 jenkins 中的变量状态中?

如果我尝试这样做,推荐中的建议:

balena ssh <UUID> 'balena exec <container>  nosetests tests/'

我收到以下错误:

Could not find a service balena exec <container> nosetests tests/ on device <UUID>.

标签: bashjenkinsgroovy

解决方案


当您使用两个或多个命令之间带有管道时:

  • $?包含最后一条命令的返回码
  • PIPESTATUS数组包含所有命令的所有返回码

所以,在:

echo .... | ssh ...

包含和的PIPESTATUS返回码。echossh

  • ${PIPESTATUS[0]}包含echo返回码
  • ${PIPESTATUS[1]}包含ssh返回码

如果您想读取超过 1 个值:

  1. 先做一个数组拷贝
  2. 读取数组副本
echo .... | ssh ...
PIPESTATUS_COPY=(${PIPESTATUS[@]})
echo "PIPESTATUS[0]=${PIPESTATUS_COPY[0]}"
echo "PIPESTATUS[1]=${PIPESTATUS_COPY[1]}"

推荐阅读