Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 63 additions & 114 deletions .github/workflows/deploy-prod.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name: ν”„λ‘œλ•μ…˜ 배포 (κ°œμ„ λœ 디버깅)
name: ν”„λ‘œλ•μ…˜ 배포 (HTTPS λŒ€μ‘)

on:
push:
branches:
- master
- feat/git-master
- feat/https
workflow_dispatch:

jobs:
Expand Down Expand Up @@ -55,139 +55,81 @@ jobs:
echo "πŸŽ‰ 배포 슀크립트 μ™„λ£Œ"
'

- name: κ³ κΈ‰ 디버깅 정보 μˆ˜μ§‘
- name: μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인
run: |
ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
echo "πŸ” κ³ κΈ‰ 디버깅 정보 μˆ˜μ§‘ μ‹œμž‘"
echo "πŸ” μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인"
cd /opt/news-deliver

echo "=== ν˜„μž¬ μž‘μ—… 디렉토리 ==="
pwd
ls -la
echo "=== Docker μ»¨ν…Œμ΄λ„ˆ μƒνƒœ ==="
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

echo "=== Docker 데λͺ¬ μƒνƒœ ==="
sudo systemctl status docker --no-pager || echo "Docker μƒνƒœ 확인 μ‹€νŒ¨"

echo "=== λͺ¨λ“  Docker μ»¨ν…Œμ΄λ„ˆ (μ‹€ν–‰ 쀑 + 쀑지됨) ==="
docker ps -a

echo "=== Docker 이미지 λͺ©λ‘ ==="
docker images

echo "=== Docker Compose μ„€μ • 검증 ==="
docker-compose config || echo "docker-compose.yml μ„€μ • 였λ₯˜"

echo "=== 직접 Docker μ»¨ν…Œμ΄λ„ˆ 확인 ==="
docker ps --filter "name=springboot" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

echo "=== Spring Boot μ»¨ν…Œμ΄λ„ˆ 둜그 (직접 docker λͺ…λ Ήμ–΄) ==="
echo "=== Spring Boot μ»¨ν…Œμ΄λ„ˆ 둜그 (졜근 30쀄) ==="
SPRINGBOOT_CONTAINER=$(docker ps -q --filter "name=springboot")
if [ ! -z "$SPRINGBOOT_CONTAINER" ]; then
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆ ID: $SPRINGBOOT_CONTAINER"
docker logs $SPRINGBOOT_CONTAINER --tail=50
docker logs $SPRINGBOOT_CONTAINER --tail=30
else
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "❌ Spring Boot μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
fi

echo "=== λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 둜그 (졜근 10쀄씩) ==="
for container in $(docker ps --format "{{.Names}}"); do
echo "--- $container 둜그 ---"
docker logs $container --tail=10 2>/dev/null || echo "$container 둜그 κ°€μ Έμ˜€κΈ° μ‹€νŒ¨"
done

echo "=== 포트 μ‚¬μš© μƒνƒœ (ss λͺ…λ Ήμ–΄) ==="
ss -tulpn | grep -E ":(80|8080|3306|6379|9200)" || echo "ν•΄λ‹Ή ν¬νŠΈλ“€μ΄ μ‚¬μš© 쀑이 μ•„λ‹™λ‹ˆλ‹€"

echo "=== λ„€νŠΈμ›Œν¬ μΈν„°νŽ˜μ΄μŠ€ ==="
ip addr show

echo "=== ν˜ΈμŠ€νŠΈμ—μ„œ 직접 포트 ν…ŒμŠ€νŠΈ ==="
echo "80번 포트 ν…ŒμŠ€νŠΈ:"
curl -I http://localhost:80/api/auth/status 2>/dev/null || echo "80번 포트 μ—°κ²° μ‹€νŒ¨"

echo "=== Docker λ„€νŠΈμ›Œν¬ 정보 ==="
docker network ls
docker network inspect news-deliver_backend 2>/dev/null || echo "λ°±μ—”λ“œ λ„€νŠΈμ›Œν¬ 정보 μ—†μŒ"

echo "=== μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ ==="
echo "λ©”λͺ¨λ¦¬:"
free -h
echo "λ””μŠ€ν¬:"
df -h
echo "CPU:"
top -bn1 | head -5

echo "πŸ” κ³ κΈ‰ 디버깅 정보 μˆ˜μ§‘ μ™„λ£Œ"
'

