fix(deploy): webhook 자기재배포 흐름 완성 — deploy.sh sh 명시 호출 + build-sha 생성
Deploy momo-erp / deploy (push) Failing after 16m1s
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:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user