@@ -8,19 +8,23 @@ permissions:
88 contents : read
99
1010jobs :
11- # 1️⃣ BUILD JOB: 빌드 및 ECR 이미지 업로드
1211 build :
1312 runs-on : ubuntu-latest
1413 steps :
1514 - uses : actions/checkout@v4
1615
17- - uses : images/setup-java@v4
16+ # ✅ 수정: actions/setup-java 사용 및 with 위치 교정
17+ - name : Set up JDK 17
18+ uses : actions/setup-java@v4
1819 with :
19- distribution : temurin
20- java-version : 17
20+ java-version : ' 17'
21+ distribution : ' temurin'
22+ cache : gradle # 빌드 속도 향상을 위한 캐싱 추가
2123
22- - name : Create application-prod.yml
23- run : echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
24+ - name : Create application.yml
25+ run : |
26+ mkdir -p ./src/main/resources
27+ echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
2428
2529 - name : Build Spring Boot
2630 run : |
@@ -35,17 +39,15 @@ jobs:
3539 aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
3640
3741 - name : Login to ECR
38- run : |
39- aws ecr get-login-password --region ap-northeast-2 \
40- | docker login --username AWS --password-stdin 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com
42+ id : login-ecr
43+ uses : aws-actions/amazon-ecr-login@v2
4144
4245 - name : Build & Push Docker Image
4346 run : |
4447 docker build -t forday .
4548 docker tag forday:latest 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
4649 docker push 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
4750
48- # 2️⃣ DEPLOY JOB: Public EC2에 직접 접속하여 배포
4951 deploy :
5052 needs : build
5153 runs-on : ubuntu-latest
5557 mkdir -p ~/.ssh
5658 echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
5759 chmod 600 ~/.ssh/id_rsa
58-
59- # 별칭(Alias)을 'ec2-server'로 설정하여 접속 간소화
6060 cat <<EOF >> ~/.ssh/config
6161 Host ec2-server
6262 HostName ${{ secrets.EC2_PUBLIC_IP }}
@@ -70,14 +70,17 @@ jobs:
7070 ssh ec2-server << 'EOF'
7171 set -e
7272
73+ # ✅ 추가: EC2에 AWS CLI가 설치되어 있어야 함
74+ # ECR 로그인을 위해 AWS 자격 증명이 EC2에도 설정되어 있거나 IAM Role이 부여되어야 합니다.
75+ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com
76+
7377 echo "▶ Nginx 환경 설정 확인"
74- if [ -f /etc/nginx/conf.d/service-env.inc ]; then
75- CURRENT_VAL=$(grep -oP '(?<=set \$service_url ).*(?=;)' /etc/nginx/conf.d/service-env.inc || echo "blue")
76- else
77- CURRENT_VAL="blue"
78+ # 파일이 없으면 생성
79+ if [ ! -f /etc/nginx/conf.d/service-env.inc ]; then
80+ echo "set \$service_url blue;" | sudo tee /etc/nginx/conf.d/service-env.inc
7881 fi
79-
80- echo "현재 서비스 위치: $CURRENT_VAL"
82+
83+ CURRENT_VAL=$(grep -oP '(?<=set \$service_url ).*(?=;)' /etc/nginx/conf.d/service-env.inc || echo "blue")
8184
8285 if [ "$CURRENT_VAL" = "blue" ]; then
8386 TARGET="green"
@@ -90,32 +93,22 @@ jobs:
9093 fi
9194
9295 echo "▶ 배포 대상: $TARGET (포트: $TARGET_PORT)"
93-
94- # EC2 내부에서 ECR 로그인
95- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com
96-
97- echo "▶ 최신 이미지 Pull"
9896 docker pull 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
9997
100- echo "▶ $TARGET 컨테이너 초기화"
10198 docker stop $TARGET || true
10299 docker rm $TARGET || true
103100
104- echo "▶ $TARGET 컨테이너 실행"
105101 docker run -d \
106102 --name $TARGET \
107103 --restart=always \
108- -e SPRING_PROFILES_ACTIVE=$TARGET \
109104 -p $TARGET_PORT:8080 \
110- -e SPRING_DATA_REDIS_HOST=172.17.0.1 \
111- -e SPRING_DATA_REDIS_PORT=6379 \
105+ -e SPRING_PROFILES_ACTIVE=prod \
112106 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
113107
114- echo "▶ 헬스 체크 시작 (http://localhost:$TARGET_PORT/health_check)"
115- HEALTH_OK=false
108+ echo "▶ 헬스 체크 시작"
116109 for i in {1..20}; do
110+ # Spring Boot 기본 헬스체크 경로(/actuator/health) 또는 지정하신 경로 확인 필요
117111 if curl -sf http://localhost:$TARGET_PORT/health_check; then
118- echo "✅ 헬스 체크 성공!"
119112 HEALTH_OK=true
120113 break
121114 fi
@@ -124,20 +117,17 @@ jobs:
124117 done
125118
126119 if [ "$HEALTH_OK" != "true" ]; then
127- echo "❌ 헬스 체크 실패. 배포를 중단합니다. "
120+ echo "❌ 헬스 체크 실패"
128121 docker logs $TARGET
129122 exit 1
130123 fi
131124
132- echo "▶ Nginx 스위칭: $TARGET "
125+ echo "▶ Nginx 스위칭"
133126 echo "set \$service_url $TARGET;" | sudo tee /etc/nginx/conf.d/service-env.inc
127+ sudo nginx -t && sudo nginx -s reload
134128
135- sudo nginx -t
136- sudo nginx -s reload
137-
138- echo "▶ 이전 컨테이너($OLD_TARGET) 정리"
129+ echo "▶ 이전 컨테이너 정리 및 미사용 이미지 삭제"
139130 docker stop $OLD_TARGET || true
140131 docker rm $OLD_TARGET || true
141-
142- echo "🚀 배포 완료! 현재 실행 중: $TARGET"
132+ docker image prune -af
143133 EOF
0 commit comments