33

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

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

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

请参阅下面的构建规范。

    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
4

6 回答 6

42

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

POST_BUILD将始终运行,只要BUILD也运行过(无论BUILD' 成功或失败。)同样适用于UPLOAD_ARTIFACTS. 这样您就可以检索调试信息/工件。

如果你想POST_BUILD根据成功或失败做一些不同的事情BUILD,你可以测试内置的环境变量CODEBUILD_BUILD_SUCCEEDING,它设置为1如果BUILD成功,0如果失败。

于 2017-10-26T17:44:09.687 回答
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`
于 2018-02-09T15:15:55.030 回答
11

即使构建部分可能失败,也会运行post_build部分。扩展先前的答案,您可以使用文件CODEBUILD_BUILD_SUCCEEDINGpost_build 部分中的变量buildspec.yml当且仅当构建部分成功完成时,您才能使 post_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
于 2020-02-04T20:06:18.817 回答
2

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

  • 运行 bash 文件时

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

    #!/bin/bash
    
    set -e
    
    # ... commands
    
于 2020-11-10T15:46:19.627 回答
1

在构建部分添加这个

build:
     on-failure: ABORT
于 2021-04-21T09:19:15.327 回答
0

将执行 post_build 阶段并生成工件。post_build 可以在必要时正确关闭构建环境,即使构建失败,工件也很有用。例如额外的日志、中间文件等。

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

于 2017-11-08T19:54:35.637 回答