Summary

CI/CD를 CI / CD 워크플로 분리로 정리하고, Actions 이름을 읽기 쉽게 맞춘 뒤 main까지 반영했다. 이어서 **React hydration 418 수정, 모바일·데스크톱 헤더/navigation 개선(TASK-020~023)을 develop에 merge했다.


CI/CD — TASK-019

배경

  • TASK-018 workflow_call 이후: push당 CI run + Deploy Dev/Prod child run 2줄 (배포 2회는 아님)
  • 목표: push당 workflow run 1개, PR은 validate만

구현

BeforeAfter
ci.yml PR + push + deployci.ymlPR only → validate
deploy-dev.yml / deploy-prod.ymlcd.yml — push + dispatch → validate → deploy
workflow_call제거 (workflow_run / workflow_call 0건)

Follow-up — Actions naming (PR #41)

  • Sidebar: goodtek-web · CI (Pull Request), goodtek-web · CD (Deploy)
  • Run title: CI · PR #N · head → base, CD · dev · push develop
  • Job: Gate · lint & build, Deploy · dev (dev.goodtek.xyz)

Release

  • PR #42 developmain merge
  • Prod CD run CD · prod · push main success

문서

  • docs/project/06-decisions.md — D-012~D-015 (콘텐츠 채널, CI/CD split, Actions naming)

Frontend fixes & UX — TASK-020 ~ 023

TASK-020 — React hydration #418

  • 증상: prod 콘솔 Minified React error #418 (text mismatch)
  • 원인: home 카드 Intl.DateTimeFormattimeZone 없음 → SSR(UTC) vs 브라우저(KST) 날짜 문자열 불일치
  • 수정: apps/web/src/lib/format-date.tsformatPublishedDate() + timeZone: "Asia/Seoul"
  • PR: #43

TASK-021 — Mobile navigation

  • < md: 햄버거 → 왼쪽 Sheet 드로어 (shadcn)
  • nav 6개 단일 정의: header-nav-items.ts
  • Auth Option A: 로그인 + 회원가입 드로어 footer (헤더는 Logo + Menu만)
  • breakpoint: nav md+, mobile md:hidden
  • PR: #45

TASK-022 — Mobile drawer header

  • 드로어 상단 「Menu」/「메뉴」→ Logo (sr-only SheetTitle 유지)
  • 로고 탭 → 홈 + 드로어 닫기 (Logo.onNavigate)
  • PR: #47

TASK-023 — Desktop header

  • Nav 그룹: site(만들기·소개) │ content(블로그·노트·커뮤니티) │ contact(문의)
  • Active state: / → 만들기, /about → 소개
  • 외부 링크 ↗ (데스크톱 nav)
  • Auth: Log in 텍스트 링크 + Sign up compact primary pill (headerSignupCtaClassName)
  • nav / auth border-l 구분
  • PR: #49

세션 중 UX polish (TASK-023 이후)

  • md 근처 Log in 두 줄 → auth whitespace-nowrap + shrink-0
  • en 라벨 Log in / Sign up 띄어쓰기 통일
  • (논의) 데스크톱 ↗ 아이콘은 선택 — 산만하면 desktop만 제거 검토

PR / merge 타임라인

PR내용target
#39TASK-019 CI/CD 분리develop
#40Release develop → mainmain
#41TASK-019 Actions namingdevelop
#42Release (naming 포함)main
#43TASK-020 hydration #418develop
#45TASK-021 mobile navdevelop
#47TASK-022 drawer logodevelop
#49TASK-023 desktop menudevelop

Actions 기대 동작 (after TASK-019)

이벤트Run
PR → develop/maingoodtek-web · CI 1개
push developgoodtek-web · CD · dev 1개
push maingoodtek-web · CD · prod 1개

Files touched (high level)

.github/workflows/ci.yml # PR only .github/workflows/cd.yml # push + dispatch (new) .github/workflows/deploy-*.yml # deleted

apps/web/src/lib/format-date.ts apps/web/src/components/header/* # MobileNav, HeaderDesktopNav, … apps/web/src/components/ui/sheet.tsx apps/web/src/components/Header.tsx apps/web/src/components/HeaderAuth.tsx apps/web/src/components/Logo.tsx apps/web/src/lib/cta.ts

docs/project/03-architecture.md docs/project/05-current-state.md docs/project/06-decisions.md docs/tasks/TASK-019 ~ TASK-023


Verify checklist

  • pnpm lint / pnpm build (각 TASK)

  • CI/CD smoke (PR #39~#42, CD run IDs in TASK-019)

  • TASK-020 prod console — /ko /en hard refresh, #418 없음

  • Mobile 375px — Menu → 6 links, drawer logo, auth footer

  • Desktop 768px~1280px — nav groups, Sign up pill, Log in 한 줄

  • Release PR #49 이후 developmain (미실행 시 pending)


Next / open

  • developmain Release (TASK-020~023 prod 반영)

  • (선택) 데스크톱 nav 외부 ↗ 아이콘 제거

  • (선택) CD workflow_dispatch dev/prod 수동 smoke

  • Notes Infisical env (TASK-017 human checklist) — 서버 반영 여부 확인