Jenkins通过balena ssh执行容器测试无法获取正确状态码如何解决
解决方案
1. 修复balena ssh直接传命令的报错
你之前直接传命令报错是因为balena ssh默认会将UUID后的字符串识别为要进入的设备内服务名称,若要在设备的宿主机OS层面执行命令,需要添加--host参数,正确写法如下:
balena ssh <UUID> --host "balena exec <container> nosetests tests/"
这种方式下,balena ssh会直接透传远程命令的退出码,你可以直接在Jenkins的sh步骤中用returnStatus: true直接获取状态码:
stage('stage name'){ agent { node { label 'master' } } steps{ script { // returnStatus=true会直接返回命令的退出码 status = sh( script: 'balena ssh <UUID> --host "balena exec <container> nosetests tests/"', returnStatus: true ) // 此时status的值就是nosetests的实际退出码,1为失败0为成功 } } }
2. 沿用管道传命令写法的兼容方案
如果因为版本或其他限制不能用--host参数,可以在远程命令最后把退出码加固定前缀输出,再从本地拿到的输出中提取状态值:
stage('stage name'){ agent { node { label 'master' } } steps{ script { def output = sh( script: 'echo "balena exec <container> nosetests tests/; echo REMOTE_EXIT=\$? ;exit;" | balena ssh <UUID>', returnStdout: true ).trim() // 从输出中提取真实退出码 def status = output.split('REMOTE_EXIT=')[1].trim() as Integer } } }
内容的提问来源于stack exchange,提问作者J.C Guzman
相关产品推荐
相关产品推荐

