@@ -12,12 +12,12 @@ permissions:
1212 contents : read
1313
1414jobs :
15- # 'build-and-deploy' 라는 이름의 작업 정의
16- build-and-deploy :
17- # 이 작업은 GitHub가 제공하는 최신 Ubuntu 가상머신에서 실행
15+ # 빌드 및 테스트 작업 (항상 실행)
16+ build :
1817 runs-on : ubuntu-latest
18+ outputs :
19+ build-success : ${{ steps.build-status.outputs.success }}
1920
20- # 작업 내에서 실행될 단계들
2121 steps :
2222 # 1. 소스 코드 체크아웃
2323 - name : Checkout Source Code
3535 run : chmod +x ./gradlew
3636
3737 # 4. Gradle로 빌드 및 단위 테스트 실행
38- # 'build' 명령어는 'test' 작업을 포함하므로, 단위 테스트가 자동으로 실행됩니다.
3938 - name : Build with Gradle
4039 run : ./gradlew build
4140 env :
@@ -50,31 +49,95 @@ jobs:
5049 R2_ACCESS_KEY : ${{ secrets.R2_ACCESS_KEY }}
5150 R2_SECRET_KEY : ${{ secrets.R2_SECRET_KEY }}
5251
53- # 5. AWS 자격 증명 설정 (OIDC 방식)
52+ # 5. 빌드 성공 상태 설정
53+ - name : Set build success status
54+ id : build-status
55+ run : echo "success=true" >> $GITHUB_OUTPUT
56+
57+ # EC2 상태 확인 작업
58+ check-ec2 :
59+ runs-on : ubuntu-latest
60+ needs : build
61+ outputs :
62+ ec2-available : ${{ steps.check-ec2-status.outputs.available }}
63+
64+ steps :
65+ # EC2 인스턴스 상태 확인
66+ - name : Check EC2 instance status
67+ id : check-ec2-status
68+ run : |
69+ # EC2에 ping 테스트 (timeout 10초)
70+ if timeout 10 nc -z ${{ secrets.EC2_HOST }} 22 2>/dev/null; then
71+ echo "EC2 instance is reachable"
72+ echo "available=true" >> $GITHUB_OUTPUT
73+ else
74+ echo "EC2 instance is not reachable or stopped"
75+ echo "available=false" >> $GITHUB_OUTPUT
76+ fi
77+ continue-on-error : true
78+
79+ # Docker 이미지 빌드 및 ECR 푸시 (EC2가 사용 가능할 때만)
80+ build-and-push-image :
81+ runs-on : ubuntu-latest
82+ needs : [build, check-ec2]
83+ if : needs.check-ec2.outputs.ec2-available == 'true'
84+ outputs :
85+ image-pushed : ${{ steps.push-status.outputs.success }}
86+
87+ steps :
88+ # 1. 소스 코드 체크아웃
89+ - name : Checkout Source Code
90+ uses : actions/checkout@v4
91+
92+ # 2. AWS 자격 증명 설정 (OIDC 방식)
5493 - name : Configure AWS credentials using OIDC
5594 uses : aws-actions/configure-aws-credentials@v4
5695 with :
5796 role-to-assume : ${{ secrets.AWS_ROLE_TO_ASSUME }}
5897 aws-region : ${{ secrets.AWS_REGION }}
5998
60- # 6 . Amazon ECR에 로그인
99+ # 3 . Amazon ECR에 로그인
61100 - name : Login to Amazon ECR
62101 id : login-ecr
63102 uses : aws-actions/amazon-ecr-login@v2
64103
65- # 7 . Docker 이미지 빌드, 태깅, ECR에 푸시
104+ # 4 . Docker 이미지 빌드, 태깅, ECR에 푸시
66105 - name : Build, tag, and push image to Amazon ECR
67106 id : build-image
68107 env :
69108 ECR_REGISTRY : ${{ steps.login-ecr.outputs.registry }}
70- ECR_REPOSITORY : cp_main_be # 1단계에서 생성한 ECR 리포지토리 이름
71- IMAGE_TAG : ${{ github.sha }} # Git 커밋 해시를 이미지 태그로 사용하여 버전을 관리
109+ ECR_REPOSITORY : cp_main_be
110+ IMAGE_TAG : ${{ github.sha }}
72111 run : |
73112 docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
74113 docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
75114 docker push --all-tags $ECR_REGISTRY/$ECR_REPOSITORY
76115
77- # 8. EC2에 접속하여 배포 스크립트 실행
116+ # 5. 이미지 푸시 성공 상태 설정
117+ - name : Set push success status
118+ id : push-status
119+ run : echo "success=true" >> $GITHUB_OUTPUT
120+
121+ # EC2 배포 작업 (이미지 푸시가 성공했을 때만)
122+ deploy :
123+ runs-on : ubuntu-latest
124+ needs : [build, check-ec2, build-and-push-image]
125+ if : needs.build-and-push-image.outputs.image-pushed == 'true'
126+
127+ steps :
128+ # 1. AWS 자격 증명 설정 (ECR 레지스트리 정보 가져오기 위해)
129+ - name : Configure AWS credentials using OIDC
130+ uses : aws-actions/configure-aws-credentials@v4
131+ with :
132+ role-to-assume : ${{ secrets.AWS_ROLE_TO_ASSUME }}
133+ aws-region : ${{ secrets.AWS_REGION }}
134+
135+ # 2. Amazon ECR에 로그인 (레지스트리 정보 가져오기 위해)
136+ - name : Login to Amazon ECR
137+ id : login-ecr
138+ uses : aws-actions/amazon-ecr-login@v2
139+
140+ # 3. EC2에 접속하여 배포 스크립트 실행
78141 - name : Deploy to EC2 instance
79142 uses : appleboy/ssh-action@master
80143 with :
@@ -117,4 +180,32 @@ jobs:
117180 -e R2_ACCESS_KEY="${{ secrets.R2_ACCESS_KEY }}" \
118181 -e R2_SECRET_KEY="${{ secrets.R2_SECRET_KEY }}" \
119182 $ECR_REGISTRY/$ECR_REPOSITORY:latest
120-
183+
184+ # 워크플로우 실행 결과 요약
185+ summary :
186+ runs-on : ubuntu-latest
187+ needs : [build, check-ec2, build-and-push-image, deploy]
188+ if : always()
189+
190+ steps :
191+ - name : Workflow Summary
192+ run : |
193+ echo "## 워크플로우 실행 결과" >> $GITHUB_STEP_SUMMARY
194+ echo "| 단계 | 상태 |" >> $GITHUB_STEP_SUMMARY
195+ echo "|------|------|" >> $GITHUB_STEP_SUMMARY
196+ echo "| 빌드 및 테스트 | ${{ needs.build.result == 'success' && '✅ 성공' || '❌ 실패' }} |" >> $GITHUB_STEP_SUMMARY
197+ echo "| EC2 상태 확인 | ${{ needs.check-ec2.outputs.ec2-available == 'true' && '✅ 사용 가능' || '⚠️ 사용 불가' }} |" >> $GITHUB_STEP_SUMMARY
198+
199+ if [[ "${{ needs.check-ec2.outputs.ec2-available }}" == "true" ]]; then
200+ echo "| Docker 이미지 빌드/푸시 | ${{ needs.build-and-push-image.result == 'success' && '✅ 성공' || '❌ 실패' }} |" >> $GITHUB_STEP_SUMMARY
201+ echo "| EC2 배포 | ${{ needs.deploy.result == 'success' && '✅ 성공' || '❌ 실패' }} |" >> $GITHUB_STEP_SUMMARY
202+ else
203+ echo "| Docker 이미지 빌드/푸시 | ⏭️ 건너뜀 (EC2 사용 불가) |" >> $GITHUB_STEP_SUMMARY
204+ echo "| EC2 배포 | ⏭️ 건너뜀 (EC2 사용 불가) |" >> $GITHUB_STEP_SUMMARY
205+ fi
206+
207+ echo "" >> $GITHUB_STEP_SUMMARY
208+ if [[ "${{ needs.check-ec2.outputs.ec2-available }}" == "false" ]]; then
209+ echo "💡 **참고**: EC2 인스턴스가 중지되어 있거나 접근할 수 없어서 배포 단계를 건너뛰었습니다." >> $GITHUB_STEP_SUMMARY
210+ echo "빌드와 테스트는 정상적으로 완료되었습니다." >> $GITHUB_STEP_SUMMARY
211+ fi
0 commit comments