如何让Azure DevOps Pipeline不读取远程脚本输出并避免失败
解决Azure Pipeline SSH任务后台运行脚本仍捕获输出并触发失败的问题
方法1:重定向脚本所有输出,彻底隔离Pipeline的输出监听
nohup默认会将输出写入nohup.out,即使加了&后台运行,Azure Pipeline的SSH任务仍会监听远程会话的输出流。你可以把标准输出(stdout)和错误输出(stderr)全部重定向到/dev/null,或者指定日志文件,让Pipeline接收不到任何输出:
- 丢弃所有输出:
nohup ./updateImage.sh > /dev/null 2>&1 & - 保留日志到指定文件:
nohup ./updateImage.sh > /var/log/update_image.log 2>&1 &
这里2>&1是把错误输出重定向到标准输出,再一起写入目标位置,确保没有任何输出回流到SSH会话。
方法2:调整SSH任务的错误判定规则
在Azure Pipeline的SSH@0任务配置中,关闭错误输出触发失败的机制,或者忽略脚本的退出码:
- 忽略错误输出导致的失败:
- task: SSH@0 inputs: sshEndpoint: '你的远程机器端点名称' runOptions: 'commands' commands: 'nohup ./updateImage.sh &' failOnStdErr: false - 如果脚本本身可能返回非零退出码但属于正常情况,可以同时开启忽略退出码:
- task: SSH@0 inputs: sshEndpoint: '你的远程机器端点名称' runOptions: 'commands' commands: 'nohup ./updateImage.sh &' failOnStdErr: false ignoreExitCode: true
注意:ignoreExitCode: true会忽略所有退出码,使用时要确保脚本不会出现真正需要阻断Pipeline的致命错误。
方法3:修改脚本自身的输出逻辑
检查updateImage.sh中的输出内容,避免产生被Pipeline识别为错误的输出:
- 把脚本中不必要的错误输出(用
>&2输出的内容)改为标准输出,或者重定向到日志文件; - 确保脚本正常执行完成后返回0退出码,即使遇到非致命性的小问题(比如没有新版本镜像时),不要返回非零值;
- 示例调整脚本中的错误处理:
# 原可能输出stderr的命令改为重定向到日志 aws ecr describe-images --repository-name my-repo 2>> /var/log/update_image.log # 没有新版本时返回0 if [ "$has_new_image" = "false" ]; then echo "无新版本镜像,无需更新" >> /var/log/update_image.log exit 0 fi
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

