CodeDeploy Bitbucket - как выполнить сбой Bitbucket при сбое CodeDeploy

У меня есть успешный конвейер bitbucket, вызывающий aws CodeDeploy, но мне интересно, могу ли я добавить шаг, который будет проверять и ждать успеха CodeDeploy, в противном случае произойдет сбой конвейера. Будет ли это возможно с помощью сценария, который повторяет вызов CodeDeploy, который продолжает отслеживать состояние push-кода CodeDeploy? Есть идеи, как будет называться CodeDeploy?

Bitbucket-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 ответа

Решение

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 или ваш любимый язык сценариев. Добавьте это в конце вашего bitbucket-pipline.yml скрипт. Убедитесь, что вы используете ожидание между вызовами CodeDeploy для проверки статуса.

# 2 (возможно) Использование BitBucket AWS CodeDeploy напрямую

BitBucket напрямую интегрируется с AWS CodeDeploy, поэтому вы можете использовать их интеграцию, а не сценарий для правильной интеграции. Я не знаю, поддерживается ли это или нет.

В 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
Другие вопросы по тегам