콘텐츠로 이동

2.2.7 릴리스 실행 기록

{
  "schema": "release-metadata/v1",
  "version": "v2.2.7",
  "status": "released",
  "releaseScopes": [
    "contracts-package",
    "coupler-api",
    "coupler-admin-web",
    "mobile-nextpush",
    "docs"
  ],
  "extraRepoRefs": [],
  "versionMapping": {
    "docs": {
      "tag": "v2.2.7",
      "commit": null
    },
    "coupler-api": {
      "tag": "v2.2.5",
      "commit": "c8729270c8de2b41f34be8fe116f9312efdab48b"
    },
    "coupler-admin-web": {
      "tag": "v2.1.5",
      "commit": "d58040f8a5b756ebc488a2d3a335cc556ac9bc09"
    },
    "coupler-mobile-app": {
      "store": "2.2.1 (100)",
      "releaseTag": null,
      "commit": "a615e5e55fe8cb10c933c8e89fcd434eff076b02",
      "nextPush": "Android Production v23; iOS Production v20"
    }
  },
  "scopeResults": {
    "contracts-package": {
      "status": "released",
      "summary": "contracts package 0.1.5 발행과 API/Admin/Mobile exact dependency 정렬을 확인했다.",
      "evidence": {
        "publishedPackage": "@coupler-developer/coupler-api-contracts@0.1.5",
        "workflow": "Release Contracts run 29155371844 success, completed 2026-07-11T14:02:42Z",
        "sourceRef": "c8729270c8de2b41f34be8fe116f9312efdab48b"
      }
    },
    "coupler-api": {
      "status": "released",
      "summary": "운영 API를 main c872927 기준으로 fast-forward 배포하고 PM2 재시작 및 핵심 API smoke를 완료했다.",
      "evidence": {
        "deployment": "2026-07-13 22:34 KST production EC2 target을 확인하고 coupler-api를 c8729270c8de2b41f34be8fe116f9312efdab48b로 fast-forward했다. pnpm install --frozen-lockfile, pm2 restart coupler-api --update-env, pm2 save가 통과했다.",
        "smoke": "서버 내부 http://127.0.0.1:3002/와 외부 https://api.ritzy.fourhundred.co.kr/가 HTTP 200을 반환했다. PM2 coupler-api가 online이고 새 프로세스 로그에서 server started on port 3002를 확인했다. getSettingList version_code=100은 ok=true, force_update=0, version_code=1은 ok=true, force_update=2를 반환했다.",
        "rollback": "배포 직전 운영 SHA ac46b79e7298c7c04004279629e8ed9495d21681 또는 직전 운영 태그 v2.2.4로 복구한 뒤 pm2 coupler-api를 재시작한다."
      }
    },
    "coupler-admin-web": {
      "status": "released",
      "summary": "운영 Admin 정적 build를 main d58040f 기준으로 배포하고 nginx 및 운영 화면 smoke를 완료했다.",
      "evidence": {
        "deployment": "2026-07-13 KST production Admin target을 확인하고 local production build d58040f8a5b756ebc488a2d3a335cc556ac9bc09를 rsync --delete로 배포했다. nginx -t와 systemctl restart nginx가 통과했으며 timestamped backup artifact를 보존했다.",
        "smoke": "서버 내부 http://127.0.0.1:8000과 외부 https://cms.ritzy.fourhundred.co.kr가 HTTP 200을 반환했다. asset-manifest에서 main.66fc68f7.js와 main.fa65b435.css를 확인했다.",
        "rollback": "보존한 timestamped production Admin backup을 rsync 복원하고 nginx를 재시작하거나 직전 Admin 태그 v2.1.4를 다시 build한다."
      }
    },
    "mobile-nextpush": {
      "status": "released",
      "summary": "Store 2.2.1 (100)을 대상으로 main a615e5e의 Android/iOS Production NextPush를 배포했다. Store 재제출과 신규 native tag는 범위가 아니다.",
      "evidence": {
        "app": "Android bluedotstudio.official-gmail.com/coupler; iOS bluedotstudio.official-gmail.com/coupler-ios",
        "productionLabel": "Android Production v23; iOS Production v20",
        "targetBinary": "2.2.1 (100)",
        "uploadedAt": "Android 2026-07-13T13:31:02.181Z; iOS 2026-07-13T13:31:42.176Z",
        "rollout": "Android 100; iOS 100",
        "mandatory": "Android false; iOS false",
        "disabled": "Android false; iOS false"
      }
    },
    "docs": {
      "status": "released",
      "summary": "운영 배포 결과와 API/Admin 서비스 태그를 반영했으며 최종 기록 merge 후 docs v2.2.7 tag를 생성한다.",
      "evidence": {}
    }
  },
  "apiContractCutover": null
}

문서 역할

  • 역할: 시나리오
  • 문서 종류: flow
  • 충돌 시 우선 문서: policy/release-process.md, 태그 기준은 policy/release-tag-policy.md
  • 기준 성격: as-is

목적

  • contracts package 0.1.5로 정렬된 API/Admin/Mobile의 운영 배포 기준점과 검증 결과를 고정한다.
  • Mobile Store 2.2.1 (100)을 유지하면서 Android/iOS NextPush Production을 별도 운영 범위로 기록한다.

