Jenkins流水线检测AWS Lambda函数存在性时因退出码255中断
解决Jenkins流水线中检测AWS Lambda存在性不终止流水线的问题
我明白你的痛点——Jenkins默认会把非0退出码当成流水线失败,直接终止流程,这确实会打断你的检测逻辑。下面给你两种解决方案,一种是快速修复现有脚本,另一种是更优雅的流水线逻辑优化:
方案一:修改Shell脚本,强制返回0避免流水线终止
你的does_lambda_exist函数在检测到Lambda不存在时,因为aws lambda get-function返回非0,会导致整个Shell脚本返回非0,触发Jenkins终止。我们可以让函数不管检测结果如何都返回0,或者确保整个Shell块的退出码为0:
修改后的sh步骤代码:
sh '''function does_lambda_exist() { aws lambda get-function --function-name $1 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Lambda '$1' exists" else echo "Lambda '$1' does not exist" fi return 0 # 强制函数返回0,避免整个脚本抛出错误 } && does_lambda_exist testJenkins && does_lambda_exist testJenkins2'''
或者更简洁的方式,在调用检测函数时加上|| true,忽略单个检测的错误:
sh '''function does_lambda_exist() { aws lambda get-function --function-name $1 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Lambda '$1' exists" else echo "Lambda '$1' does not exist" fi } && does_lambda_exist testJenkins && does_lambda_exist testJenkins2 || true'''
方案二:捕获退出码并执行条件逻辑(更优)
其实你当前的流水线还有一个问题:不管Lambda是否存在,都会执行create-function,如果函数已存在,这个命令会直接报错。我们可以利用Jenkins的returnStatus参数捕获检测的退出码,然后根据结果决定是创建还是更新Lambda函数:
修改后的Upload to AWS阶段代码:
stage('Upload to AWS') { steps { dir('lambda/testJenkins') { // 检测testJenkins是否存在,捕获退出码到变量 script { def lambdaExists = sh( script: 'aws lambda get-function --function-name testJenkins > /dev/null 2>&1', returnStatus: true ) if (lambdaExists == 0) { echo "Lambda 'testJenkins' exists, updating code..." sh 'aws lambda update-function-code --zip-file fileb://testJenkins.zip --function-name testJenkins' } else { echo "Lambda 'testJenkins' does not exist, creating new function..." sh 'aws lambda create-function --zip-file fileb://testJenkins.zip --function-name testJenkins --runtime python3.7 --role <role> --handler testJenkins.lambda_handler' } // 同样检测testJenkins2,这里可以复用逻辑 def lambda2Exists = sh( script: 'aws lambda get-function --function-name testJenkins2 > /dev/null 2>&1', returnStatus: true ) if (lambda2Exists == 0) { echo "Lambda 'testJenkins2' exists" } else { echo "Lambda 'testJenkins2' does not exist" } } } } }
关键说明:
returnStatus: true:这个参数会让Jenkins执行Shell命令后返回其退出码,而不是因为非0退出码终止流水线。- 用
script块包裹:Jenkins流水线的声明式语法中,要使用变量和条件逻辑,需要放在script块内。 - 区分创建和更新:对于已存在的Lambda,使用
update-function-code而不是create-function,避免不必要的报错。
这样既解决了流水线被终止的问题,又优化了Lambda的部署逻辑,更符合生产环境的需求。
内容的提问来源于stack exchange,提问作者Daniel Hawes
相关产品推荐
相关产品推荐

