-
Notifications
You must be signed in to change notification settings - Fork 1
147 lines (124 loc) · 5.26 KB
/
Copy pathdeploy.yml
File metadata and controls
147 lines (124 loc) · 5.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
name: Build and Deploy to EC2
on:
push:
branches:
- main
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
jobs:
build-and-deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build -x test
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push image to Amazon ECR
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
- name: Deploy to EC2 via Bastion
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
proxy_host: ${{ secrets.BASTION_HOST }}
proxy_username: ${{ secrets.BASTION_USERNAME }}
proxy_key: ${{ secrets.SSH_PRIVATE_KEY }}
proxy_port: 22
script: |
echo "ECR 로그인..."
aws ecr get-login-password --region ${{ env.AWS_REGION }} | \
docker login --username AWS --password-stdin \
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com
echo "이전 컨테이너 종료..."
docker-compose -f docker-compose.prod.yml down
echo "환경 변수 파일 생성..."
cat <<EOF > .env
DB_URL=jdbc:mysql://db:3306/mega_crew?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
DDL_AUTO=update
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DATABASE=0
REDIS_TIMEOUT=1000
JWT_SECRET=${{ secrets.JWT_SECRET }}
JWT_EXPIRATION=86400000
FRONTEND_URL=${{ secrets.FRONTEND_URL }}
CORS_ORIGINS=${{ secrets.CORS_ORIGINS }}
GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }}
NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }}
KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}
KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}
AI_SERVER_BASE_URL=${{ secrets.AI_SERVER_BASE_URL }}
AI_SERVER_TIMEOUT=5000
AI_SERVER_MAX_RETRIES=3
AI_SERVER_MAX_POOLS=100
SL_API_KEY=${{ secrets.SL_API_KEY }}
SL_API_URL=${{ secrets.SL_API_URL }}
AWS_ACCOUNT_ID=${{ secrets.AWS_ACCOUNT_ID }}
ECR_REPOSITORY=${{ env.ECR_REPOSITORY }}
IMAGE_TAG=${{ github.sha }}
AWS_REGION=${{ env.AWS_REGION }}
ADMIN_SIGNUP_CODE=${{ secrets.ADMIN_SIGNUP_CODE }}
MAX_FILE_SIZE=15MB
MAX_REQUEST_SIZE=15MB
EOF
echo "최신 이미지 가져오기 및 컨테이너 시작..."
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d --force-recreate
echo "배포 대기 중..."
sleep 30
echo "컨테이너 상태 확인..."
docker-compose -f docker-compose.prod.yml ps
echo "헬스체크 실행..."
max_attempts=6
attempt=1
wait_time=10
while [ $attempt -le $max_attempts ]; do
echo "헬스체크 시도 $attempt/$max_attempts..."
if docker-compose -f docker-compose.prod.yml ps | grep -q "Up"; then
if curl -f http://localhost:8080/actuator/health 2>/dev/null; then
echo "배포 성공!"
break
fi
fi
if [ $attempt -eq $max_attempts ]; then
echo "헬스체크 타임아웃. 로그 확인:"
docker-compose -f docker-compose.prod.yml logs --tail=50 app
exit 1
fi
sleep $wait_time
attempt=$((attempt + 1))
done
echo "Docker 리소스 정리..."
docker system prune -f
echo "배포 완료!"