You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkinsfile中Groovy脚本校验AWS Secrets失败:exit code 255求助

问题分析与修复

你的hudson.AbortException: script returned exit code 255错误源于AWS CLI命令的非零退出码,再加上代码逻辑存在多处问题,具体问题与修复方案如下:

核心问题点

  • AWS CLI未处理非零退出码:当密钥不存在时,aws secretsmanager describe-secret会返回非零退出码(通常为255),Jenkins的sh步骤默认会因非零退出码终止流水线,即便用了returnStdout: true也会触发异常。
  • 判断逻辑完全颠倒:你当前判断!returnText.contains("ResourceNotFoundException")时抛出异常,但该信息实际代表密钥不存在,你应该在密钥存在时终止流水线。
  • 循环覆盖变量:循环中每次给returnText赋值,最终仅保留最后一个密钥的检查结果,前面的密钥存在也无法被检测到。
  • 未捕获stderr输出:ResourceNotFoundException输出到stderr,你只捕获了stdout,根本拿不到该错误信息。
  • 变量未规范声明:secrets、returnText等变量未用def声明,不符合Groovy规范,可能引发潜在问题。

修复后的完整代码

def SecretValidation = { String environment, region ->
    // 解析Terraform plan获取待创建的密钥列表
    def secrets = sh(
        script: "cat plan.log | awk -F '+' '\$4 != \$2 {print \$0}' | grep -w name | awk -F '= ' '{gsub(/\"/, \"\", \$2); print \$2}'",
        returnStdout: true
    ).trim().split('\n')

    // 遍历每个密钥检查是否存在
    for (def secret in secrets) {
        // 捕获stdout和stderr,同时允许非零退出码
        def awsOutput = sh(
            script: "aws secretsmanager describe-secret --secret-id ${secret} 2>&1",
            returnStdout: true,
            returnStatus: true
        )

        // 退出码为0代表密钥存在,终止流水线
        if (awsOutput == 0) {
            commentPR "## ERROR \n Secrets already exist! \n\n" + "## " + environment + " / " + region + "\n```\n${secret}\n```\n"
            throw new Exception("Secret ${secret} already exists.")
        }
        // 处理其他AWS CLI错误(如权限问题)
        else if (!awsOutput.contains("ResourceNotFoundException")) {
            commentPR "## ERROR \n Failed to check secret ${secret}: \n\n```\n${awsOutput}\n```\n"
            throw new Exception("Failed to validate secret ${secret}.")
        }
    }

    // 所有密钥均不存在,继续执行apply
    commentPR "## INFO \n Secrets do not exist. Proceeding with Apply. \n\n" + "## " + environment + " / " + region + "\n```\n```\n"
}

关键修复说明

  • 捕获stderr并允许非零退出码:用2>&1将stderr重定向到stdout,同时添加returnStatus: true,让sh步骤返回命令退出码而非直接抛出异常。
  • 实时检查每个密钥:循环中发现任一密钥存在,立即终止流水线并评论PR,避免遗漏。
  • 修正判断逻辑:退出码为0代表密钥存在,此时抛出异常;若为其他错误(如权限不足),单独处理。
  • 规范变量声明:所有变量用def声明,符合Groovy语法要求。

内容的提问来源于stack exchange,提问作者Doug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:55:39