CodeDeploy Bitbucket - 如何在CodeDeploy失败时使Bitbucket失败

时间:2018-02-11 15:57:16

标签: aws-code-deploy bitbucket-pipelines

我有一个成功的bitbucket管道调用aws CodeDeploy,但我想知道我是否可以添加一个将检查并等待CodeDeploy成功的步骤,否则管道失败。这是否可以通过循环通过CodeDeploy调用的脚本继续监视CodeDeploy推送的状态?知道CodeDeploy会调用什么吗?

到位桶-pipline.yml

image: pitech/gradle-awscli

pipelines:
  branches:
develop:
  - step:
      caches:
        - gradle
      script:
        - gradle build bootRepackage
        - mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
        - pip install awscli --upgrade --user
        - aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
        - aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE

appspec.yml

version: 0.0
os: linux
files:
  - source: thejar.jar
    destination: /home/ec2-user/the-server/

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStop:
    - location: scripts/server_stop.sh
      timeout: 60
      runas: ec2-user
  ApplicationStart:
    - location: scripts/server_start.sh
      timeout: 60
      runas: ec2-user
  ValidateService:
    - location: scripts/server_validate.sh
      timeout: 120
      runas: ec2-user

不幸的是,Bitbucket似乎并没有等待ValidateService完成,所以在标记构建成功之前我需要在Bitbucket中确认一下。

2 个答案:

答案 0 :(得分:2)

AWS CLI已经具有deployment-successful方法,该方法每15秒检查一次部署状态。您只需要将create-deployment的输出传递到deployment-successful

在您的特定情况下,它应如下所示:

image: pitech/gradle-awscli

pipelines:
  branches:
develop:
  - step:
      caches:
        - gradle
      script:
        - gradle build bootRepackage
        - mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
        - pip install awscli --upgrade --user
        - aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
        - aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE > deployment.json
        - aws deploy wait deployment-successful --cli-input-json file://deployment.json

答案 1 :(得分:0)

aws deploy create-deployment是一个异步调用,而BitBucket并不知道它需要了解部署的成功与否。将代码添加到CodeDeploy应用程序对BitBucket了解您的部署没有任何影响。

您有一个(可能是两个)选项来解决此问题。

#1包含等待部署完成的脚本

您需要向BitBucket管道添加脚本,以检查要完成的部署状态。您可以使用SNS通知,也可以直接轮询CodeDeploy服务。

伪代码看起来像这样:

loop
    check_if_deployment_complete
    if false, wait and retry
    if true && deployment successful, return 0 (success)
    if true && deployment failed, return non-zero (failure)

您可以使用AWS CLI或您喜欢的脚本语言。在bitbucket-pipline.yml脚本的末尾添加它。确保在调用CodeDeploy之间等待检查状态。

#2(可能)直接使用BitBucket AWS CodeDeploy集成

BitBucket直接与AWS CodeDeploy集成,因此您可以使用它们的集成而不是脚本来正确集成。我不知道这是否得到支持。