- name: μ»¨ν…Œμ΄λ„ˆλ³„ κ°œλ³„ ν…ŒμŠ€νŠΈ
run: |
ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
echo "πŸ§ͺ μ»¨ν…Œμ΄λ„ˆλ³„ κ°œλ³„ ν…ŒμŠ€νŠΈ μ‹œμž‘"
cd /opt/news-deliver

echo "=== MySQL μ»¨ν…Œμ΄λ„ˆ ν…ŒμŠ€νŠΈ ==="
MYSQL_CONTAINER=$(docker ps -q --filter "name=mysql")
if [ ! -z "$MYSQL_CONTAINER" ]; then
echo "MySQL μƒνƒœ 확인:"
docker exec $MYSQL_CONTAINER mysqladmin ping -h localhost -u root -p$(grep DB_PASS .env | cut -d= -f2) || echo "MySQL μ—°κ²° μ‹€νŒ¨"
echo "=== μ£Όμš” μ„œλΉ„μŠ€ μƒνƒœ 확인 ==="
# MySQL 확인
if docker ps | grep -q mysql; then
echo "βœ… MySQL μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑"
else
echo "MySQL μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "❌ MySQL μ»¨ν…Œμ΄λ„ˆ μ—†μŒ"
fi

echo "=== Redis μ»¨ν…Œμ΄λ„ˆ ν…ŒμŠ€νŠΈ ==="
REDIS_CONTAINER=$(docker ps -q --filter "name=redis-cache")
if [ ! -z "$REDIS_CONTAINER" ]; then
echo "Redis μƒνƒœ 확인:"
docker exec $REDIS_CONTAINER redis-cli ping || echo "Redis μ—°κ²° μ‹€νŒ¨"
# Redis 확인
if docker ps | grep -q redis; then
echo "βœ… Redis μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑"
else
echo "Redis μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "❌ Redis μ»¨ν…Œμ΄λ„ˆ μ—†μŒ"
fi

echo "=== Elasticsearch μ»¨ν…Œμ΄λ„ˆ ν…ŒμŠ€νŠΈ ==="
ES_CONTAINER=$(docker ps -q --filter "name=elasticsearch")
if [ ! -z "$ES_CONTAINER" ]; then
echo "Elasticsearch μƒνƒœ 확인:"
docker exec $ES_CONTAINER curl -f http://localhost:9200/_cluster/health || echo "Elasticsearch μ—°κ²° μ‹€νŒ¨"
# Elasticsearch 확인
if docker ps | grep -q elasticsearch; then
echo "βœ… Elasticsearch μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑"
else
echo "Elasticsearch μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "❌ Elasticsearch μ»¨ν…Œμ΄λ„ˆ μ—†μŒ"
fi
'

- name: λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬
run: |
ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
echo "πŸ₯ λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬ μ‹œμž‘"

echo "=== Spring Boot μ»¨ν…Œμ΄λ„ˆ 직접 ν…ŒμŠ€νŠΈ ==="
# Spring Boot μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ μžκ°€ ν…ŒμŠ€νŠΈ
SPRINGBOOT_CONTAINER=$(docker ps -q --filter "name=springboot")
if [ ! -z "$SPRINGBOOT_CONTAINER" ]; then
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€:"
docker exec $SPRINGBOOT_CONTAINER ps aux || echo "ν”„λ‘œμ„ΈμŠ€ 확인 μ‹€νŒ¨"

echo "Spring Boot μ»¨ν…Œμ΄λ„ˆ λ„€νŠΈμ›Œν¬ 확인:"
docker exec $SPRINGBOOT_CONTAINER netstat -tulpn 2>/dev/null || docker exec $SPRINGBOOT_CONTAINER ss -tulpn || echo "λ„€νŠΈμ›Œν¬ μƒνƒœ 확인 μ‹€νŒ¨"

echo "Spring Boot λ‚΄λΆ€μ—μ„œ μžκ°€ ν…ŒμŠ€νŠΈ:"
docker exec $SPRINGBOOT_CONTAINER curl -f http://localhost:8080/api/auth/status || echo "λ‚΄λΆ€ μžκ°€ ν…ŒμŠ€νŠΈ μ‹€νŒ¨"
else
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "Spring Boot λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬:"
docker exec $SPRINGBOOT_CONTAINER curl -f http://localhost:8080/api/auth/status 2>/dev/null && echo "βœ… λ‚΄λΆ€ API 정상" || echo "❌ λ‚΄λΆ€ API μ‹€νŒ¨"
fi

