构建失败后代码构建继续

时间:2017-10-05 11:17:44

标签: build aws-codepipeline aws-codebuild

我正在使用git,codebuild和elastic 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

6 个答案:

答案 0 :(得分:13)

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

POST_BUILD will always run as long as BUILD was also run(无论BUILD的成功或失败。)UPLOAD_ARTIFACTS同样如此。这样您就可以检索调试信息/工件。

如果您想根据POST_BUILD的成功或失败在[{1}}中执行不同的操作,则可以测试builtin environment variable CODEBUILD_BUILD_SUCCEEDING,如果{BUILD设置为1 {1}}成功,BUILD如果失败。

答案 1 :(得分:9)

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`

答案 2 :(得分:6)

post_build 部分将运行,即使build部分可能会失败。扩展先前的答案,您可以在CODEBUILD_BUILD_SUCCEEDING文件的post_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

答案 3 :(得分:1)

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

  • 运行bash文件时

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

在构建部分添加这个

build:
     on-failure: ABORT