From 45cc80b60a4bbd0d5421a4ef6831b704cf85295e Mon Sep 17 00:00:00 2001 From: Mina Choi Date: Tue, 1 Sep 2026 10:20:12 +0900 Subject: [PATCH] =?UTF-8?q?[chore]=20deploy:=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=EC=8B=9C=20origin/main=20=ED=95=98=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EC=85=8B=20=E2=80=94=20fetch=20=EC=84=B1=EA=B3=B5=EC=97=90?= =?UTF-8?q?=EB=A7=8C=20=EA=B1=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배포 서버의 작업트리는 main 의 사본이지 작업 공간이 아니다. pull(--ff-only)은 force-push 가 나면 막히고, 서버에서 손댄 흔적도 남는다. - deploy.sh: git pull → fetch + reset --hard origin/$BRANCH. ★ fetch 실패 시 리셋하지 않는다. 킹서버엔 gitea 자격증명이 없어 fetch 가 죽는데, 그 상태의 origin/main 은 낡은 ref 다 — 실측 HEAD=9b4fe40 / origin/main=4871e50, 믿고 리셋하면 한 커밋 롤백되고 빌드는 성공한다. 조용히 틀리는 종류다. - git clean 은 넣지 않는다. .env·nginx/site.conf 는 추적되지 않는 파일이라 clean 이 지운다. - DEPLOY_BRANCH 로 대상 브랜치를 바꿀 수 있다(기본 main). 킹서버에서 실행 검증: fetch 실패 → 리셋 건너뜀, HEAD 9b4fe40 유지, solution-site 재생성 정상. bash -n 통과. --- deploy.sh | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/deploy.sh b/deploy.sh index fb15edf..a295ee1 100755 --- a/deploy.sh +++ b/deploy.sh @@ -12,6 +12,7 @@ cd "$(dirname "$0")" PREFIX=o2o-web4ai # api·worker·api-admin 은 이미지 한 벌(o2o-web4ai-backend)을 나눠 쓴다. BACKEND_SVCS=(solution-backend solution-worker admin-backend) +BRANCH=${DEPLOY_BRANCH:-main} PULL=1 ONLY=0 @@ -22,10 +23,13 @@ usage() { 사용법: ./deploy.sh [옵션] [서비스...] 옵션 - --no-pull git pull 을 건너뛴다(디스크에 있는 코드 그대로 빌드) + --no-pull 코드를 당기지 않는다(디스크에 있는 코드 그대로 빌드) --only 백엔드 형제 서비스를 함께 갈아끼우지 않는다 (아래 ★ 참고) -h, --help + 환경변수 + DEPLOY_BRANCH 기본 main. 다른 브랜치를 배포할 때만 쓴다 + 서비스: solution-backend · solution-worker · solution-frontend · solution-site admin-backend · admin-frontend (프로필 admin, 기본 기동에서 빠져 있다) o2o-web4ai-solution-backend 처럼 컨테이너명으로 적어도 된다 @@ -57,11 +61,31 @@ for t in ${TARGETS+"${TARGETS[@]}"}; do done # ── 코드 ──────────────────────────────────────────────────────────── +# 배포 서버의 작업트리는 main 의 **사본**이지 작업 공간이 아니다. 그래서 머지(pull)가 아니라 +# origin/$BRANCH 로 하드 리셋한다 — 밖에서 force-push 가 나도 --ff-only 로 막히지 않고, +# 서버에서 누가 손댄 흔적이 다음 배포까지 살아남지 않는다. +# +# ★ fetch 가 실패하면 **리셋하지 않는다.** 이 서버엔 gitea 자격증명이 없어 fetch 가 죽는데, +# 그 상태의 origin/$BRANCH 는 마지막으로 fetch 된 낡은 ref 다. +# 실측(2026-09-01 킹서버): HEAD=9b4fe40 인데 origin/main=4871e50 — 믿고 리셋하면 한 커밋 +# 롤백된다. 그러고도 빌드는 성공하고 컨테이너는 뜬다. 조용히 틀리는 종류다. +# +# ★ git clean 은 하지 않는다. .env 와 nginx/site.conf 는 추적되지 않는 파일이고 서버마다 +# 다르다 — reset --hard 는 이 둘을 건드리지 않지만 clean 은 지운다. if [ "$PULL" = 1 ]; then - echo "▶ git pull" - if ! git pull --ff-only 2>&1; then - echo " ! 당기지 못했다 — 디스크에 있는 코드 그대로 간다." >&2 - echo " (원격 인증이 없으면 밖에서 밀어넣고 --no-pull 로 돌린다)" >&2 + echo "▶ git fetch origin $BRANCH" + if git fetch --prune origin "$BRANCH" 2>&1; then + DIRTY=$(git status --porcelain) + if [ -n "$DIRTY" ]; then + echo " ! 작업트리 변경을 버린다:" + sed 's/^/ /' <<<"$DIRTY" + fi + echo "▶ git reset --hard origin/$BRANCH" + git reset --hard "origin/$BRANCH" + else + echo " ! fetch 실패 — 리셋을 건너뛰고 디스크에 있는 코드 그대로 간다." >&2 + echo " origin/$BRANCH 가 낡았을 수 있어 그걸로 리셋하면 배포가 조용히 롤백된다." >&2 + echo " (밖에서 밀어넣었으면 이대로 두면 되고, 자동화하려면 gitea 배포키를 건다)" >&2 fi fi echo "▶ 지금 코드: $(git log --oneline -1)"