Skip to content

Commit 6794796

Browse files
authored
[#174] 무중단 배포 적용 (#175)
* refactor: springboot 컨테이너를 blue/green으로 이중화 * refactor: 무중단 배포 스크립트 작성 및 Github Action 명령어 변경 * refactor: 기존의 컨테이너를 삭제하는 명령어 제거 - 무중단 배포 중 db, redis가 재설치되어 SpringBoot도 일시적으로 중단되는 현상 발생
1 parent 8330e6d commit 6794796

File tree

3 files changed

+120
-10
lines changed

3 files changed

+120
-10
lines changed

.github/workflows/deploy-to-dev.yml

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
4444
4545
# 환경 변수 파일 서버로 전달하기(복사 후 붙여넣기)
46-
- name: Send to Environment
46+
- name: Send env file
4747
uses: appleboy/scp-action@master
4848
with:
4949
username: ubuntu
@@ -53,7 +53,7 @@ jobs:
5353
target: "/home/ubuntu"
5454

5555
# 도커 컴포즈 설정 파일 서버로 전달하기(복사 후 붙여넣기)
56-
- name: Send to Docker-Compose
56+
- name: Send docker-compose.yml
5757
uses: appleboy/scp-action@master
5858
with:
5959
username: ubuntu
@@ -63,6 +63,17 @@ jobs:
6363
source: "./docker-compose.yml"
6464
target: "/home/ubuntu/"
6565

66+
# deploy.sh 파일 서버로 전달하기(복사 후 붙여넣기)
67+
- name: Send deploy.sh
68+
uses: appleboy/scp-action@master
69+
with:
70+
username: ubuntu
71+
host: ${{ secrets.EC2_HOST }}
72+
key: ${{ secrets.EC2_PRIVATE_KEY }}
73+
port: 22
74+
source: "./deploy.sh"
75+
target: "/home/ubuntu/"
76+
6677
# 도커 컴포즈 실행하기
6778
# 도커 허브에서 jar파일 및 pull후에 컴포즈 up
6879
- name: Deploy to Dev
@@ -72,8 +83,7 @@ jobs:
7283
host: ${{ secrets.EC2_HOST }}
7384
key: ${{ secrets.EC2_PRIVATE_KEY }}
7485
script: |
75-
sudo docker rm -f $(docker ps -qa)
7686
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
77-
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_NGINX_REPO }}
78-
docker-compose up -d
87+
chmod 777 ./deploy.sh
88+
./deploy.sh
7989
docker image prune -f

deploy.sh

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/bin/bash
2+
3+
if [ $(docker ps | grep -c "db") -eq 0 ]; then
4+
echo "### Starting database ###"
5+
docker-compose up -d db
6+
else
7+
echo "db is already running"
8+
fi
9+
10+
echo
11+
echo
12+
13+
if [ $(docker ps | grep -c "redis") -eq 0 ]; then
14+
echo "### Starting redis ###"
15+
docker-compose up -d redis
16+
else
17+
echo "redis is already running"
18+
fi
19+
20+
APP_NAME=web
21+
22+
IS_GREEN=$(docker ps | grep green) # 현재 실행중인 App이 blue인지 확인
23+
DEFAULT_CONF=" /etc/nginx/nginx.conf"
24+
25+
if [ -z $IS_GREEN ];then # blue라면
26+
27+
echo "### BLUE => GREEN ###"
28+
29+
echo "1. get green image"
30+
docker-compose pull green # 이미지 받아서
31+
32+
echo "2. green container up"
33+
docker-compose up -d green # 컨테이너 실행
34+
35+
while [ 1 = 1 ]; do
36+
echo "3. green health check..."
37+
sleep 3
38+
39+
REQUEST=$(curl http://127.0.0.1:8080) # green으로 request
40+
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
41+
echo "health check success"
42+
break ;
43+
fi
44+
done;
45+
46+
echo "4. reload nginx"
47+
sudo cp /etc/nginx/nginx.green.conf /etc/nginx/nginx.conf
48+
sudo nginx -s rel
49+
50+
echo "5. blue container down"
51+
docker-compose stop blue
52+
else
53+
echo "### GREEN => BLUE ###"
54+
55+
echo "1. get blue image"
56+
docker-compose pull blue
57+
58+
echo "2. blue container up"
59+
docker-compose up -d blue
60+
61+
while [ 1 = 1 ]; do
62+
echo "3. blue health check..."
63+
sleep 3
64+
REQUEST=$(curl http://127.0.0.1:8081) # blue로 request
65+
66+
if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
67+
echo "health check success"
68+
break ;
69+
fi
70+
done;
71+
72+
echo "4. reload nginx"
73+
sudo cp /etc/nginx/nginx.blue.conf /etc/nginx/nginx.conf
74+
sudo nginx -s reload
75+
76+
echo "5. green container down"
77+
docker-compose stop green
78+
fi

docker-compose.yml

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,35 @@ services:
2222
volumes:
2323
- ./data/redis:/data
2424

25-
web:
26-
container_name: web
25+
green:
26+
container_name: green
2727
image: kiseo/kkini
28-
expose:
29-
- 8080
3028
ports:
31-
- 8080:8080
29+
- "8080:8080"
30+
environment:
31+
MY_SERVER: ${MY_SERVER}
32+
AWS_ACCESS_KEY: ${AWS_ACCESS_KEY}
33+
AWS_SECRET_KEY: ${AWS_SECRET_KEY}
34+
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
35+
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
36+
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
37+
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
38+
KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
39+
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
40+
KAKAO_REDIRECT_URI: ${KAKAO_REDIRECT_URI}
41+
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
42+
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
43+
GOOGLE_REDIRECT_URI: ${GOOGLE_REDIRECT_URI}
44+
REDIS_HOST: ${REDIS_HOST}
45+
REDIS_PORT: ${REDIS_PORT}
46+
ACTIVE_PROFILE: ${ACTIVE_PROFILE}
47+
SLACK_WEBHOOK: ${SLACK_WEBHOOK}
48+
49+
blue:
50+
container_name: blue
51+
image: kiseo/kkini
52+
ports:
53+
- "8081:8080"
3254
environment:
3355
MY_SERVER: ${MY_SERVER}
3456
AWS_ACCESS_KEY: ${AWS_ACCESS_KEY}

0 commit comments

Comments
 (0)