Skip to content

Commit 8e2e0a1

Browse files
committed
deploy: 배포 프로세스 prod, dev 나누기
1 parent d322c41 commit 8e2e0a1

File tree

7 files changed

+510
-0
lines changed

7 files changed

+510
-0
lines changed

.deploy/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM openjdk:11-jdk
2+
3+
# 타임존 설정
4+
ENV TZ=Asia/Seoul
5+
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
6+
7+
ARG CACHEBREAKER=1
8+
ARG JAR_FILE=./build/libs/backend-0.0.1-SNAPSHOT.jar
9+
COPY ${JAR_FILE} app.jar
10+
11+
# 문서를 이미지의 /static/docs 디렉토리에 복사
12+
COPY ./build/docs/asciidoc/*.html /static/docs/
13+
14+
# 애플리케이션 실행 시 -cp 옵션을 사용하여 /static/docs 디렉토리를 클래스패스에 추가
15+
ENTRYPOINT ["java","-cp",".:/static/docs","-jar","/app.jar"]
16+

.deploy/deploy_dev.sh

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
DOCKER_APP_NAME=meetup
2+
DOCKER_USERNAME=modagbul
3+
4+
# 최신 이미지 가져오기
5+
docker pull ${DOCKER_USERNAME}/moing_dev:blue
6+
docker pull ${DOCKER_USERNAME}/moing_dev:green
7+
8+
# 현재 실행 중인 컨테이너를 확인 (blue 또는 green)
9+
EXIST_BLUE=$(docker ps --filter name=${DOCKER_APP_NAME}-blue --filter status=running -q)
10+
EXIST_GREEN=$(docker ps --filter name=${DOCKER_APP_NAME}-green --filter status=running -q)
11+
12+
# 둘 다 실행 중이지 않을 경우 blue 실행
13+
if [ -z "$EXIST_BLUE" ] && [ -z "$EXIST_GREEN" ]; then
14+
echo "No containers running. Starting blue up"
15+
16+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
17+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-blue -q)" ]; then
18+
docker rm ${DOCKER_APP_NAME}-blue
19+
fi
20+
21+
docker run -d --name ${DOCKER_APP_NAME}-blue -p 8081:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_dev:blue
22+
BEFORE_COMPOSE_COLOR="green"
23+
AFTER_COMPOSE_COLOR="blue"
24+
elif [ -z "$EXIST_BLUE" ]; then
25+
echo "blue up"
26+
27+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
28+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-blue -q)" ]; then
29+
docker rm ${DOCKER_APP_NAME}-blue
30+
fi
31+
32+
docker run -d --name ${DOCKER_APP_NAME}-blue -p 8081:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_dev:blue
33+
BEFORE_COMPOSE_COLOR="green"
34+
AFTER_COMPOSE_COLOR="blue"
35+
else
36+
echo "green up"
37+
38+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
39+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-green -q)" ]; then
40+
docker rm ${DOCKER_APP_NAME}-green
41+
fi
42+
43+
docker run -d --name ${DOCKER_APP_NAME}-green -p 8082:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_dev:green
44+
BEFORE_COMPOSE_COLOR="blue"
45+
AFTER_COMPOSE_COLOR="green"
46+
fi
47+
48+
49+
sleep 40
50+
51+
# 새로운 컨테이너가 제대로 실행되었는지 확인
52+
EXIST_AFTER=$(docker ps --filter name=${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} --filter status=running -q)
53+
if [ -n "$EXIST_AFTER" ]; then
54+
# nginx.config를 컨테이너에 맞게 변경해주고 reload 한다
55+
cp ./nginx.${AFTER_COMPOSE_COLOR}.conf /etc/nginx/nginx.conf
56+
sudo nginx -s reload
57+
58+
# 이전 컨테이너 종료
59+
docker stop ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR}
60+
docker rm ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR}
61+
echo "$BEFORE_COMPOSE_COLOR down"
62+
else
63+
# Docker logs
64+
LOGS=$(docker logs ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} 2>&1)
65+
echo "Error: ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} failed to start."
66+
echo "$LOGS"
67+
fi

.deploy/deploy_prod.sh

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
DOCKER_APP_NAME=meetup
2+
DOCKER_USERNAME=modagbul
3+
4+
# 최신 이미지 가져오기
5+
docker pull ${DOCKER_USERNAME}/moing_prod:blue
6+
docker pull ${DOCKER_USERNAME}/moing_prod:green
7+
8+
# 현재 실행 중인 컨테이너를 확인 (blue 또는 green)
9+
EXIST_BLUE=$(docker ps --filter name=${DOCKER_APP_NAME}-blue --filter status=running -q)
10+
EXIST_GREEN=$(docker ps --filter name=${DOCKER_APP_NAME}-green --filter status=running -q)
11+
12+
# 둘 다 실행 중이지 않을 경우 blue 실행
13+
if [ -z "$EXIST_BLUE" ] && [ -z "$EXIST_GREEN" ]; then
14+
echo "No containers running. Starting blue up"
15+
16+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
17+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-blue -q)" ]; then
18+
docker rm ${DOCKER_APP_NAME}-blue
19+
fi
20+
21+
docker run -d --name ${DOCKER_APP_NAME}-blue -p 8081:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_prod:blue
22+
BEFORE_COMPOSE_COLOR="green"
23+
AFTER_COMPOSE_COLOR="blue"
24+
elif [ -z "$EXIST_BLUE" ]; then
25+
echo "blue up"
26+
27+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
28+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-blue -q)" ]; then
29+
docker rm ${DOCKER_APP_NAME}-blue
30+
fi
31+
32+
docker run -d --name ${DOCKER_APP_NAME}-blue -p 8081:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_prod:blue
33+
BEFORE_COMPOSE_COLOR="green"
34+
AFTER_COMPOSE_COLOR="blue"
35+
else
36+
echo "green up"
37+
38+
# 만약 컨테이너가 중지된 상태로 존재하면 삭제한다.
39+
if [ "$(docker ps -a --filter name=${DOCKER_APP_NAME}-green -q)" ]; then
40+
docker rm ${DOCKER_APP_NAME}-green
41+
fi
42+
43+
docker run -d --name ${DOCKER_APP_NAME}-green -p 8082:8080 -e TZ=Asia/Seoul ${DOCKER_USERNAME}/moing_prod:green
44+
BEFORE_COMPOSE_COLOR="blue"
45+
AFTER_COMPOSE_COLOR="green"
46+
fi
47+
48+
49+
sleep 40
50+
51+
# 새로운 컨테이너가 제대로 실행되었는지 확인
52+
EXIST_AFTER=$(docker ps --filter name=${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} --filter status=running -q)
53+
if [ -n "$EXIST_AFTER" ]; then
54+
# nginx.config를 컨테이너에 맞게 변경해주고 reload 한다
55+
cp ./nginx.${AFTER_COMPOSE_COLOR}.conf /etc/nginx/nginx.conf
56+
sudo nginx -s reload
57+
58+
# 이전 컨테이너 종료
59+
docker stop ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR}
60+
docker rm ${DOCKER_APP_NAME}-${BEFORE_COMPOSE_COLOR}
61+
echo "$BEFORE_COMPOSE_COLOR down"
62+
else
63+
# Docker logs
64+
LOGS=$(docker logs ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} 2>&1)
65+
echo "Error: ${DOCKER_APP_NAME}-${AFTER_COMPOSE_COLOR} failed to start."
66+
echo "$LOGS"
67+
fi

.github/workflows/CD-dev.yml

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
name: CD-dev
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
7+
permissions:
8+
contents: read
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
env:
14+
working-directory: ./
15+
APPLICATION: ${{ secrets.APPLICATION_DEV }}
16+
GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_DEV }}
17+
APPLE_KEY: ${{ secrets.APPLE_KEY_DEV }}
18+
19+
steps:
20+
# 소스 코드 체크아웃
21+
- uses: actions/checkout@v2
22+
23+
# JDK 11 설정
24+
- name: Set up JDK 11
25+
uses: actions/setup-java@v2
26+
with:
27+
java-version: '11'
28+
distribution: 'adopt'
29+
30+
# Gradle 패키지 캐시
31+
- name: Cache Gradle packages
32+
uses: actions/cache@v2
33+
with:
34+
path: |
35+
~/.gradle/caches
36+
~/.gradle/wrapper
37+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
38+
restore-keys: |
39+
${{ runner.os }}-gradle-
40+
41+
# 설정 파일 생성
42+
- run: |
43+
mkdir ./src/main/resources
44+
cd ./src/main/resources
45+
touch ./application.yml
46+
echo "${{env.APPLICATION}}" > ./application.yml
47+
touch ./firebase-key.json
48+
echo "${{env.GOOGLE_APPLICATION_CREDENTIALS}}" | base64 --decode > ./firebase-key.json
49+
touch ./apple-key.p8
50+
echo "${{env.APPLE_KEY}}" > ./apple-key.p8
51+
52+
# 설정 파일을 작업공간에 저장
53+
- uses: actions/upload-artifact@v2
54+
with:
55+
name: application.yml
56+
path: ./src/main/resources/application.yml
57+
58+
- uses: actions/upload-artifact@v2
59+
with:
60+
name: firebase-key.json
61+
path: ./src/main/resources/firebase-key.json
62+
63+
- uses: actions/upload-artifact@v2
64+
with:
65+
name: apple-key.p8
66+
path: ./src/main/resources/apple-key.p8
67+
68+
# gradlew 권한 설정
69+
- name: Grant execute permission for gradlew
70+
run: chmod +x gradlew
71+
working-directory: ${{ env.working-directory }}
72+
73+
# Gradle로 빌드
74+
- name: Build with Gradle
75+
run: ./gradlew build
76+
working-directory: ${{ env.working-directory }}
77+
78+
# Gradle 캐시 정리
79+
- name: Cleanup Gradle Cache
80+
if: ${{ always() }}
81+
run: |
82+
rm -f ~/.gradle/caches/modules-2/modules-2.lock
83+
rm -f ~/.gradle/caches/modules-2/gc.properties
84+
85+
# Docker 이미지 빌드 및 푸시
86+
- name: Docker build
87+
run: |
88+
docker build --no-cache -f ./.deploy/Dockerfile -t ${{ secrets.DOCKER_USERNAME_DEV }}/moing_dev:green .
89+
docker build --no-cache -f ./.deploy/Dockerfile -t ${{ secrets.DOCKER_USERNAME_DEV }}/moing_dev:blue .
90+
91+
92+
- name: Docker Hub Login
93+
uses: docker/login-action@v1
94+
with:
95+
username: ${{ secrets.DOCKER_USERNAME_DEV }}
96+
password: ${{ secrets.DOCKER_PASSWORD_DEV }}
97+
98+
- name: Docker push
99+
run: |
100+
docker push ${{ secrets.DOCKER_USERNAME_DEV }}/moing_dev:green
101+
docker push ${{ secrets.DOCKER_USERNAME_DEV }}/moing_dev:blue
102+
103+
# EC2로 deploy.sh 전송
104+
- name: Deploy deploy.sh to EC2
105+
uses: appleboy/scp-action@master
106+
with:
107+
host: ${{ secrets.EC2_SERVER_HOST_DEV }}
108+
username: ec2-user
109+
key: ${{ secrets.PRIVATE_KEY_DEV }}
110+
source: "./.deploy/deploy_dev.sh"
111+
target: "/home/ec2-user/"
112+
113+
# 배포 스크립트 실행
114+
- name: Deploy on EC2
115+
uses: appleboy/ssh-action@master
116+
with:
117+
host: ${{ secrets.EC2_SERVER_HOST_DEV }}
118+
username: ec2-user
119+
key: ${{ secrets.PRIVATE_KEY_DEV }}
120+
envs: GITHUB_SHA
121+
script: |
122+
chmod +x /home/ec2-user/deploy_dev.sh
123+
/home/ec2-user/deploy_dev.sh

0 commit comments

Comments
 (0)