echo "πŸ§ͺ μ»¨ν…Œμ΄λ„ˆλ³„ κ°œλ³„ ν…ŒμŠ€νŠΈ μ™„λ£Œ"
# ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‘œ μ ‘κ·Ό ν…ŒμŠ€νŠΈ
echo "ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆ μ ‘κ·Ό ν…ŒμŠ€νŠΈ:"
curl -f http://localhost:8080/api/auth/status 2>/dev/null && echo "βœ… 호슀트->μ»¨ν…Œμ΄λ„ˆ 정상" || echo "❌ 호슀트->μ»¨ν…Œμ΄λ„ˆ μ‹€νŒ¨"
'
Comment on lines +98 to 113

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ› οΈ Refactor suggestion

λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬ μŠ€ν¬λ¦½νŠΈμ— μ¦‰μ‹œ μ‹€νŒ¨(set -e) 및 λͺ…ν™•ν•œ λ°˜ν™˜κ°’ 반영 ꢌμž₯

ν˜„μž¬ μŠ€ν¬λ¦½νŠΈλŠ” curl μ‹€νŒ¨ μ‹œμ—λ„ SSH μ„Έμ…˜ μžμ²΄λŠ” 계속 μ§„ν–‰λ©λ‹ˆλ‹€. 배포 성곡 μ—¬λΆ€λ₯Ό μ •ν™•νžˆ λ°˜μ˜ν•˜λ €λ©΄ λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬ λ‹¨κ³„μ—μ„œλ„ set -euo pipefail을 μ„ μ–Έν•˜κ³ , μ‹€νŒ¨ μ‹œ exit 1둜 μ›Œν¬ν”Œλ‘œ 전체λ₯Ό μ€‘λ‹¨ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” 편이 μ•ˆμ „ν•©λ‹ˆλ‹€.

-run: |
+run: |
+  set -euo pipefail
   ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
     set -euo pipefail
     ...
     docker exec $SPRINGBOOT_CONTAINER curl -fsS http://localhost:8080/api/auth/status \
       && echo "βœ… λ‚΄λΆ€ API 정상" \
       || { echo "❌ λ‚΄λΆ€ API μ‹€νŒ¨"; exit 1; }
πŸ“ Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬
run: |
ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
echo "πŸ₯ λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬ μ‹œμž‘"
echo "=== Spring Boot μ»¨ν…Œμ΄λ„ˆ 직접 ν…ŒμŠ€νŠΈ ==="
# Spring Boot μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ μžκ°€ ν…ŒμŠ€νŠΈ
SPRINGBOOT_CONTAINER=$(docker ps -q --filter "name=springboot")
if [ ! -z "$SPRINGBOOT_CONTAINER" ]; then
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€:"
docker exec $SPRINGBOOT_CONTAINER ps aux || echo "ν”„λ‘œμ„ΈμŠ€ 확인 μ‹€νŒ¨"
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆ λ„€νŠΈμ›Œν¬ 확인:"
docker exec $SPRINGBOOT_CONTAINER netstat -tulpn 2>/dev/null || docker exec $SPRINGBOOT_CONTAINER ss -tulpn || echo "λ„€νŠΈμ›Œν¬ μƒνƒœ 확인 μ‹€νŒ¨"
echo "Spring Boot λ‚΄λΆ€μ—μ„œ μžκ°€ ν…ŒμŠ€νŠΈ:"
docker exec $SPRINGBOOT_CONTAINER curl -f http://localhost:8080/api/auth/status || echo "λ‚΄λΆ€ μžκ°€ ν…ŒμŠ€νŠΈ μ‹€νŒ¨"
else
echo "Spring Boot μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이 μ•„λ‹™λ‹ˆλ‹€"
echo "Spring Boot λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬:"
docker exec $SPRINGBOOT_CONTAINER curl -f http://localhost:8080/api/auth/status 2>/dev/null && echo "βœ… λ‚΄λΆ€ API 정상" || echo "❌ λ‚΄λΆ€ API μ‹€νŒ¨"
fi
echo "πŸ§ͺ μ»¨ν…Œμ΄λ„ˆλ³„ κ°œλ³„ ν…ŒμŠ€νŠΈ μ™„λ£Œ"
# ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‘œ μ ‘κ·Ό ν…ŒμŠ€νŠΈ
echo "ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆ μ ‘κ·Ό ν…ŒμŠ€νŠΈ:"
curl -f http://localhost:8080/api/auth/status 2>/dev/null && echo "βœ… 호슀트->μ»¨ν…Œμ΄λ„ˆ 정상" || echo "❌ 호슀트->μ»¨ν…Œμ΄λ„ˆ μ‹€νŒ¨"
'
- name: λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬
run: |
set -euo pipefail
ssh -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} '
set -euo pipefail
echo "πŸ₯ λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬ μ‹œμž‘"
# Spring Boot μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ μžκ°€ ν…ŒμŠ€νŠΈ
SPRINGBOOT_CONTAINER=$(docker ps -q --filter "name=springboot")
if [ ! -z "$SPRINGBOOT_CONTAINER" ]; then
echo "Spring Boot λ‚΄λΆ€ ν—¬μŠ€μ²΄ν¬:"
docker exec $SPRINGBOOT_CONTAINER curl -fsS http://localhost:8080/api/auth/status \
&& echo "βœ… λ‚΄λΆ€ API 정상" \
|| { echo "❌ λ‚΄λΆ€ API μ‹€νŒ¨"; exit 1; }
fi
# ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‘œ μ ‘κ·Ό ν…ŒμŠ€νŠΈ
echo "ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆ μ ‘κ·Ό ν…ŒμŠ€νŠΈ:"
curl -f http://localhost:8080/api/auth/status 2>/dev/null && echo "βœ… 호슀트->μ»¨ν…Œμ΄λ„ˆ 정상" || echo "❌ 호슀트->μ»¨ν…Œμ΄λ„ˆ μ‹€νŒ¨"
'
🧰 Tools
πŸͺ› YAMLlint (1.37.1)

