Skip to content

Commit 2ea6be7

Browse files
committed
Add automated deployment from master to production
1 parent 97df222 commit 2ea6be7

File tree

2 files changed

+185
-0
lines changed

2 files changed

+185
-0
lines changed

.github/workflows/deploy.yml

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Deploy
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
8+
jobs:
9+
deploy:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v1
13+
- name: Deploy
14+
working-directory: .
15+
env:
16+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
17+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
18+
AWS_DEFAULT_REGION: eu-west-1
19+
GIT_BRANCH: ${{ github.ref }}
20+
run: |
21+
aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
22+
aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
23+
export GIT_BRANCH=${GITHUB_REF##*/}
24+
if [ $GIT_BRANCH == "master" ]; then
25+
./deploy production
26+
fi

deploy

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
AWS_ACCOUNT=314751168214
5+
AWS_REGION=eu-west-1
6+
AWS_ECR_URL="$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com"
7+
8+
AWS_ECS_SERVICE=demo-starlink
9+
10+
AWS_WEB_ECR=memgraph/demo-starlink-web
11+
AWS_WEB_DOCKERFILE=web_app
12+
13+
AWS_SIMULATOR_ECR=memgraph/demo-starlink-simulator
14+
AWS_SIMULATOR_DOCKERFILE=simulator
15+
16+
AWS_ECS_SERVICE_TAG_PRODUCTION=master
17+
AWS_ECS_CLUSTER_PRODUCTION=production
18+
19+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
20+
21+
function print_help () {
22+
echo "Usage: $0 ENVIRONMENT"
23+
echo -e "Build and Deploy Starlink demo application.\n"
24+
echo "Required argument ENVIRONMENT:"
25+
echo -e " production\tDeploy on production"
26+
echo -e " staging \tDeploy on staging"
27+
echo "Optional arguments:"
28+
echo -e " -h\t\tDisplay this help and exit"
29+
echo ""
30+
}
31+
32+
function build () {
33+
IMAGE_NAME=$1
34+
DOCKERFILE_PATH=$2
35+
36+
echo "[Docker]: Building project $IMAGE_NAME..."
37+
docker build -t "${IMAGE_NAME}" "${DOCKERFILE_PATH}"
38+
}
39+
40+
function aws_login () {
41+
if [ -z ${AWS_PROFILE:-} ]; then
42+
AWS_PROFILE=default
43+
echo "[Config]: AWS_PROFILE not set. Setting to value 'default'"
44+
fi
45+
46+
echo "[Config]: Set AWS_REGION=$AWS_REGION"
47+
aws configure set region $AWS_REGION
48+
49+
echo "[AWS]: Logging in to ECR Repository with profile $AWS_PROFILE..."
50+
$(aws ecr get-login --no-include-email --profile $AWS_PROFILE)
51+
}
52+
53+
function aws_push () {
54+
IMAGE_NAME=$1
55+
56+
AWS_ECR_IMAGE_BRANCH="$AWS_ECR_URL/$IMAGE_NAME:$GIT_BRANCH"
57+
AWS_ECR_IMAGE_COMMIT="$AWS_ECR_URL/$IMAGE_NAME:$GIT_COMMIT"
58+
59+
echo "[Docker]: Tagging image $IMAGE_NAME with remote tag $AWS_ECR_IMAGE_BRANCH"
60+
docker tag $IMAGE_NAME $AWS_ECR_IMAGE_BRANCH
61+
echo "[AWS]: Pushing image $AWS_ECR_IMAGE_BRANCH to ECR Repository"
62+
docker push $AWS_ECR_IMAGE_BRANCH
63+
64+
echo "[Docker]: Tagging image $IMAGE_NAME with remote tag $AWS_ECR_IMAGE_COMMIT"
65+
docker tag $IMAGE_NAME $AWS_ECR_IMAGE_COMMIT
66+
echo "[AWS]: Pushing image $AWS_ECR_IMAGE_COMMIT to ECR Repository"
67+
docker push $AWS_ECR_IMAGE_COMMIT
68+
69+
while true; do
70+
echo "[AWS]: Waiting for docker image confirmation from ECR..."
71+
sleep 2
72+
JSON_RES=$(aws ecr describe-images \
73+
--repository-name ${IMAGE_NAME} \
74+
--image-ids imageTag=${GIT_BRANCH} || echo '{}')
75+
if [[ $JSON_RES == *${GIT_BRANCH}* ]]; then
76+
echo "[AWS]: Docker image is available on ECR!"
77+
break
78+
fi
79+
done
80+
}
81+
82+
function git_check () {
83+
EXPECTED_GIT_BRANCH=$1
84+
85+
if [ -z ${GIT_BRANCH:-} ]; then
86+
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
87+
echo "[Config]: GIT_BRANCH not set. Setting to value '${GIT_BRANCH}'"
88+
else
89+
echo "[Config]: GIT_BRANCH already set to value '${GIT_BRANCH}'"
90+
fi
91+
92+
GIT_COMMIT=$(git rev-parse HEAD)
93+
echo "[Config]: GIT_BRANCH=$GIT_BRANCH"
94+
echo "[Config]: GIT_COMMIT=$GIT_COMMIT"
95+
96+
if [ ${GIT_BRANCH} != ${EXPECTED_GIT_BRANCH} ]; then
97+
echo -e "\n[AWS] Warning: Deploy is skipped because branch '${GIT_BRANCH}' is not equal to branch '${EXPECTED_GIT_BRANCH}'"
98+
echo " Run deploy in two ways:"
99+
echo " 1) Apply changes to branch '${EXPECTED_GIT_BRANCH}' and deploy from it"
100+
echo " 1) Set env var GIT_BRANCH=${EXPECTED_GIT_BRANCH} and run deploy script from custom branch"
101+
echo ""
102+
exit 1
103+
fi
104+
}
105+
106+
function aws_deploy () {
107+
AWS_ECS_CLUSTER=$1
108+
109+
echo "[AWS]: Deploying service $AWS_ECS_SERVICE in cluster $AWS_ECS_CLUSTER..."
110+
JSON_RES=$(aws ecs update-service \
111+
--cluster $AWS_ECS_CLUSTER \
112+
--service $AWS_ECS_SERVICE \
113+
--force-new-deployment)
114+
115+
CONT_STABLE_EVENT_COUNT=0
116+
117+
for _ in {1..150}; do
118+
sleep 2
119+
LAST_LIVE_EVENT=$(aws ecs describe-services --services $AWS_ECS_SERVICE --cluster $AWS_ECS_CLUSTER | jq .services[].events[0].message -r)
120+
echo "[AWS]: ECS event: $LAST_LIVE_EVENT"
121+
if [[ $LAST_LIVE_EVENT == *'has reached a steady state'* ]]; then
122+
echo "[AWS]: Service ${AWS_ECS_SERVICE} is stable and running"
123+
CONT_STABLE_EVENT_COUNT=$(( $CONT_STABLE_EVENT_COUNT + 1 ))
124+
if [[ $CONT_STABLE_EVENT_COUNT -gt 4 ]]; then
125+
break
126+
fi
127+
else
128+
CONT_STABLE_EVENT_COUNT=0
129+
fi
130+
done
131+
}
132+
133+
if test "$#" -ne 1; then
134+
# Illegal number of parameters
135+
print_help
136+
exit 1
137+
else
138+
case "$1" in
139+
-h)
140+
print_help
141+
exit 0
142+
;;
143+
production)
144+
git_check "${AWS_ECS_SERVICE_TAG_PRODUCTION}"
145+
build "${AWS_WEB_ECR}" "${AWS_WEB_DOCKERFILE}"
146+
build "${AWS_SIMULATOR_ECR}" "${AWS_SIMULATOR_DOCKERFILE}"
147+
aws_login
148+
aws_push "${AWS_WEB_ECR}"
149+
aws_push "${AWS_SIMULATOR_ECR}"
150+
aws_deploy "${AWS_ECS_CLUSTER_PRODUCTION}"
151+
exit 0
152+
;;
153+
*)
154+
# Unknown option
155+
print_help
156+
exit 1
157+
;;
158+
esac
159+
fi

0 commit comments

Comments
 (0)