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 NextPushProduction을 별도 운영 범위로 기록한다.
범위¶
- 대상:
docs,coupler-api,coupler-admin-web,coupler-mobile-app - 포함 범위: contracts package
0.1.5발행 증빙, API/Admin 운영 배포, Mobile Android/iOS NextPushProduction, 서비스 태그, 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.7coupler-api: 태그v2.2.5, 커밋c8729270c8de2b41f34be8fe116f9312efdab48bcoupler-admin-web: 태그v2.1.5, 커밋d58040f8a5b756ebc488a2d3a335cc556ac9bc09coupler-mobile-app: Store2.2.1 (100), 릴리스 태그N/A(NextPush-only), 커밋a615e5e55fe8cb10c933c8e89fcd434eff076b02, NextPushAndroid Production v23; iOS Production v20coupler-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 Productionv23, iOS Productionv20을 100% 비강제·활성 상태로 배포했다. - API 운영 EC2를
c872927로 fast-forward하고 PM2 online, 내부·외부 HTTP 200, 앱 버전 gate 응답을 확인했다. - 운영 검증 후 API
v2.2.5, Adminv2.1.5annotated tag를 발행했다. - 이번 배포는 기존 URL-encoded Mobile 요청 호환 parser를 유지하는 호환 배포이며 legacy cutover가 아니다.
메인 흐름¶
- 네 레포의 clean
main과origin/main일치를 확인한다. - contracts package
0.1.5발행 및 API/Admin/Mobile dependency 정렬을 확인한다. - 각 레포 표준 품질 게이트와 docs preflight를 통과한다.
- Admin 정적 build, Mobile NextPush, API 운영 EC2 순서로 배포하고 범위별 smoke를 수행한다.
- 운영 검증 완료 후 API
v2.2.5, Adminv2.1.5, docsv2.2.7annotated tag와 최종 증빙을 확정한다.
검증 근거¶
- contracts package:
@coupler-developer/coupler-api-contracts@0.1.5 - Release Contracts workflow: run
29155371844, source refc8729270c8de2b41f34be8fe116f9312efdab48b, success - 소비자 dependency: Admin/Mobile
package.json과 lockfile0.1.5exact 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 Productionv20, 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와 기존 Store2.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, Store2.2.1 (100), contracts0.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과 릴리즈로 수행한다.