[error] 102-102: trailing spaces

(trailing-spaces)


[error] 109-109: trailing spaces

(trailing-spaces)

πŸ€– Prompt for AI Agents
In .github/workflows/deploy-prod.yml around lines 98 to 113, the internal health
check script does not immediately fail on errors, which can cause the deployment
to proceed despite failures. To fix this, add 'set -euo pipefail' at the start
of the SSH command block to enable immediate exit on any error or unset
variable, and ensure that if any curl command fails, the script exits with 'exit
1' to properly signal failure and stop the workflow.


- name: μ΅œμ’… ν—¬μŠ€μ²΄ν¬
- name: μ΅œμ’… HTTPS ν—¬μŠ€μ²΄ν¬
run: |
echo "🎯 μ΅œμ’… μ™ΈλΆ€ ν—¬μŠ€μ²΄ν¬..."
echo "🎯 HTTPS 도메인 ν—¬μŠ€μ²΄ν¬..."

success=false
api_domain="https://api.likelionnews.click"

for attempt in {1..5}; do
echo "πŸ”„ μ‹œλ„ $attempt/5"

# λ‹€μ–‘ν•œ μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ
endpoints=("/api/auth/status" "/health" "/swagger.html")
# HTTPS λ„λ©”μΈμœΌλ‘œ ν…ŒμŠ€νŠΈ
endpoints=("/api/auth/status" "/swagger.html")

for endpoint in "${endpoints[@]}"; do
url="http://${{ secrets.EC2_HOST }}${endpoint}"
url="${api_domain}${endpoint}"
echo " πŸ“‘ ν…ŒμŠ€νŠΈ: $url"

response=$(curl -s -o /dev/null -w "%{http_code}:%{time_total}" --connect-timeout 5 --max-time 10 "$url" || echo "000:0")
response=$(curl -s -o /dev/null -w "%{http_code}:%{time_total}" --connect-timeout 10 --max-time 20 "$url" || echo "000:0")
http_code=$(echo $response | cut -d: -f1)
time_total=$(echo $response | cut -d: -f2)

Expand All @@ -197,10 +139,12 @@ jobs:
echo " βœ… $endpoint 성곡!"
success=true
break 2
elif [ "$http_code" = "404" ] && [ "$endpoint" = "/health" ]; then
echo " ⚠️ $endpoint 404 (아직 κ΅¬ν˜„ μ•ˆλ¨)"
elif [ "$http_code" = "404" ]; then
echo " ⚠️ $endpoint 404 (μ—”λ“œν¬μΈνŠΈκ°€ 없을 수 있음)"
elif [ "$http_code" = "000" ]; then
echo " ❌ $endpoint μ—°κ²° μ‹€νŒ¨ (DNS/ALB 문제 κ°€λŠ₯μ„±)"
else
echo " ❌ $endpoint μ‹€νŒ¨"
echo " ❌ $endpoint HTTP $http_code 였λ₯˜"
fi
done

