Skip to content

Commit 436bd4f

Browse files
authored
CI/CD 파이프라인 분기 - ec2 작동시 / 미작동시
1 parent df28589 commit 436bd4f

1 file changed

Lines changed: 103 additions & 12 deletions

File tree

.github/workflows/ci-cd.yml

Lines changed: 103 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ permissions:
1212
contents: read
1313

1414
jobs:
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
@@ -35,7 +35,6 @@ jobs:
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

Comments
 (0)