범위

  • 대상: docs, coupler-api, coupler-admin-web, coupler-mobile-app
  • 포함 범위: contracts package 0.1.5 발행 증빙, API/Admin 운영 배포, Mobile Android/iOS NextPush Production, 서비스 태그, docs 릴리즈 기록
  • 제외 범위: 운영 DB 변경, Mobile Store 제출/승인/출시, native version/build 변경, legacy URL-encoded parser 제거와 API contract cutover

상위 규범 문서

릴리스 상태

  • 목표 버전: v2.2.7
  • 전체 상태: released
  • 완료 범위: contracts package 0.1.5 발행, API/Admin 운영 배포와 smoke, Mobile Android/iOS Production NextPush, API/Admin 서비스 태그, docs 최종 기록
  • 대기 범위: N/A

버전 매핑

  • docs: 기록 버전·태그 v2.2.7
  • coupler-api: 태그 v2.2.5, 커밋 c8729270c8de2b41f34be8fe116f9312efdab48b
  • coupler-admin-web: 태그 v2.1.5, 커밋 d58040f8a5b756ebc488a2d3a335cc556ac9bc09
  • coupler-mobile-app: Store 2.2.1 (100), 릴리스 태그 N/A (NextPush-only), 커밋 a615e5e55fe8cb10c933c8e89fcd434eff076b02, NextPush Android Production v23; iOS Production v20
  • coupler-mobile-app 제출 마커 태그: N/A (Mobile Store 제출 없음)
  • 제출 마커 증빙 이관/삭제: N/A (Mobile Store 제출 없음)

릴리스 결과

  • contracts package 0.1.5 발행과 세 레포의 exact version 정렬을 확인했다.
  • Admin build를 운영 nginx에 배포하고 내부·외부 HTTP 200과 새 asset manifest를 확인했다.
  • Mobile Store 2.2.1 (100)에 Android Production v23, iOS Production v20을 100% 비강제·활성 상태로 배포했다.
  • API 운영 EC2를 c872927로 fast-forward하고 PM2 online, 내부·외부 HTTP 200, 앱 버전 gate 응답을 확인했다.
  • 운영 검증 후 API v2.2.5, Admin v2.1.5 annotated tag를 발행했다.
  • 이번 배포는 기존 URL-encoded Mobile 요청 호환 parser를 유지하는 호환 배포이며 legacy cutover가 아니다.

메인 흐름

  1. 네 레포의 clean mainorigin/main 일치를 확인한다.
  2. contracts package 0.1.5 발행 및 API/Admin/Mobile dependency 정렬을 확인한다.
  3. 각 레포 표준 품질 게이트와 docs preflight를 통과한다.
  4. Admin 정적 build, Mobile NextPush, API 운영 EC2 순서로 배포하고 범위별 smoke를 수행한다.
  5. 운영 검증 완료 후 API v2.2.5, Admin v2.1.5, docs v2.2.7 annotated tag와 최종 증빙을 확정한다.

검증 근거

  • contracts package: @coupler-developer/coupler-api-contracts@0.1.5
  • Release Contracts workflow: run 29155371844, source ref c8729270c8de2b41f34be8fe116f9312efdab48b, success
  • 소비자 dependency: Admin/Mobile package.json과 lockfile 0.1.5 exact pin
  • API 품질 게이트: lint, typecheck, format, tests, contracts check와 package pack 통과
  • Admin 품질 게이트: lint, typecheck, format, 9 suites·72 tests, production build 통과
  • Mobile 품질 게이트: PR #157 CI eslint/prettier/storybook/test/typecheck 및 local 51 suites·367 tests·10 snapshots 통과
  • Admin 운영 smoke: internal/external HTTP 200, asset-manifest main.66fc68f7.js, main.fa65b435.css
  • Mobile 운영 smoke: Android Production v23, iOS Production v20, rollout 100, mandatory false, disabled false
  • API 운영 smoke: deployed SHA c872927, PM2 online, internal/external HTTP 200, version code 100/1 force_update 0/2
  • API contract cutover: N/A - URL-encoded 호환 parser와 기존 Store 2.2.1 (100) 지원을 유지하는 호환 배포이며 legacy 경로를 제거하지 않음

Mobile 개발계 QA 빌드 기록

  • 기록일: N/A (운영 NextPush만 포함)
  • API 대상: 운영 API
  • iOS TestFlight QA 빌드: N/A
  • Android QA APK: N/A
  • 운영 릴리즈 전 확인: Mobile USE_DEV_EC2=false, Store 2.2.1 (100), contracts 0.1.5

롤백 기준

  • API: 직전 운영 태그 v2.2.4 또는 배포 직전 운영 SHA로 fast-forward 가능한 복구 브랜치를 준비한 뒤 PM2를 재시작한다.
  • Admin: 업로드 직전 /var/www/coupler-admin-web-backup-<timestamp>를 복원하고 nginx를 재시작한다.
  • Mobile NextPush: Android/iOS Production을 직전 label로 rollback하고 deployment history에서 상태를 재확인한다.
  • DB: N/A (운영 DB 변경 없음)

후속 작업

  • docs 최종 기록 merge 후 annotated tag v2.2.7을 발행한다.
  • URL-encoded parser 제거는 legacy traffic Gate를 충족한 별도 cutover PR과 릴리즈로 수행한다.