fix(deploy): webhook 자기재배포 흐름 완성 — deploy.sh sh 명시 호출 + build-sha 생성
Deploy momo-erp / deploy (push) Failing after 16m1s

- src/app/api/deploy/webhook/route.ts:
  + DEPLOY_SCRIPT 기본값 → /deploy/source/scripts/deploy.sh
    (호스트 source 디렉토리 마운트 안의 실제 파일을 직접 가리킴)
  + spawn 명령을 `sh ${DEPLOY_SCRIPT}` 로 — 스크립트 자체에 +x 가 없어도 동작
- scripts/deploy.sh:
  + git pull 직후 `git rev-parse HEAD > public/build-sha.txt`
    (옛 deploy.yml SSH 단계에서 박던 SHA 마커를 동일 위치에서 생성)

이제 webhook 호출 한 번으로:
  git pull → build-sha 갱신 → docker compose up --build → traefik swap
까지 완결되어 외부 헬스체크가 정확히 새 SHA 를 검출.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
chpark
2026-05-30 15:06:34 +09:00
parent f9c7e55eb0
commit e4b64af3da
2 changed files with 10 additions and 3 deletions
+4
View File
@@ -10,6 +10,10 @@ echo "[$(date)] git fetch + reset --hard origin/main"
git fetch origin
git reset --hard origin/main
# build-sha.txt — 헬스체크가 이 값으로 운영 반영 SHA 검증
git rev-parse HEAD > public/build-sha.txt
echo "[$(date)] ▶ 배포 대상 SHA: $(cat public/build-sha.txt)"
# 업로드 저장은 named volume(momo_data_storage)으로 이전됨 — 호스트 디렉토리 prep 불필요
echo "[$(date)] docker compose up --build"
docker compose -f docker-compose.prod.yml up -d --build
+6 -3
View File
@@ -8,7 +8,9 @@ import { writeFile, mkdir } from "node:fs/promises";
import path from "node:path";
const DEPLOY_TOKEN = process.env.DEPLOY_WEBHOOK_TOKEN || "momo-deploy-2026-secure";
const DEPLOY_SCRIPT = process.env.DEPLOY_SCRIPT || "/deploy/deploy.sh";
// 호스트 source 디렉토리는 docker-compose 에서 /deploy/source 로 바인드 마운트.
// /deploy/deploy.sh 는 :ro 마운트 + 실행권한 부재 케이스 있어 sh 로 명시 호출.
const DEPLOY_SCRIPT = process.env.DEPLOY_SCRIPT || "/deploy/source/scripts/deploy.sh";
export async function POST(req: NextRequest) {
const token = req.headers.get("x-deploy-token") || req.headers.get("X-Deploy-Token");
@@ -22,9 +24,10 @@ export async function POST(req: NextRequest) {
await writeFile(logPath, `[${new Date().toISOString()}] deploy 시작\n`);
} catch { /* ignore */ }
// 백그라운드 실행 — 응답은 즉시 반환
// 백그라운드 실행 — 응답은 즉시 반환.
// sh 인터프리터로 명시 호출(스크립트 자체에 exec 권한 없어도 동작).
const child = spawn("/bin/sh", ["-c",
`(${DEPLOY_SCRIPT} 2>&1 || echo "[deploy.sh 실행 실패 — 호스트에 docker.sock + 스크립트 마운트 필요]") >> ${logPath}`
`(sh ${DEPLOY_SCRIPT} 2>&1 || echo "[deploy.sh 실행 실패 — 호스트에 docker.sock + 스크립트 마운트 필요]") >> ${logPath}`
], { detached: true, stdio: "ignore" });
child.unref();