-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·134 lines (115 loc) · 5.02 KB
/
deploy.sh
File metadata and controls
executable file
·134 lines (115 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#! /bin/bash
set -e
SHA1=$1
DATE=$(date +"%Y-%m-%d-%H-%M-%S")
VERSION="$DATE-$SHA1"
echo "Version: $VERSION"
echo "Bulding docker image..."
docker build --rm=false -t 772663561820.dkr.ecr.eu-west-1.amazonaws.com/geolog:$VERSION src/back
echo "Build docker image"
echo "Logging into docker..."
$(aws ecr get-login --region eu-west-1)
echo "Logged into docker"
docker push 772663561820.dkr.ecr.eu-west-1.amazonaws.com/geolog:$VERSION
echo "Creating new EB version..."
EB_BUCKET=deploy.geolog.co
DOCKERRUN_FILE=$VERSION-Dockerrun.aws.json
sed "s/<TAG>/$VERSION/" < Dockerrun.aws.json.template > $DOCKERRUN_FILE
aws s3 cp $DOCKERRUN_FILE s3://$EB_BUCKET/$DOCKERRUN_FILE --region eu-west-1
aws elasticbeanstalk create-application-version --application-name geolog \
--version-label $VERSION --source-bundle S3Bucket=$EB_BUCKET,S3Key=$DOCKERRUN_FILE \
--region eu-west-1
echo "Created new EB version"
# Get current certification
echo "Fetching environments..."
LOAD_BALANCER_BLUE=$(aws elasticbeanstalk describe-environment-resources --environment-name geolog-blue --region eu-west-1 | jq '.EnvironmentResources | .LoadBalancers | .[0] | .Name' | sed "s/\"//g")
LOAD_BALANCER_BLUE_DETAILS=$(aws elb describe-load-balancers --load-balancer-names $LOAD_BALANCER_BLUE --region eu-west-1 | jq '.LoadBalancerDescriptions | .[0]')
LOAD_BALANCER_BLUE_ZONE_NAME=$(echo $LOAD_BALANCER_BLUE_DETAILS | jq '.CanonicalHostedZoneName' | sed "s/\"//g" | tr '[:upper:]' '[:lower:]').
LOAD_BALANCER_BLUE_ZONE_ID=$(echo $LOAD_BALANCER_BLUE_DETAILS | jq '.CanonicalHostedZoneNameID' | sed "s/\"//g")
echo "Found blue"
LOAD_BALANCER_GREEN=$(aws elasticbeanstalk describe-environment-resources --environment-name geolog-green --region eu-west-1 | jq '.EnvironmentResources | .LoadBalancers | .[0] | .Name' | sed "s/\"//g")
LOAD_BALANCER_GREEN_DETAILS=$(aws elb describe-load-balancers --load-balancer-names $LOAD_BALANCER_GREEN --region eu-west-1 | jq '.LoadBalancerDescriptions | .[0]')
LOAD_BALANCER_GREEN_ZONE_NAME=$(echo $LOAD_BALANCER_GREEN_DETAILS | jq '.CanonicalHostedZoneName' | sed "s/\"//g" | tr '[:upper:]' '[:lower:]').
LOAD_BALANCER_GREEN_ZONE_ID=$(echo $LOAD_BALANCER_GREEN_DETAILS | jq '.CanonicalHostedZoneNameID' | sed "s/\"//g")
echo "Found green"
echo "Finding production environment..."
ZONE_ID=$(aws route53 list-hosted-zones | jq '.HostedZones | map(select(.Name == "geolog.co.")) | .[0] | .Id' | sed "s/\"//g")
RECORDS=$(aws route53 list-resource-record-sets --hosted-zone-id $ZONE_ID)
PRODUCTION_NAME=$(echo $RECORDS | jq '.ResourceRecordSets | .[0] | .AliasTarget | .DNSName' | sed "s/\"//g")
if [ $PRODUCTION_NAME == $LOAD_BALANCER_BLUE_ZONE_NAME ]; then
echo "Production: blue"
DEPLOY_ENV="geolog-green"
DEPLOY_ZONE_ID=$LOAD_BALANCER_GREEN_ZONE_ID
DEPLOY_ZONE_NAME=$LOAD_BALANCER_GREEN_ZONE_NAME
CERT_ZONE_ID=$LOAD_BALANCER_BLUE_ZONE_ID
CERT_ZONE_NAME=$LOAD_BALANCER_BLUE_ZONE_NAME
elif [ $PRODUCTION_NAME == $LOAD_BALANCER_GREEN_ZONE_NAME ]; then
echo "Production: green"
DEPLOY_ENV="geolog-blue"
DEPLOY_ZONE_ID=$LOAD_BALANCER_BLUE_ZONE_ID
DEPLOY_ZONE_NAME=$LOAD_BALANCER_BLUE_ZONE_NAME
CERT_ZONE_ID=$LOAD_BALANCER_GREEN_ZONE_ID
CERT_ZONE_NAME=$LOAD_BALANCER_GREEN_ZONE_NAME
else
echo "Unable to find production environment"
exit 1
fi
echo "Certification environment: $DEPLOY_ENV"
# Update Elastic Beanstalk environment to new version
echo "Updating certification environment to new version..."
aws elasticbeanstalk update-environment --application-name geolog --environment-name $DEPLOY_ENV --version-label $VERSION --region eu-west-1
echo "Updated certification environment"
# Wait until ready and healthy
READY=false
while [ ! $READY = true ]
do
echo "Sleeping until status and health ok to swap URLs..."
sleep 10
ENVIRONMENT=$(aws elasticbeanstalk describe-environments --region=eu-west-1 --application-name=geolog --environment-name $DEPLOY_ENV| jq '.Environments | .[0]')
STATUS=$(echo $ENVIRONMENT | jq '.Status' | sed "s/\"//g")
HEALTH=$(echo $ENVIRONMENT | jq '.Health' | sed "s/\"//g")
echo "Status: $STATUS"
echo "Health: $HEALTH"
if [ "$STATUS" = "Ready" ] && [ "$HEALTH" = "Green" ]; then
READY=true
fi
done
echo "Publishing static assets..."
./node_modules/.bin/gulp front-assets-deploy-production
echo "Published"
echo "Swapping domains..."
CHANGES=$(cat <<EOF
{
"Comment": "Deploy",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "geolog.co.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "$DEPLOY_ZONE_ID",
"DNSName": "$DEPLOY_ZONE_NAME",
"EvaluateTargetHealth": false
}
}
},
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "certification.geolog.co.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "$CERT_ZONE_ID",
"DNSName": "$CERT_ZONE_NAME",
"EvaluateTargetHealth": false
}
}
}
]
}
EOF)
echo $CHANGES
aws route53 change-resource-record-sets --hosted-zone-id "$ZONE_ID" --change-batch "$CHANGES"
echo "Swapped"
echo "Deployment done"