Build 代码生成执行在生成失败后继续,而不是停止

Build 代码生成执行在生成失败后继续,而不是停止,build,continuous-integration,continuous-deployment,aws-codepipeline,aws-codebuild,Build,Continuous Integration,Continuous Deployment,Aws Codepipeline,Aws Codebuild,我正在使用git、codebuild和elastic beanstalk构建一个CI/CD管道 在代码构建执行期间,当由于测试用例的语法错误而导致构建失败时,我看到代码构建进展到下一阶段,并最终继续生成工件 我的理解是,如果构建失败,执行应该停止。这是正确的行为吗 请参阅下面的buildspec 版本:0.2 阶段: 安装: 命令: -echo正在安装package.json。。 -npm安装 -安装摩卡咖啡。。。 -npm安装-g摩卡 预构建: 命令: -echo正在安装源NPM占位符依赖项。

我正在使用git、codebuild和elastic beanstalk构建一个CI/CD管道

在代码构建执行期间,当由于测试用例的语法错误而导致构建失败时,我看到代码构建进展到下一阶段,并最终继续生成工件

我的理解是,如果构建失败,执行应该停止。这是正确的行为吗

请参阅下面的buildspec

版本:0.2
阶段:
安装:
命令:
-echo正在安装package.json。。
-npm安装
-安装摩卡咖啡。。。
-npm安装-g摩卡
预构建:
命令:
-echo正在安装源NPM占位符依赖项。。。
建造:
命令:
-echo生成已于`日期'开始`
-echo编译Node.js代码
-摩卡模块/**/tests/*.js
后期构建:
命令:
-echo生成于`日期'完成`
人工产品:
文件夹:
-模块/*
-节点单元/*
-package.json
-配置/*
-server.js

CodeBuild通过退出代码检测生成失败。您应该确保测试执行在失败时返回非零退出代码

(无论
构建的成功与否,
上传工件的成功与否都是如此)。这样您就可以检索调试信息/工件


如果您想在
POST\u BUILD
中执行不同的操作,这取决于
BUILD
的成功与否,您可以测试,如果
BUILD
成功,则设置为
1
,如果失败,则设置为
0

将执行POST\u BUILD阶段并生成工件。如果需要,post_构建可以正确关闭构建环境,并且即使构建失败,工件也可能有用。例如,额外日志、中间文件等


我建议只对构建结果不可知的命令使用post_build,并正确地取消构建环境的初始化。否则,您可以排除该步骤。

CodeBuild使用环境变量CodeBuild\u BUILD\u来显示构建过程是否正常

我现在发现的最好的方法是在install secion中创建一个小脚本,然后始终像这样使用:

phases:
  install:
    commands:
      - echo '#!/bin/bash' > /usr/local/bin/ok; echo 'if [[ "$CODEBUILD_BUILD_SUCCEEDING" == "0" ]]; then exit 1; else exit 0; fi' >> /usr/local/bin/ok; chmod +x /usr/local/bin/ok
  post_build:
    commands:
      - ok && echo Build completed on `date`

即使生成部分可能失败,post_build部分也会运行。扩展前面的答案,您可以在
buildspec.yml
文件的post\u BUILD部分中使用变量
CODEBUILD\u BUILD\u successing
。当且仅当生成部分成功完成时,才能使后期生成部分运行。以下是如何实现这一目标的示例:

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - CODEBUILD_RESOLVED_SOURCE_VERSION="${CODEBUILD_RESOLVED_SOURCE_VERSION:-$IMAGE_TAG}"
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG"
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_URI .
  post_build:
    commands:
      - bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; then exit 1; fi"
      - echo Build stage successfully completed on `date`
      - docker push $IMAGE_URI
      - printf '[{"name":"clair","imageUri":"%s"}]' "$IMAGE_URI" > images.json
artifacts:
  files: images.json

我只是想指出,如果希望在命令失败时停止整个执行,可以指定
-e
选项:

  • 运行bash文件时

    -/bin/bash-e./commands.sh
    
  • 或者在运行一组命令/bash文件时

    #/bin/bash
    set-e
    # ... 命令
    

将此添加到构建部分

build:
     on-failure: ABORT

我尝试使用相同的逻辑,但是当我的测试失败时,代码构建成功仍然等于1。您是否在失败时手动更新此环境变量?您的测试用例是否返回非零返回代码?这基本上是它自动改变的要求。是的,它失败了,退出代码为2。现在,我正在手动更改代码构建。它可以工作,但是如果出口自动注册会更好。我尝试使用相同的逻辑,但是当我的测试失败时,CODEBUILD\u BUILD\u Successing仍然等于1。失败时是否手动更新此环境变量?@DakotaHipp确保用于执行测试的
buildspec.yml
命令在失败时返回非零退出代码
CODEBUILD\u BUILD\u Successing
仅供参考,手动更改它不会影响生成结果。测试失败时,我被迫手动更改code\u BUILD\u Successing变量,然后,在后面的步骤中,我将使用类似于另一个答案的if语句检查该变量。我在post_build部分添加了一行,并让post_build失败。代码构建日志可以在构建部分为您提供失败的详细信息<代码>后期生成:命令:-测试“$CODEBUILD\u BUILD\u successing”=“1”