Skip to content

Commit 8298bc5

Browse files
authored
[#38] GitHub Actions를 이용한 배포 자동화 파이프라인 구성 (#56)
* Feat: 각 서비스 컨테이너화를 위한 Dockerfile 추가 * Feat: GitHub Actions 워크플로우 파일 추가 * Chore: github-actions.yml 브랜치 범위에 main 추가
1 parent 13d397d commit 8298bc5

10 files changed

Lines changed: 198 additions & 0 deletions

File tree

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
name: CI/CD with github actions & docker
2+
3+
on:
4+
push:
5+
branches: [ "develop", "main" ]
6+
7+
jobs:
8+
build-and-deploy:
9+
name: Build
10+
runs-on: ubuntu-latest
11+
strategy:
12+
matrix:
13+
service:
14+
- name: "eureka"
15+
folder: "com.bkmarriott.eureka"
16+
- name: "gateway"
17+
folder: "com.bkmarriott.gateway"
18+
- name: "auth"
19+
folder: "com.bkmarriott.auth"
20+
- name: "coupon"
21+
folder: "com.bkmarriott.coupon"
22+
- name: "charge"
23+
folder: "com.bkmarriott.charge"
24+
- name: "promotion"
25+
folder: "com.bkmarriott.promotion"
26+
- name: "hotel"
27+
folder: "com.bkmarriott.hotel"
28+
- name: "reservation"
29+
folder: "com.bkmarriott.reservation"
30+
- name: "payment"
31+
folder: "com.bkmarriott.payment"
32+
33+
steps:
34+
- name: Checkout
35+
uses: actions/checkout@v4
36+
with:
37+
fetch-depth: 2
38+
39+
- name: Detect Changed Services
40+
id: detect_changes
41+
run: |
42+
CHANGED_FILES=$(git diff --name-only HEAD^ HEAD)
43+
echo "Changed files: $CHANGED_FILES"
44+
45+
SERVICES_TO_BUILD=""
46+
47+
for CHANGED_FILE in $CHANGED_FILES; do
48+
FOLDER=$(echo "$CHANGED_FILE" | sed 's/\/.*//')
49+
50+
if [[ ! "$SERVICES_TO_BUILD" =~ "$FOLDER" ]]; then
51+
SERVICES_TO_BUILD="$SERVICES_TO_BUILD $FOLDER"
52+
fi
53+
done
54+
55+
echo "Folders to build: $SERVICES_TO_BUILD"
56+
echo "services_to_build=$SERVICES_TO_BUILD" >> $GITHUB_ENV
57+
58+
- name: Skip Unchanged Services
59+
if: ${{ !contains(env.services_to_build, matrix.service.folder) }}
60+
run: |
61+
echo "Skipping service: ${{ matrix.service.name }}"
62+
exit 0
63+
64+
- name: Set up JDK 17
65+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
66+
uses: actions/setup-java@v4
67+
with:
68+
java-version: '17'
69+
distribution: 'temurin'
70+
71+
- name: Inject application.yml
72+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
73+
run: |
74+
if [ "${{ matrix.service.name }}" == "eureka" ]; then
75+
echo "${{ secrets.EUREKA_SERVER_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
76+
elif [ "${{ matrix.service.name }}" == "auth" ]; then
77+
echo "${{ secrets.AUTH_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
78+
elif [ "${{ matrix.service.name }}" == "charge" ]; then
79+
echo "${{ secrets.CHARGE_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
80+
elif [ "${{ matrix.service.name }}" == "coupon" ]; then
81+
echo "${{ secrets.COUPON_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
82+
elif [ "${{ matrix.service.name }}" == "gateway" ]; then
83+
echo "${{ secrets.GATEWAY_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
84+
elif [ "${{ matrix.service.name }}" == "hotel" ]; then
85+
echo "${{ secrets.HOTEL_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
86+
elif [ "${{ matrix.service.name }}" == "promotion" ]; then
87+
echo "${{ secrets.PROMOTION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
88+
elif [ "${{ matrix.service.name }}" == "reservation" ]; then
89+
echo "${{ secrets.RESERVATION_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
90+
elif [ "${{ matrix.service.name }}" == "payment" ]; then
91+
echo "${{ secrets.PAYMENT_APPLICATION_DEV_YML }}" > ${{ matrix.service.folder }}/src/main/resources/application-dev.yml
92+
fi
93+
94+
- name: Build with Gradle
95+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
96+
run: |
97+
cd ${{ matrix.service.folder }}
98+
chmod +x gradlew
99+
./gradlew clean
100+
./gradlew build -x test --no-daemon
101+
102+
- name: Build Docker Image
103+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
104+
env:
105+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
106+
run: |
107+
cd ${{ matrix.service.folder }}
108+
docker buildx build -t $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest .
109+
110+
- name: Push Docker Image
111+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
112+
env:
113+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
114+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
115+
run: |
116+
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
117+
docker push $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
118+
119+
- name: Deploy Docker Image to EC2
120+
if: ${{ contains(env.services_to_build, matrix.service.folder) }}
121+
env:
122+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
123+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
124+
EC2_SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
125+
EC2_INSTANCE_IP: ${{ secrets.EC2_INSTANCE_IP }}
126+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
127+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
128+
run: |
129+
# Set up SSH Key for EC2 instance
130+
echo "$EC2_SSH_PRIVATE_KEY" > private_key.pem
131+
chmod 600 private_key.pem
132+
133+
case ${{ matrix.service.name }} in
134+
"eureka")
135+
SERVICE_PORT=${{ secrets.EUREKA_PORT }}
136+
;;
137+
"gateway")
138+
SERVICE_PORT=${{ secrets.GATEWAY_PORT }}
139+
;;
140+
"auth")
141+
SERVICE_PORT=${{ secrets.AUTH_PORT }}
142+
;;
143+
"coupon")
144+
SERVICE_PORT=${{ secrets.COUPON_PORT }}
145+
;;
146+
"charge")
147+
SERVICE_PORT=${{ secrets.CHARGE_PORT }}
148+
;;
149+
"promotion")
150+
SERVICE_PORT=${{ secrets.PROMOTION_PORT }}
151+
;;
152+
"hotel")
153+
SERVICE_PORT=${{ secrets.HOTEL_PORT }}
154+
;;
155+
"reservation")
156+
SERVICE_PORT=${{ secrets.RESERVATION_PORT }}
157+
;;
158+
"payment")
159+
SERVICE_PORT=${{ secrets.PAYMENT_PORT }}
160+
;;
161+
esac
162+
163+
# SSH into EC2 and debug Docker variables
164+
ssh -i private_key.pem -o StrictHostKeyChecking=no ubuntu@$EC2_INSTANCE_IP << EOF
165+
echo "Using Docker image: $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest"
166+
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
167+
sudo docker stop ${{ matrix.service.name }}
168+
sudo docker rm ${{ matrix.service.name }}
169+
sudo docker pull $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
170+
sudo docker run -d --name ${{ matrix.service.name }} -p $SERVICE_PORT:$SERVICE_PORT $DOCKER_USERNAME/bkmarriott-${{ matrix.service.name }}:latest
171+
EOF

com.bkmarriott.auth/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/auth-0.0.1.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.charge/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/charge-0.0.1-SNAPSHOT.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.coupon/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/coupon-0.0.1.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.eureka/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/eureka-0.0.1.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.gateway/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/gateway-0.0.1.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.hotel/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/hotel-0.0.1-SNAPSHOT.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

com.bkmarriott.payment/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/payment-0.0.1-SNAPSHOT.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/promotion-0.0.1.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM eclipse-temurin:17-alpine
2+
COPY ./build/libs/reservation-0.0.1-SNAPSHOT.jar app.jar
3+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]

0 commit comments

Comments
 (0)