From 1c0176640e941df56bb221004f59e7154ad83ac4 Mon Sep 17 00:00:00 2001 From: ttipo Date: Thu, 17 Sep 2026 22:45:26 +0900 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=BB=A8=ED=85=8C=EC=9D=B4=EB=84=88=20=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EC=A0=9C=EA=B1=B0=20=E2=80=94=20=EC=9E=A1?= =?UTF-8?q?=EC=9D=B4=20=EC=8B=9C=EC=9E=91=EC=A1=B0=EC=B0=A8=20=EB=AA=BB=20?= =?UTF-8?q?=ED=95=98=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 러너를 붙이고 첫 실행에서 backend 잡의 모든 스텝이 checkout 부터 failure 로 표시됐다. 스텝이 실패한 게 아니라 서비스 컨테이너가 뜨지 못해 잡 준비 단계에서 죽은 것이다. 원인은 postgres 서비스의 ports: 5432:5432 였다. 개발 DB(project-db)가 이미 호스트 5432 를 점유하고 있어 바인딩이 충돌했다. Gitea 러너는 잡을 컨테이너로 실행하고 서비스와 같은 네트워크에 붙이므로 호스트 포트 매핑이 애초에 필요 없고, 접근도 localhost 가 아니라 서비스 이름으로 해야 한다. (GitHub Actions 는 잡이 VM 위에서 직접 돌아 localhost + ports 를 쓰는 점이 다르다) - 서비스의 ports 매핑 제거 - e2e 스텝의 DB_HOST 를 localhost → postgres(서비스 이름)로 변경 - 두 플랫폼의 차이와 "모든 스텝이 한꺼번에 실패" 증상을 ci/README.md 에 정리 Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 13 +++++++++---- ci/README.md | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0b1e0d..125a6f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,13 @@ jobs: defaults: run: working-directory: backend - # e2e 는 응답 계약을 실제 HTTP 로 검증하므로 DB 가 필요하다 + # e2e 는 응답 계약을 실제 HTTP 로 검증하므로 DB 가 필요하다. + # + # ⚠️ 호스트 포트 매핑(ports)을 두지 않는다. + # Gitea Actions 러너는 잡을 **컨테이너로** 실행하고 서비스와 같은 네트워크에 붙여준다. + # 따라서 서비스 이름(postgres)으로 바로 접근할 수 있고, 호스트 포트는 필요 없다. + # 오히려 개발 DB 가 이미 5432 를 쓰고 있으면 충돌해 잡 전체가 시작조차 못 한다. + # (GitHub Actions 는 잡이 VM 위에서 직접 돌아 localhost + ports 를 쓰는 점이 다르다) services: postgres: image: postgres:15-alpine @@ -25,8 +31,6 @@ jobs: POSTGRES_USER: ci_user POSTGRES_PASSWORD: ci_password POSTGRES_DB: ci_db - ports: - - 5432:5432 options: >- --health-cmd "pg_isready -U ci_user -d ci_db" --health-interval 10s @@ -55,7 +59,8 @@ jobs: run: npm run test:e2e env: NODE_ENV: test - DB_HOST: localhost + # 서비스 컨테이너의 네트워크 별칭 (localhost 는 잡 컨테이너 자신을 가리킨다) + DB_HOST: postgres DB_PORT: 5432 DB_USER: ci_user DB_PASSWORD: ci_password diff --git a/ci/README.md b/ci/README.md index 549e4a7..167212d 100644 --- a/ci/README.md +++ b/ci/README.md @@ -39,6 +39,23 @@ docker compose -f docker-compose.runner.yml --env-file .env logs -f runner | `uses:` 액션 다운로드 실패 | 서버에서 github.com 접근 불가 | 방화벽 확인. 폐쇄망이면 액션 미러 필요 | | 등록 실패 (401/404) | 토큰 만료·오타, URL 끝 `/` | 토큰 재발급, `GITEA_INSTANCE_URL` 확인 | | 잡 시작 직후 실패 | 도커 소켓 마운트 누락 | `/var/run/docker.sock` 마운트 확인 (Windows 는 `//var/run/docker.sock`) | +| **모든 스텝이 한꺼번에 실패**(checkout 포함) | 서비스 컨테이너가 뜨지 못함 | 아래 "서비스 컨테이너" 참고 | + +## 서비스 컨테이너 주의 (GitHub Actions 와 다른 점) + +Gitea 러너는 잡을 **컨테이너로** 실행하고 서비스와 같은 네트워크에 붙인다. +GitHub Actions 는 잡이 VM 위에서 직접 돌기 때문에 관례가 다르다. + +| | GitHub Actions | Gitea act_runner | +| --- | --- | --- | +| 서비스 접근 주소 | `localhost` + `ports` 매핑 | **서비스 이름** (`postgres:5432`) | +| `ports:` 필요 여부 | 필요 | **불필요 — 오히려 해롭다** | + +`ports: - 5432:5432` 를 두면 호스트 포트를 점유하려 하는데, +개발 DB 가 이미 그 포트를 쓰고 있으면 **잡이 시작조차 못 하고 모든 스텝이 failure 로 표시된다.** +(스텝이 실패한 게 아니라 잡 준비 단계에서 죽은 것이다) + +`ci.yml` 의 backend 잡은 이 규칙에 맞춰 `ports` 없이 `DB_HOST: postgres` 를 쓴다. ## 리소스 참고