Jenkins Pipeline无变更时脚本执行失败问题排查与解决
Jenkins Pipeline获取Terragrunt变更目录的构建失败问题解决
问题场景
在Jenkins任务中,需要通过Git diff获取存在变更的目录,以此为目标运行terragrunt plan。最初使用的脚本如下:
def directories = sh([script: "git diff HEAD~1 --name-only | xargs dirname | sort | uniq | grep terragrunt/okta", returnStdout: true]).trim()
脚本通过grep筛选存储.hcl文件的terragrunt/okta目录,但当该目录无任何变更时,Jenkins构建会直接失败,且控制台无额外报错信息。本地终端执行该命令可正常运行,但在Jenkins Pipeline中结合returnStdout和trim()方法时出现异常。
问题原因
grep命令在未匹配到任何结果时会返回非0退出码,而Jenkins的sh步骤默认会将非0退出码判定为命令执行失败,从而终止构建。本地终端中shell不会因单个命令的非0退出码中断执行,因此不会出现问题。
解决方案
为grep命令追加|| echo '',确保无论是否匹配到结果,整个命令链都返回0退出码,避免Jenkins判定构建失败。修改后的脚本如下:
def directories = sh([script: "git diff HEAD~1 --name-only | xargs dirname | sort | uniq | grep terragrunt/okta || echo ''", returnStdout: true]).trim()
|| echo ''的作用:当grep无匹配结果返回非0时,执行echo ''输出空字符串,让整个命令的退出码变为0- 后续可通过判断
directories是否为空,决定是否执行terragrunt plan操作
内容的提问来源于stack exchange,提问作者Frendom
相关产品推荐
相关产品推荐

