bash - 无法使用 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>.
解决方案
当您使用两个或多个命令之间带有管道时:
$?
包含最后一条命令的返回码- 该
PIPESTATUS
数组包含所有命令的所有返回码
所以,在:
echo .... | ssh ...
包含和的PIPESTATUS
返回码。echo
ssh
${PIPESTATUS[0]}
包含echo
返回码${PIPESTATUS[1]}
包含ssh
返回码
如果您想读取超过 1 个值:
- 先做一个数组拷贝
- 读取数组副本
echo .... | ssh ...
PIPESTATUS_COPY=(${PIPESTATUS[@]})
echo "PIPESTATUS[0]=${PIPESTATUS_COPY[0]}"
echo "PIPESTATUS[1]=${PIPESTATUS_COPY[1]}"
推荐阅读
- vue.js - 如何在 vue-cli 中更改每个页面的 css 样式
- r - 填补季节性数据(缺失数据插补)R中的卡尔曼滤波器
- c++ - 类成员函数无法访问同一类的私有结构节点?
- java - 像这样使用继承是对的吗?
- java - MouseAdapter 中 isPopupTrigger() 的正确处理是什么
- java - 尽管实现了构造函数,但构造函数丢失错误
- python - 如何将情节表达图保存到 html 或静态图像文件中?
- azure - 无法在 Azure 上创建 AKS 群集
- python - 使用链表的 Python 循环队列
- botframework - 关于单词与实体列表的可选标点符号的 LUIS.AI 模式的工作方式与预期不同