· 7 years ago · Mar 20, 2018, 01:18 PM
1import base64
2import json
3
4import docker
5import boto3
6import sys
7
8access_key = 'AKIAII2HDKJB52AXQ5IQ'
9secret_key = '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'
10region = 'eu-west-2'
11td_family = 'petsquare-dev'
12clusters = {
13 'dev': 'default',
14 'test': 'default',
15 'prod': 'petsquare-prod'
16}
17
18
19def process_docker_api_line(payload):
20 for segment in payload.decode("utf-8").split('\n'):
21 line = segment.strip()
22 if line:
23 try:
24 line_payload = json.loads(line)
25 except ValueError as ex:
26 print("Could not decipher payload from API: " + str(ex))
27 continue
28 if line_payload:
29 if "errorDetail" in line_payload:
30 error = line_payload["errorDetail"]
31 sys.stderr.write(error["message"])
32 raise RuntimeError("Error on build - code " + str(error["code"]))
33 elif "stream" in line_payload:
34 sys.stdout.write(line_payload["stream"])
35
36
37def build_and_push_to_ecr():
38 path = '/Users/crookedman/Work/petsquare-python/web'
39 repo = '621275034485.dkr.ecr.eu-west-2.amazonaws.com/petsquare'
40 local_tag = 'petsquare:dev-latest'
41
42 ecr_client = boto3.client('ecr', region_name=region)
43 docker_api = docker.APIClient()
44
45 print("Building image " + local_tag)
46 for line in docker_api.build(path=path, tag=local_tag, stream=True):
47 process_docker_api_line(line)
48
49 auth = ecr_client.get_authorization_token()
50 token = auth["authorizationData"][0]["authorizationToken"]
51 username, password = base64.b64decode(token).decode("utf-8").split(':')
52
53 auth_config_payload = {'username': username, 'password': password}
54
55 version_tag = repo + ':dev-latest'
56
57 print('Tagging version', version_tag)
58 if docker_api.tag(local_tag, version_tag) is False:
59 raise RuntimeError("Tag appeared to fail: " + version_tag)
60
61 print('Pushing to repo', version_tag)
62 for line in docker_api.push(version_tag, stream=True, auth_config=auth_config_payload):
63 process_docker_api_line(line)
64 print('Success!')
65 docker_api.remove_image(version_tag, force=True)
66
67
68def update_task_definition():
69 ecs_client = boto3.client(
70 'ecs',
71 aws_access_key_id=access_key,
72 aws_secret_access_key=secret_key,
73 region_name=region
74 )
75 td_response = ecs_client.list_task_definitions(
76 familyPrefix='petsquare-dev',
77 status='ACTIVE',
78 sort='DESC',
79 )
80 last_td = td_response['taskDefinitionArns'][0].split('/')[-1]
81 ecs_client.register_task_definition(containerDefinitions=[
82 {
83 "portMappings": [
84 {
85 "hostPort": 80,
86 "protocol": "tcp",
87 "containerPort": 81
88 }
89 ],
90 "cpu": 0,
91 "memory": 1024,
92 "image": "621275034485.dkr.ecr.eu-west-2.amazonaws.com/petsquare:dev-latest",
93 "name": "petsquare-dev"
94 }
95 ], family=td_family)
96
97 ecs_client.deregister_task_definition(
98 taskDefinition=last_td
99 )
100
101 task_response = ecs_client.list_tasks(
102 cluster='default',
103 family=td_family,
104 desiredStatus='RUNNING',
105 )
106 for arn in task_response['taskArns']:
107 ecs_client.stop_task(
108 cluster='default',
109 task=arn
110 )
111 ecs_client.run_task(
112 cluster='default',
113 taskDefinition=td_family,
114 count=2
115 )
116
117update_task_definition()