1- # 워크플로우의 이름
21name : Spring Boot CI/CD with AWS
32
4- # 워크플로우가 실행될 조건 정의
53on :
64 push :
75 branches : [ develop ]
86 pull_request :
97 types : [ opened, edited ]
108 branches : [ develop ]
119
12- # PR 생성, 코드 수정, AWS OIDC 토큰 요청을 위한 권한 설정
1310permissions :
1411 id-token : write
1512 contents : write
1613 pull-requests : write
1714 checks : write
1815
1916jobs :
20- # 코드 포맷팅, 빌드, 테스트를 처리하는 Job
2117 build :
2218 runs-on : ubuntu-latest
23- outputs :
24- build-success : ${{ steps.build-status.outputs.success }}
2519
2620 steps :
27- # 1. 소스 코드 체크아웃
2821 - name : Checkout Source Code
2922 uses : actions/checkout@v4
3023
31- # 2. JDK 17 설치
3224 - name : Set up JDK 17
3325 uses : actions/setup-java@v4
3426 with :
3527 java-version : ' 17'
3628 distribution : ' corretto'
3729
38- # === [추가된 부분] PR 템플릿 검사기 ===
30+ # PR 템플릿 검사
3931 - name : Check PR Template
4032 if : github.event_name == 'pull_request' && github.event.pull_request.body == ''
4133 uses : actions/github-script@v7
4234 with :
4335 script : |
4436 const fs = require('fs');
45- # 템플릿 파일이 있는 경로를 정확히 지정해야 합니다.
46- # 예: .github/pr_templates/for_develop.md
4737 const template = fs.readFileSync('.github/pr_templates/for_develop.md', 'utf8');
4838 github.rest.issues.createComment({
4939 owner: context.repo.owner,
5040 repo: context.repo.repo,
5141 issue_number: context.issue.number,
5242 body: `🚨 **PR 본문이 비어있습니다!**\n\n아래 템플릿을 복사하여 PR 내용을 작성해주세요.\n\n---\n\n${template}`
5343 });
54- core.setFailed('PR 본문을 템플릿에 맞게 작성해주세요.');
55- # =======================================
44+ core.setFailed('PR 본문을 템플릿에 맞게 작성해주세요.')
5645
57- # 3. Gradle 캐시 설정
5846 - name : Cache Gradle packages
5947 uses : actions/cache@v3
6048 with :
6553 restore-keys : |
6654 ${{ runner.os }}-gradle-
6755
68- # 4. Gradle 실행 권한 부여
6956 - name : Grant execute permission for gradlew
7057 run : chmod +x ./gradlew
7158
72- # 5. 코드 포맷팅 검사 또는 적용
7359 - name : Check code formatting (PR)
7460 if : github.event_name == 'pull_request'
7561 run : ./gradlew spotlessCheck
7864 if : github.event_name == 'push'
7965 run : ./gradlew spotlessApply
8066
81- # 6. 포맷팅 변경사항으로 PR 생성 (전략 2)
8267 - name : Create Pull Request with formatting changes
8368 if : github.event_name == 'push'
8469 id : create_pr
9681 delete-branch : true
9782 labels : bot, chore
9883
99- # 7. Gradle로 빌드 및 단위 테스트 실행
10084 - name : Build with Gradle
101- if : steps.create_pr.outputs.pull-request-number == ''
85+ run : ./gradlew build --stacktrace --info
10286 env :
10387 R2_ENDPOINT : ${{ secrets.R2_ENDPOINT }}
10488 R2_BUCKET : ${{ secrets.R2_BUCKET }}
@@ -107,30 +91,11 @@ jobs:
10791 JWT_SECRET : ${{ secrets.JWT_SECRET }}
10892 FASTAPI_URL : ${{ secrets.FASTAPI_URL }}
10993 API_TOKEN : ${{ secrets.API_TOKEN }}
110- run : ./gradlew build --stacktrace --info
111-
112- # 8. 테스트 결과 업로드
113- - name : Publish Test Results
114- if : (success() || failure()) && steps.create_pr.outputs.pull-request-number == ''
115- uses : dorny/test-reporter@v1
116- with :
117- name : Gradle Tests
118- path : build/test-results/test/*.xml
119- reporter : java-junit
120-
121- # 9. 빌드 성공 상태 설정
122- - name : Set build success status
123- id : build-status
124- if : success() && steps.create_pr.outputs.pull-request-number == ''
125- run : echo "success=true" >> $GITHUB_OUTPUT
12694
127-
128-
129- # 이하 배포 관련 Job들은 'build' Job의 최종 성공 여부에 따라 실행됩니다.
13095 check-ec2 :
13196 runs-on : ubuntu-latest
13297 needs : build
133- if : github.event_name == 'push' && needs.build.outputs.build-success == 'true'
98+ if : github.event_name == 'push'
13499 outputs :
135100 ec2-available : ${{ steps.check-ec2-status.outputs.available }}
136101 steps :
@@ -146,13 +111,10 @@ jobs:
146111 fi
147112 continue-on-error : true
148113
149-
150-
151- # Docker 이미지 빌드 및 ECR 푸시
152114 build-and-push-image :
153115 runs-on : ubuntu-latest
154116 needs : [build, check-ec2]
155- if : github.event_name == 'push' && needs.build.outputs.build-success == 'true' && needs. check-ec2.outputs.ec2-available == 'true'
117+ if : github.event_name == 'push' && needs.check-ec2.outputs.ec2-available == 'true'
156118 outputs :
157119 image-pushed : ${{ steps.push-status.outputs.success }}
158120 steps :
@@ -181,8 +143,6 @@ jobs:
181143 if : success()
182144 run : echo "success=true" >> $GITHUB_OUTPUT
183145
184-
185- # EC2 배포 작업
186146 deploy :
187147 runs-on : ubuntu-latest
188148 needs : [build, check-ec2, build-and-push-image]
@@ -200,7 +160,6 @@ jobs:
200160 id : login-ecr
201161 uses : aws-actions/amazon-ecr-login@v2
202162
203- # === 필요한 파일들을 EC2로 복사 (scp-action 사용) ===
204163 - name : Create Firebase Service Account Key File
205164 env :
206165 FIREBASE_KEY_JSON : ${{ secrets.FIREBASE_KEY_JSON }}
@@ -225,7 +184,6 @@ jobs:
225184 source : " docker-compose.yml,.env,serviceAccountKey.json"
226185 target : " /home/${{ secrets.EC2_USER }}/app"
227186
228- # === EC2 배포 (ssh-action 사용) ===
229187 - name : Deploy to EC2 instance
230188 uses : appleboy/ssh-action@master
231189 with :
@@ -234,16 +192,11 @@ jobs:
234192 key : ${{ secrets.EC2_SSH_KEY }}
235193 script : |
236194 cd /home/${{ secrets.EC2_USER }}/app
237- # AWS ECR 로그인
238195 aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }}
239-
240- # docker-compose로 애플리케이션 실행
241196 export ECR_REGISTRY=${{ steps.login-ecr.outputs.registry }}
242197 docker-compose pull
243198 docker-compose up -d --remove-orphans
244-
245199
246- # 워크플로우 실행 결과 요약
247200 summary :
248201 runs-on : ubuntu-latest
249202 needs : [build, check-ec2, build-and-push-image, deploy]
@@ -254,12 +207,12 @@ jobs:
254207 echo "## 워크플로우 실행 결과" >> $GITHUB_STEP_SUMMARY
255208 echo "| 단계 | 상태 |" >> $GITHUB_STEP_SUMMARY
256209 echo "|------|------|" >> $GITHUB_STEP_SUMMARY
257- echo "| 빌드 및 테스트 | ${{ needs.build.result == 'success' && '✅ 성공' || '❌ 실패/건너뜀' }} |" >> $GITHUB_STEP_SUMMARY
210+ echo "| 빌드 및 테스트 | ${{ needs.build.result == 'success' && '✅ 성공' || '❌ 실패/건너뜀' }} |"
258211
259212 if [[ "${{ github.event_name }}" == "push" ]]; then
260- echo "| EC2 상태 확인 | ${{ needs.check-ec2.result == 'success' && '✅ 성공' || (needs.check-ec2.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |" >> $GITHUB_STEP_SUMMARY
261- echo "| Docker 이미지 빌드/푸시 | ${{ needs.build-and-push-image.result == 'success' && '✅ 성공' || (needs.build-and-push-image.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |" >> $GITHUB_STEP_SUMMARY
262- echo "| EC2 배포 | ${{ needs.deploy.result == 'success' && '✅ 성공' || (needs.deploy.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |" >> $GITHUB_STEP_SUMMARY
213+ echo "| EC2 상태 확인 | ${{ needs.check-ec2.result == 'success' && '✅ 성공' || (needs.check-ec2.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |"
214+ echo "| Docker 이미지 빌드/푸시 | ${{ needs.build-and-push-image.result == 'success' && '✅ 성공' || (needs.build-and-push-image.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |"
215+ echo "| EC2 배포 | ${{ needs.deploy.result == 'success' && '✅ 성공' || (needs.deploy.result == 'skipped' && '⏭️ 건너뜀' || '❌ 실패') }} |"
263216 else
264- echo "| 배포 관련 작업 | ⏭️ 건너뜀 (PR 이벤트) |" >> $GITHUB_STEP_SUMMARY
265- fi
217+ echo "| 배포 관련 작업 | ⏭️ 건너뜀 (PR 이벤트) |"
218+ fi
0 commit comments