@@ -106,144 +106,3 @@ jobs:
106106 docker push $IMAGE_NAME:${GITHUB_SHA}
107107 docker push $IMAGE_NAME:latest
108108
109- # ==================================
110- # CD: Deploy to Test Environment
111- # ==================================
112- cd-test :
113- runs-on : ubuntu-latest
114- needs : ci # CI가 성공한 후에만 실행
115-
116- steps :
117- - name : Checkout code
118- uses : actions/checkout@v4
119-
120- - name : Deploy to Test Environment
121- 122- with :
123- host : ${{ secrets.TEST_SERVER_HOST }}
124- username : ec2-user
125- key : ${{ secrets.SSH_PRIVATE_KEY }}
126- script : |
127-
128- # GHCR 로그인 (EC2)
129- echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{github.repository_owner}}" --password-stdin
130-
131- # 최신 이미지 pull
132- docker pull ghcr.io/${{ github.repository }}/zoopzoop:latest
133-
134- # NPM API 설정
135- NPM_HOST="localhost:81"
136- NPM_EMAIL="${{secrets.NPM_ADMIN_EMAIL}}"
137- NPM_PASSWORD="${{secrets.NPM_ADMIN_PASSWORD}}"
138- PROXY_HOST_ID="${{secrets.NPM_PROXY_HOST_ID}}"
139-
140- # NPM API 토큰 가져오기
141- echo "Getting NPM API token..."
142- TOKEN=$(curl -s -X POST "http://${NPM_HOST}/api/tokens" \
143- -H "Content-Type : application/json" \
144- -d "{\"identity\":\"${NPM_EMAIL}\",\"secret\":\"${NPM_PASSWORD}\"}" | \
145- jq -r '.token')
146- if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then
147- echo "❌ Failed to get NPM API token"
148- exit 1
149- fi
150-
151- # 현재 NPM Proxy Host 설정 확인
152- echo "📋 Checking current NPM configuration..."
153- CURRENT_CONFIG=$(curl -s -H "Authorization : Bearer $TOKEN" \
154- " http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" )
155-
156- CURRENT_TARGET=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_host // .forward_host')
157- CURRENT_PORT=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_port // .forward_port')
158-
159- echo "Current NPM target : $CURRENT_TARGET:$CURRENT_PORT"
160-
161- # Blue-Green 배포
162- if [ "$(docker ps -q -f name=zoopzoop-blue)" ]; then
163- NEW_CONTAINER=zoopzoop-green
164- OLD_CONTAINER=zoopzoop-blue
165- NEW_PORT=8082
166- else
167- NEW_CONTAINER=zoopzoop-blue
168- OLD_CONTAINER=zoopzoop-green
169- NEW_PORT=8081
170- fi
171-
172- echo "Starting new container : $NEW_CONTAINER on port $NEW_PORT"
173- docker run -d --restart unless-stopped \
174- -p $NEW_PORT:8080 \
175- --name $NEW_CONTAINER \
176- --network common \
177- -e SPRING_DATASOURCE_URL="${{secrets.TEST_DB_URL}}" \
178- -e SPRING_DATASOURCE_USERNAME="${{secrets.TEST_DB_USERNAME}}" \
179- -e SPRING_DATASOURCE_PASSWORD="${{secrets.TEST_DB_PASSWORD}}" \
180- ghcr.io/${{ github.repository }}/zoopzoop:latest
181-
182-
183- # 헬스체크 (Spring Boot Actuator)
184- for i in {1..30}; do
185- if curl -s http://localhost:$NEW_PORT/actuator/health | grep -q '"status":"UP"'; then
186- echo "✅New container is healthy!"
187- break
188- else
189- echo "Waiting for new container to be healthy..."
190- sleep 5
191- fi
192-
193- if [ $i -eq 30 ]; then
194- echo "❌ Health check failed. Rolling back..."
195- docker stop $NEW_CONTAINER || true
196- docker rm $NEW_CONTAINER || true
197- exit 1
198- fi
199- done
200-
201- # NPM에서 트래픽 스위칭
202- echo "🔄 Switching traffic in Nginx Proxy Manager..."
203- DOMAIN_NAME=$(echo $CURRENT_CONFIG | jq -r '.domain_names[0]')
204- CERT_ID=$(echo "$CURRENT_CONFIG" | jq -r '.certificate_id')
205-
206- SWITCH_RESPONSE=$(curl -s -w "%{http_code}" -X PUT "http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" \
207- -H "Authorization : Bearer $TOKEN" \
208- -H "Content-Type : application/json" \
209- -d "{
210- \"domain_names\" : [\"$DOMAIN_NAME\"],
211- \"forward_scheme\" : \"http\",
212- \"forward_host\" : \"$NEW_CONTAINER\",
213- \"forward_port\" : 8080,
214- \"caching_enabled\" : false,
215- \"block_exploits\" : true,
216- \"advanced_config\" : \"\",
217- \"locations\" : [],
218- \"certificate_id\" : $CERT_ID,
219- \"ssl_forced\" : 1,
220- \"hsts_enabled\" : 1,
221- \"hsts_subdomains\" : 1
222- }")
223-
224- HTTP_CODE=${SWITCH_RESPONSE : -3}
225- if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 201 ]; then
226- echo "✅ Traffic switching completed successfully!"
227- echo "🎯 NPM now points to : $NEW_CONTAINER:8080"
228-
229- # 최종 확인
230- sleep 5
231- echo "🔍 Final verification..."
232- VERIFY_CONFIG=$(curl -s -H "Authorization : Bearer $TOKEN" \
233- " http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" )
234- VERIFY_TARGET=$(echo $VERIFY_CONFIG | jq -r '.forward_host')
235- echo "✅ Verified NPM target : $VERIFY_TARGET"
236-
237- else
238- echo "❌ Traffic switching failed! HTTP Code : $HTTP_CODE"
239- echo "Response : ${SWITCH_RESPONSE%???}"
240- echo "🔄 Rolling back new container..."
241- docker stop $NEW_CONTAINER || true
242- docker rm $NEW_CONTAINER || true
243- exit 1
244- fi
245-
246- # 이전 컨테이너 종료 및 제거
247- echo "Stopping old container : $OLD_CONTAINER"
248- docker stop $OLD_CONTAINER || true
249- docker rm $OLD_CONTAINER || true
0 commit comments