Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. @task
  2. def deploy():
  3. """
  4. Deploy the project.
  5. """
  6.  
  7. # check stage
  8. require('stage', provided_by=(stage_api, stage_admin,
  9. production_api, production_admin))
  10.  
  11. repo = env.docker_repo
  12. latest_tag = env.docker_tag
  13. prev_latest_tag = 'prev-{0}'.format(latest_tag)
  14. service = env.docker_compose_service
  15.  
  16. with aws_credential():
  17. ecr_login = local('aws ecr get-login', capture=True)
  18.  
  19. # check tags from current commit_id image
  20. commit_id = local('git rev-parse HEAD', capture=True)
  21. with settings(warn_only=True):
  22. image = local('aws ecr describe-images '
  23. '--repository-name {0} '
  24. '--image-ids '
  25. '--query imageDetails[0] '
  26. 'imageTag={1}'.format(repo, commit_id), capture=True)
  27.  
  28. if image.return_code != 0:
  29. return abort("<ECR {0}:{1}> doesn't exist.".format(repo, commit_id))
  30.  
  31. image = json.loads(image)
  32. image_tags = image['imageTags']
  33.  
  34. if latest_tag not in image_tags:
  35. # "latest" image tagged "prev_latest"
  36. manifest = local('aws ecr batch-get-image '
  37. '--repository-name {0} '
  38. '--image-ids imageTag={1} '
  39. '--query images[].imageManifest '
  40. '--output text'.format(repo, latest_tag), capture=True)
  41. if manifest:
  42. with settings(warn_only=True):
  43. local('aws ecr put-image '
  44. '--repository-name {0} '
  45. '--image-tag {1} '
  46. '--image-manifest \'{2}\''.format(repo, prev_latest_tag, manifest))
  47.  
  48. # last image tagged "latest"
  49. commit_id = local('git rev-parse HEAD', capture=True)
  50. manifest = local('aws ecr batch-get-image '
  51. '--repository-name {0} '
  52. '--image-ids imageTag={1} '
  53. '--query images[].imageManifest '
  54. '--output text'.format(repo, commit_id), capture=True)
  55. local('aws ecr put-image '
  56. '--repository-name {0} '
  57. '--image-tag {1} '
  58. '--image-manifest \'{2}\''.format(repo, latest_tag, manifest))
  59.  
  60. migrated = False
  61. for host in env.docker_hosts:
  62. with shell_env(DOCKER_HOST='tcp://{0}'.format(host)):
  63. # docker login to ecr
  64. local(ecr_login)
  65.  
  66. # pull image
  67. local('docker-compose -f {0} pull {1}'.format(env.docker_compose_file, service))
  68.  
  69. # db migration
  70. if env.db_migration and not migrated:
  71. migration_container = '{0}-{1}'.format(repo, env.docker_compose_migration_service)
  72. with settings(warn_only=True):
  73. result = local(
  74. 'docker-compose -f {0} run --name {1} {2} '
  75. '/bin/bash -c "cd {3}; python manage.py db upgrade"'.format(
  76. env.docker_compose_file,
  77. migration_container,
  78. env.docker_compose_migration_service,
  79. env.code_path)
  80. )
  81. local('docker rm {0}'.format(migration_container))
  82. if result.return_code != 0:
  83. return abort("Database migration failed.")
  84. migrated = True
  85.  
  86. # check blue-green
  87. blue_name = '{0}-blue'.format(repo)
  88. green_name = '{0}-green'.format(repo)
  89. with settings(warn_only=True):
  90. exist_blue = local('docker-compose '
  91. '-f {0} '
  92. 'ps | grep {1}.*Up'.format(env.docker_compose_file, blue_name),
  93. capture=True)
  94. if exist_blue:
  95. current_container = blue_name
  96. deploy_container = green_name
  97. else:
  98. current_container = green_name
  99. deploy_container = blue_name
  100.  
  101. # run deploy container
  102. local('docker-compose -f {0} run -d --name {1} {2}'.format(env.docker_compose_file,
  103. deploy_container,
  104. service))
  105.  
  106. # stop & remove current container
  107. with settings(warn_only=True):
  108. local('docker stop {0}'.format(current_container))
  109. local('docker rm {0}'.format(current_container))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement