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