-
Notifications
You must be signed in to change notification settings - Fork 0
97 lines (90 loc) · 4.83 KB
/
deploy.yml
File metadata and controls
97 lines (90 loc) · 4.83 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
name: Deploy Backend to EC2
on:
push:
branches:
- developV2
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
# SSH 접속 타임아웃 (다이얼 실패 시 짧게 끝나는 경우 많음 → SG/GitHub 호스트 허용 점검)
timeout: 2m
# EC2에서 Gradle 빌드·이미지 생성이 길 수 있음 (기본 10m 초과 시 여기만 늘리면 됨)
command_timeout: 20m
script: |
set -euo pipefail
diag() {
echo "---- deploy_diag ----"
echo "host: $(hostname)"
pwd
ls -la ~/devpick-backend | head -20 || true
docker compose ps 2>/dev/null || true
docker compose logs app --tail=80 2>/dev/null || true
echo "---- end_deploy_diag ----"
}
trap diag ERR
cd ~/devpick-backend
export GIT_TERMINAL_PROMPT=0
git remote -v || true
# EC2 쪽 원격 추적 ref 가 꼬이면 다음 오류가 난다:
# cannot lock ref 'refs/remotes/origin/developV2': is at ... but expected ...
git remote prune origin || true
git fetch origin "+refs/heads/developV2:refs/remotes/origin/developV2" || {
echo "::error title=GIT_FETCH_FAILED::원격 브랜치를 가져오지 못했습니다(EC2 저장소 상태나 네트워크·private repo 접근 확인)."
exit 1
}
git checkout developV2
git reset --hard origin/developV2
# 이전 배포에서 남은 동일 이름 컨테이너/고아 컨테이너로 인한 Conflict 방지 (볼륨은 유지)
docker compose down --remove-orphans || true
docker compose up -d --build
if [ -d monitoring ]; then
(cd monitoring && docker compose up -d) \
|| echo "::warning title=MONITORING_DEPLOY_FAILED::모니터링 스택(Prometheus/Grafana/Loki/Promtail) 기동에 실패했습니다. monitoring/.env 또는 Docker 네트워크를 확인하세요."
fi
trap - ERR
# 저품질/더미 채용공고 삭제 — 실패 시에도 재배포는 완료되도록 처리(로그만 남김)
set +u
set -a
[ -f .env ] && . ./.env
set +a
set -u
DB_HOST="${DB_HOST:-postgres}"
DB_PORT="${DB_PORT:-5432}"
DB_USERNAME="${DB_USERNAME:-devpick}"
DB_NAME="${DB_NAME:-devpick}"
if [ "$DB_HOST" = "postgres" ]; then
for _ in $(seq 1 30); do
docker compose exec -T postgres pg_isready -U "$DB_USERNAME" -d "$DB_NAME" && break
sleep 2
done
docker compose exec -T postgres psql -U "$DB_USERNAME" -d "$DB_NAME" -v ON_ERROR_STOP=1 \
< scripts/migrate-users-job-check-constraint.sql \
|| echo "::warning title=JOB_CHECK_MIGRATION_FAILED::users.job CHECK 제약 마이그레이션에 실패했습니다. 필요 시 서버에서 수동 실행 하세요."
docker compose exec -T postgres psql -U "$DB_USERNAME" -d "$DB_NAME" -v ON_ERROR_STOP=1 \
< scripts/delete-low-quality-job-postings.sql \
|| echo "::warning title=JOB_CLEANUP_FAILED::delete-low-quality SQL 실행에 실패했습니다. 필요 시 서버에서 수동 실행 하세요."
else
if [ -z "${DB_PASSWORD:-}" ]; then
echo "::warning title=DB_MIGRATION_SKIPPED::외부 DB 사용 중인데 EC2 의 .env 에 DB_PASSWORD 가 없습니다. DB 마이그레이션·CLEANUP 단계 건너뜁니다."
else
export PGPASSWORD="$DB_PASSWORD"
docker run --rm --network host -e PGPASSWORD \
-v "$(pwd)/scripts/migrate-users-job-check-constraint.sql:/migrate.sql:ro" \
postgres:16-alpine \
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USERNAME" -d "$DB_NAME" -v ON_ERROR_STOP=1 -f /migrate.sql \
|| echo "::warning title=JOB_CHECK_MIGRATION_FAILED::외부 DB users.job CHECK 제약 마이그레이션에 실패했습니다."
docker run --rm --network host -e PGPASSWORD \
-v "$(pwd)/scripts/delete-low-quality-job-postings.sql:/cleanup.sql:ro" \
postgres:16-alpine \
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USERNAME" -d "$DB_NAME" -v ON_ERROR_STOP=1 -f /cleanup.sql \
|| echo "::warning title=JOB_CLEANUP_FAILED::외부 DB cleanup SQL 에 실패했습니다."
fi
fi