即使命令在 buildspec.yml 中失败,AWS Build Project 也会成功

AWS Build Project succeeds even when a command fails in buildspec.yml

我正在使用 AWS CodeBuild 通过无服务器框架将函数部署到 AWS lambda。

这是我的 buildspec.yml,

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 10  
    commands:
      - echo installing Mocha...
      - npm install -g mocha
      - echo installing Serverless...
      - npm install -g serverless
  pre_build:
    commands:
      - echo running npm install for global project...
      - npm install
      - echo running npm install for each function...
      - folders=src/*
      - for value in $folders;
        do
          echo $value
          npm --prefix $value install $value;
        done
  build:
    commands:
      - sls package
      - serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION | tee deploy.out
  post_build:
    commands:
      - echo done
      # - . ./test.sh

问题是,即使 serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION | tee deploy.out 命令失败,构建项目在代码管道中被 AWS codebuild 显示为成功。

当无服务器部署命令失败时,我希望构建状态为失败。

发生这种情况是因为 post_build 执行是否 build 失败或成功。因此它不会衡量构建失败,post_build 无论如何都会 运行。 build phase transitions.

中对此进行了解释

您可以通过检查 CODEBUILD_BUILD_SUCCEEDING env variable:

“手动”检查 build 是否在 post_build 中失败来纠正此问题
  • CODEBUILD_BUILD_SUCCEEDING:当前构建是否成功。如果构建失败则设置为 0,如果构建成功则设置为 1。

因此,在您的 post_build 中,您可以检查 CODEBUILD_BUILD_SUCCEEDING == 0exit 1 是否为真。

  post_build:
    commands:
      - if [[ $CODEBUILD_BUILD_SUCCEEDING == 0 ]]; then exit 1; fi
      - echo done
      # - . ./test.sh

您的命令:

- serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION | tee deploy.out

... 不是 return 失败时的非零代码,这是构建失败所必需的。命令 tee 屏蔽了来自 serverless deploy 的 return 代码,因为它本身正在使用“0” return 代码进行响应。

我建议将命令重写为:

- serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION > deploy.out
- cat deploy.out