Expand All @@ -211,29 +155,34 @@ jobs:
done

if [ "$success" = true ]; then
echo "πŸŽ‰ 배포 성곡!"
echo "πŸ”— μ„œλΉ„μŠ€ URL: http://${{ secrets.EC2_HOST }}/"
echo "πŸ“‹ API λ¬Έμ„œ: http://${{ secrets.EC2_HOST }}/swagger.html"
echo "🩺 μƒνƒœ 확인: http://${{ secrets.EC2_HOST }}/api/auth/status"
echo "πŸŽ‰ HTTPS 배포 성곡!"
echo "πŸ”— API μ„œλΉ„μŠ€: https://api.likelionnews.click"
echo "πŸ“‹ API λ¬Έμ„œ: https://api.likelionnews.click/swagger.html"
echo "🩺 μƒνƒœ 확인: https://api.likelionnews.click/api/auth/status"
else
echo "⚠️ μ™ΈλΆ€ ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ν–ˆμ§€λ§Œ μ„œλΉ„μŠ€λŠ” μ‹€ν–‰ 쀑일 수 μžˆμŠ΅λ‹ˆλ‹€"
echo "πŸ”— 직접 확인: http://${{ secrets.EC2_HOST }}/"
echo "⚠️ HTTPS ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨"
echo "πŸ”§ 확인사항:"
echo " - Route53μ—μ„œ api.likelionnews.click이 ALBλ₯Ό κ°€λ¦¬ν‚€λŠ”μ§€ 확인"
echo " - ALB에 SSL μΈμ¦μ„œκ°€ 정상 μ—°κ²°λ˜μ—ˆλŠ”μ§€ 확인"
echo " - ALB Target Group이 healthy μƒνƒœμΈμ§€ 확인"
echo " - EC2 Security Groupμ—μ„œ ALB β†’ EC2:8080 ν—ˆμš©λ˜μ—ˆλŠ”μ§€ 확인"
fi

- name: 배포 μš”μ•½
if: always()
run: |
echo "## πŸš€ 배포 μš”μ•½" >> $GITHUB_STEP_SUMMARY
echo "## πŸš€ HTTPS 배포 μš”μ•½" >> $GITHUB_STEP_SUMMARY
echo "- **μƒνƒœ**: ${{ job.status }}" >> $GITHUB_STEP_SUMMARY
echo "- **μ‹œκ°„**: $(date)" >> $GITHUB_STEP_SUMMARY
echo "- **브랜치**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ”— 링크듀:" >> $GITHUB_STEP_SUMMARY
echo "- **메인 μ„œλΉ„μŠ€**: http://${{ secrets.EC2_HOST }}/" >> $GITHUB_STEP_SUMMARY
echo "- **API λ¬Έμ„œ**: http://${{ secrets.EC2_HOST }}/swagger.html" >> $GITHUB_STEP_SUMMARY
echo "- **μƒνƒœ 확인**: http://${{ secrets.EC2_HOST }}/api/auth/status" >> $GITHUB_STEP_SUMMARY
echo "### πŸ”— HTTPS 링크듀:" >> $GITHUB_STEP_SUMMARY
echo "- **API μ„œλΉ„μŠ€**: https://api.likelionnews.click" >> $GITHUB_STEP_SUMMARY
echo "- **API λ¬Έμ„œ**: https://api.likelionnews.click/swagger.html" >> $GITHUB_STEP_SUMMARY
echo "- **μƒνƒœ 확인**: https://api.likelionnews.click/api/auth/status" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ›  문제 ν•΄κ²°:" >> $GITHUB_STEP_SUMMARY
echo "1. \`ssh ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}\`" >> $GITHUB_STEP_SUMMARY
echo "2. \`cd /opt/news-deliver && docker ps\`" >> $GITHUB_STEP_SUMMARY
echo "3. \`docker logs springboot\` (μ»¨ν…Œμ΄λ„ˆλͺ… 확인 ν›„)" >> $GITHUB_STEP_SUMMARY
echo "3. \`docker logs springboot\` (μ»¨ν…Œμ΄λ„ˆλͺ… 확인 ν›„)" >> $GITHUB_STEP_SUMMARY
echo "4. ALB와 Route53 μ„€μ • 확인" >> $GITHUB_STEP_SUMMARY