【问题标题】:Cannot get the previous status command in ssh bash using Jenkins无法使用 Jenkins 在 ssh bash 中获取先前的状态命令
【发布时间】:2021-09-30 14:24:38
【问题描述】:

我正在使用 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 中的变量 status 中?

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

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

我收到以下错误:

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

【问题讨论】:

  • 在命令链中,如“echo 'balena exec nosetests tests/;exit;' | balena ssh " 您将收到最新执行命令的状态。在本地 PC 上,它仍然是“balena ssh”(不管它是什么)。在远程 PC 上它将是“退出”
  • 你可以使用balena ssh &lt;UUID&gt; 'balena exec &lt;container&gt; nosetests tests/' 吗?我相信这可能会解决您的问题(无需退出 -> 返回码现在是 balena exec 命令之一)

标签: bash jenkins groovy


【解决方案1】:

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

  • $? 包含最后一条命令的返回码
  • 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]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多