실제 브라우저로 '다 조립된 앱'(프론트+백엔드+DB)을 태우는 통합 테스트 6개: - 인증 가드(비로그인→로그인), 로그인 실패 안내, 학생 로그인→대시보드 - 학습 센터→강좌 열기, 퀴즈 풀기→제출→서버 채점 결과 - 멘토 로그인→멘토 화면+개인정보 접근 기록(SEC-02 감사로그까지 검증) 운영 무오염 설계: - deploy/docker-compose.e2e.yml — 별도 프로젝트(mirime2e)·네트워크·휘발성 DB(tmpfs) - deploy/Caddyfile.e2e — 평문 HTTP로 SPA+/api 프록시(운영과 동일 구조) - deploy/e2e.sh — 스택 기동→테스트 학생 API 생성→퀴즈 slug 자동조회→ Playwright(브라우저 내장 이미지) 실행→down -v(정리) - 백엔드 힙 256MB 제한(작은 인스턴스에서 운영과 공존) EC2에서 6/6 통과 확인. 러너가 운영과 같은 인스턴스라 push마다가 아닌 온디맨드(릴리스 전)로 운영 — 전용 러너 확보 시 CI 게이트로 승격. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
2.0 KiB
YAML
60 lines
2.0 KiB
YAML
# E2E 전용 임시 스택 — 운영과 완전히 격리(별도 프로젝트명 mirime2e, 별도 네트워크, 휘발성 DB).
|
|
# 운영 DB/컨테이너는 절대 건드리지 않는다. E2E가 끝나면 통째로 내려간다(down -v).
|
|
#
|
|
# 학습 포인트: E2E는 "진짜 같은 환경"이되 "버려도 되는 환경"이라야 한다.
|
|
# - Postgres 데이터는 tmpfs(메모리)에 둬 매 실행 깨끗하게 시작하고 흔적을 안 남긴다.
|
|
# - 백엔드 힙을 256MB로 제한해(작은 인스턴스에서 운영과 공존) 자원을 아낀다.
|
|
# - 멘토 초기 비밀번호를 알려진 값으로 고정해 E2E가 로그인할 수 있게 한다.
|
|
name: mirime2e
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:17-alpine
|
|
environment:
|
|
POSTGRES_DB: mirim
|
|
POSTGRES_USER: mirim
|
|
POSTGRES_PASSWORD: e2epass
|
|
tmpfs:
|
|
- /var/lib/postgresql/data # 휘발성 — 매 실행 새 DB, 디스크에 안 남음
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U mirim"]
|
|
interval: 4s
|
|
timeout: 5s
|
|
retries: 15
|
|
|
|
backend:
|
|
build: ../backend
|
|
environment:
|
|
DB_HOST: postgres
|
|
DB_PORT: 5432
|
|
DB_NAME: mirim
|
|
DB_USER: mirim
|
|
DB_PASSWORD: e2epass
|
|
COOKIE_SECURE: "false" # 평문 HTTP라 secure 쿠키는 꺼야 로그인된다
|
|
LOG_LEVEL: INFO
|
|
MENTOR_INITIAL_PASSWORD: e2e-mentor-pass
|
|
JAVA_TOOL_OPTIONS: "-Xmx256m" # 작은 인스턴스에서 운영과 공존하도록 힙 제한
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
|
|
# 프론트 빌드 결과물을 webroot 볼륨에 복사(운영과 동일한 방식)
|
|
frontend-build:
|
|
build: ../frontend
|
|
volumes:
|
|
- webroot:/out
|
|
|
|
caddy:
|
|
image: caddy:2-alpine
|
|
ports:
|
|
- "8899:80" # 호스트 8899 → E2E 사이트(운영 80/443과 안 겹침)
|
|
volumes:
|
|
- ./Caddyfile.e2e:/etc/caddy/Caddyfile:ro
|
|
- webroot:/srv:ro
|
|
depends_on:
|
|
- backend
|
|
- frontend-build
|
|
|
|
volumes:
|
|
webroot:
|