CodeBuild执行在构建失败后继续而不是停止。

41

我正在使用git、codebuild和elastic beanstalk构建CI/CD流水线。

在codebuild执行过程中,如果由于测试用例的语法错误而导致构建失败,我看到codebuild进度到下一个阶段,最终会产生工件。

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

请参见以下buildspec。

    version: 0.2

    phases:
      install:
        commands:
          - echo Installing package.json..
          - npm install
          - echo Installing Mocha...
          - npm install -g mocha
      pre_build:
        commands:
          - echo Installing source NPM placeholder dependencies...
      build:
        commands:
          - echo Build started on `date`
          - echo Compiling the Node.js code
          - mocha modules/**/tests/*.js
      post_build:
        commands:
          - echo Build completed on `date`
    artifacts:
      files:
        - modules/*
        - node_modules/*
        - package.json
        - config/*
        - server.js
7个回答

49

我正在尝试使用相同的逻辑,但是当我的测试失败时,CODEBUILD_BUILD_SUCCEEDING仍然等于1。您是否在失败时手动更新此环境变量? - Dakota Hipp
1
@DakotaHipp 请确保您在执行测试时使用的 buildspec.yml 命令在失败时返回非零退出代码。CODEBUILD_BUILD_SUCCEEDING 仅用于信息提示,手动更改它不会影响构建结果。 - Unsigned
我被迫在测试失败时手动更改CODE_BUILD_SUCCEEDING变量,然后在后续步骤中使用类似于其他答案的if语句检查该变量。 - Dakota Hipp
3
我在 post_build 部分添加了一行代码,并让 post_build 失败。CodeBuild 日志可以为您提供构建部分失败的详细信息。`post_build: commands: - test "$CODEBUILD_BUILD_SUCCEEDING" = "1"` - bigfoot

14

CodeBuild使用环境变量CODEBUILD_BUILD_SUCCEEDING来显示构建过程是否顺利进行。

我目前发现的最佳方法是在安装部分创建一个小脚本,然后始终使用它,例如:

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`

我正在尝试使用相同的逻辑,但是当我的测试失败时,CODEBUILD_BUILD_SUCCEEDING仍然等于1。您是否在失败时手动更新此环境变量? - Dakota Hipp
你的测试用例是否返回非零返回码?这基本上是它自动更改的要求。 - wodka
是的,它退出代码为2。目前,我正在手动更改CODEBUILD_BUILD_SUCCEEDING。这样做可以起作用,但如果自动注册退出会更好。 - Dakota Hipp
看起来很复杂。[[ $CODEBUILD_BUILD_SUCCEEDING = 1 ]] && echo Build completed on $(date) 很短,不需要脚本。 - David Ongaro

13

post_build部分即使build部分失败也会运行。进一步说明,你可以在buildspec.yml文件的post_build部分中使用变量CODEBUILD_BUILD_SUCCEEDING。你可以使post_build部分仅在build部分成功完成时运行。以下是如何实现此目标的示例:

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

2
你肯定是想用反斜杠 \" 转义,而不是用斜杠 /",对吧?我使用了反斜杠,它起作用了。 - Nick

11
将此添加到build部分。
build:
     on-failure: ABORT

2
在我看来,这应该是被接受的答案,因为它是官方文档所说的 => https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html - yactouat

2

我想强调一点,如果您希望在命令失败时停止整个执行过程,可以使用-e选项:

  • When running a bash file

      - /bin/bash -e ./commands.sh
    
  • Or when running a set of commands/bash file

    #!/bin/bash
    
    set -e
    
    # ... commands
    

1

执行 post_build 阶段将生成构件。如果需要的话,post_build 可以很好地关闭构建环境,并且即使构建失败,构件也可能会有用,例如额外的日志、中间文件等。

我建议仅对于与构建结果无关的命令使用 post_build,并正确地取消初始化构建环境。否则,您可以直接排除该步骤。


1

captainblack- 我使用了他的bash命令,它起作用了。

我已经在buildspec.yml文件中添加了bash命令,您可以从那里触发其他流水线。因此,它首先会检查该流水线是否成功,只有在成功后才会释放您提到的其他流水线。

post_build: commands:

  - bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; 
    then exit 1; fi"
  - aws codepipeline start-pipeline-execution --name pipelinename
  - aws codepipeline start-pipeline-execution --name pipelinename
  - aws codepipeline start-pipeline-execution --name pipelinename

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接