11name : Deploy to EC2
22
3- # =========================
4- # 전역 환경변수
5- # =========================
63env :
7- IMAGE_REPOSITORY : fivelogic # GHCR 이미지 리포지토리명
8- CONTAINER_NAME : spring-boot # 컨테이너 이름
9- EC2_INSTANCE_TAG_NAME : devcos-team10-main # 배포 대상 EC2 Name 태그
10- DOCKER_NETWORK : app-network # 도커 네트워크
11- BACKEND_DIR : back # Dockerfile 위치 (프로젝트 루트)
4+ IMAGE_REPOSITORY : fivelogic
5+ CONTAINER_NAME : spring-boot
6+ EC2_INSTANCE_TAG_NAME : devcos-team10-main
7+ DOCKER_NETWORK : app-network
8+ BACKEND_DIR : back
129
1310on :
1411 push :
15- paths :
16- - " .github/workflows/**"
17- - " back/src/**"
18- - " back/build.gradle.kts"
19- - " back/settings.gradle.kts"
20- - " back/Dockerfile"
2112 branches :
2213 - main
2314 - chore/107
2415 pull_request :
2516 branches :
2617 - main
2718 - develop
19+ workflow_dispatch :
2820
29- # 권한 최소화/명시화
3021permissions :
31- contents : write # 태그/릴리즈
32- packages : write # GHCR 푸시
22+ contents : write
23+ packages : write
3324
34- # 기본 셸
3525defaults :
3626 run :
3727 shell : bash
3828
3929jobs :
40- # ---------------------------------------------------------
41- # 1) 테스트
42- # ---------------------------------------------------------
43- test :
44- runs-on : ubuntu-latest
45-
46- steps :
47- - name : 코드 체크아웃
48- uses : actions/checkout@v4
49-
50- - name : Java 21 설정
51- uses : actions/setup-java@v4
52- with :
53- distribution : ' temurin'
54- java-version : ' 21'
55- cache : ' gradle'
56-
57- - name : 테스트 실행
58- run : |
59- cd back
60- chmod +x gradlew
61- ./gradlew test
62-
63- - name : 테스트 결과 업로드
64- if : always()
65- uses : actions/upload-artifact@v4
66- with :
67- name : test-results
68- path : back/build/reports/tests/test/
69-
70- # ---------------------------------------------------------
71- # 2) 태그/릴리즈 생성 (main 브랜치만)
72- # ---------------------------------------------------------
30+ test :
31+ runs-on : ubuntu-latest
32+
33+ steps :
34+ - name : 코드 체크아웃
35+ uses : actions/checkout@v4
36+
37+ - name : Java 21 설정
38+ uses : actions/setup-java@v4
39+ with :
40+ distribution : ' temurin'
41+ java-version : ' 21'
42+ cache : ' gradle'
43+
44+ - name : 테스트 실행
45+ run : |
46+ cd back
47+ chmod +x gradlew
48+ ./gradlew test
49+
50+ - name : 테스트 결과 업로드
51+ if : always()
52+ uses : actions/upload-artifact@v4
53+ with :
54+ name : test-results
55+ path : back/build/reports/tests/test/
56+
7357 makeTagAndRelease :
7458 needs : test
7559 if : github.ref == 'refs/heads/main' && github.event_name == 'push'
@@ -81,14 +65,12 @@ test:
8165 - name : 코드 체크아웃
8266 uses : actions/checkout@v4
8367
84- # 버전 태그 자동 생성 (vX.Y.Z)
8568 - name : Create Tag
8669 id : create_tag
8770 uses :
mathieudutour/[email protected] 8871 with :
8972 github_token : ${{ secrets.GITHUB_TOKEN }}
9073
91- # 릴리즈 생성
9274 - name : Create Release
9375 uses : actions/create-release@v1
9476 env :
10082 draft : false
10183 prerelease : false
10284
103- # ---------------------------------------------------------
104- # 3) 도커 이미지 빌드/푸시
105- # ---------------------------------------------------------
10685 buildImageAndPush :
10786 name : 도커 이미지 빌드와 푸시
10887 needs : makeTagAndRelease
11291 - name : 코드 체크아웃
11392 uses : actions/checkout@v4
11493
115-
11694 - name : .env 파일 생성
11795 env :
11896 DOT_ENV : ${{ secrets.DOT_ENV }}
@@ -123,22 +101,19 @@ test:
123101 - name : Docker Buildx 설치
124102 uses : docker/setup-buildx-action@v3
125103
126- # GHCR 로그인
127104 - name : 레지스트리 로그인
128105 uses : docker/login-action@v3
129106 with :
130107 registry : ghcr.io
131108 username : ${{ github.actor }}
132109 password : ${{ secrets.GITHUB_TOKEN }}
133110
134- # 저장소 소유자명을 소문자로 (GHCR 경로 표준화)
135111 - name : set lower case owner name
136112 run : |
137113 echo "OWNER_LC=${OWNER,,}" >> "${GITHUB_ENV}"
138114 env :
139115 OWNER : " ${{ github.repository_owner }}"
140116
141- # 캐시를 최대한 활용하여 빌드 → 버전태그 및 latest 동시 푸시
142117 - name : 빌드 앤 푸시
143118 uses : docker/build-push-action@v6
144119 with :
@@ -150,26 +125,20 @@ test:
150125 ghcr.io/${{ env.OWNER_LC }}/${{ env.IMAGE_REPOSITORY }}:${{ needs.makeTagAndRelease.outputs.tag_name }}
151126 ghcr.io/${{ env.OWNER_LC }}/${{ env.IMAGE_REPOSITORY }}:latest
152127
153- # ---------------------------------------------------------
154- # 4) 배포
155- # ---------------------------------------------------------
156128 deploy :
157129 name : 배포
158130 needs : [makeTagAndRelease, buildImageAndPush]
159131 runs-on : ubuntu-latest
160132
161133 steps :
162- # AWS 자격 구성
163134 - name : AWS 자격 구성
164135 uses : aws-actions/configure-aws-credentials@v4
165136 with :
166137 aws-region : ${{ secrets.AWS_REGION }}
167138 aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
168139 aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
169140
170- # Name 태그로 EC2 인스턴스 조회
171141 - name : 인스턴스 ID 가져오기
172- id : get_instance_id
173142 run : |
174143 INSTANCE_ID=$(aws ec2 describe-instances \
175144 --filters "Name=tag:Name,Values=${{ env.EC2_INSTANCE_TAG_NAME }}" "Name=instance-state-name,Values=running" \
@@ -183,7 +152,6 @@ test:
183152 echo "✅ EC2 인스턴스 발견: ${INSTANCE_ID}"
184153 echo "INSTANCE_ID=${INSTANCE_ID}" >> "${GITHUB_ENV}"
185154
186- # SSM으로 배포 수행
187155 - name : AWS SSM Send-Command로 배포
188156 uses : peterkimzz/aws-ssm-send-command@master
189157 with :
@@ -196,49 +164,38 @@ test:
196164 command : |
197165 set -Eeuo pipefail
198166
199- # 로그 파일 설정
200167 LOG="/tmp/deploy-$(date +%Y%m%d_%H%M%S).log"
201168 exec > >(awk '{ fflush(); print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' | tee -a "$LOG")
202169 exec 2> >(awk '{ fflush(); print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' | tee -a "$LOG" >&2)
203170
204171 echo "🚀 배포 시작..."
205172
206- # 환경변수 로드
207173 source /etc/environment || true
208174
209- # 이미지 정보 설정
210175 OWNER_LC="${{ github.repository_owner }}"
211176 OWNER_LC="${OWNER_LC,,}"
212177 IMAGE_TAG='${{ needs.makeTagAndRelease.outputs.tag_name }}'
213178 IMAGE_REPOSITORY='${{ env.IMAGE_REPOSITORY }}'
214179 IMAGE="ghcr.io/${OWNER_LC}/${IMAGE_REPOSITORY}:${IMAGE_TAG}"
215180 CONTAINER_NAME="${{ env.CONTAINER_NAME }}"
216- NET="${{ env.DOCKER_NETWORK }}"
217181
218182 echo "📦 이미지: ${IMAGE}"
219183 echo "📦 컨테이너: ${CONTAINER_NAME}"
220184
221- # 프로젝트 디렉토리로 이동
222185 cd ~/WEB6_8_FiveLogic_BE || exit 1
223186
224-
225- # 최신 이미지 pull
226187 echo "📥 Docker 이미지 다운로드 중..."
227188 docker pull $IMAGE
228189
229- # 기존 컨테이너 중지 및 삭제
230190 echo "🛑 기존 컨테이너 중지 중..."
231191 docker-compose stop $CONTAINER_NAME || true
232192 docker-compose rm -f $CONTAINER_NAME || true
233193
234- # docker-compose.yml 이미지 업데이트
235194 sed -i "s|image:.*${IMAGE_REPOSITORY}.*|image: ${IMAGE}|g" docker-compose.yml
236195
237- # 새 컨테이너 시작
238196 echo "🚀 새 컨테이너 시작 중..."
239197 docker-compose up -d $CONTAINER_NAME
240198
241- # 헬스체크
242199 echo "🏥 헬스체크 중..."
243200 for i in {1..30}; do
244201 if docker exec $CONTAINER_NAME curl -f http://localhost:8080/health > /dev/null 2>&1; then
@@ -249,15 +206,12 @@ test:
249206 sleep 2
250207 done
251208
252- # 컨테이너 상태 확인
253209 echo "📊 컨테이너 상태:"
254210 docker-compose ps $CONTAINER_NAME
255211
256- # 최근 로그 출력
257212 echo "📋 최근 로그:"
258213 docker-compose logs --tail=50 $CONTAINER_NAME
259214
260- # 오래된 이미지 정리
261215 echo "🧹 오래된 이미지 정리 중..."
262216 {
263217 docker images --format '{{.Repository}}:{{.Tag}}' \
0 commit comments