콘텐츠로 이동

2.2.5 릴리스 실행 기록

{
  "schema": "release-metadata/v1",
  "version": "v2.2.5",
  "status": "released",
  "releaseScopes": [
    "db-migration",
    "contracts-package",
    "coupler-api",
    "coupler-admin-web",
    "mobile-nextpush",
    "docs"
  ],
  "extraRepoRefs": [],
  "versionMapping": {
    "docs": {
      "tag": "v2.2.5",
      "commit": null
    },
    "coupler-api": {
      "tag": "v2.2.4",
      "commit": "ac46b79e7298c7c04004279629e8ed9495d21681"
    },
    "coupler-admin-web": {
      "tag": "v2.1.4",
      "commit": "96034847c7f567209c533fce17bd61e96dca8700"
    },
    "coupler-mobile-app": {
      "store": "2.2.1 (100)",
      "releaseTag": null,
      "commit": "161bd00869c0775a30b4175b803e95638cd246f5",
      "nextPush": "Android Production v22; iOS Production v19"
    }
  },
  "scopeResults": {
    "db-migration": {
      "status": "released",
      "summary": "개발계/운영계 모두 75/76 적용과 ledger 기록을 완료했다.",
      "evidence": {
        "sqlRefs": [
          {
            "repo": "coupler-api",
            "path": "db/migrations/75_expand_admin_manager_nickname.sql",
            "checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
            "gateIds": [
              "DBM-GATE-000",
              "DBM-GATE-010",
              "DBM-GATE-100"
            ]
          },
          {
            "repo": "coupler-api",
            "path": "db/migrations/76_postcheck_admin_manager_nickname.sql",
            "checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
            "gateIds": [
              "DBM-GATE-010",
              "DBM-GATE-100"
            ]
          }
        ],
        "gateResults": [
          {
            "gateId": "DBM-GATE-000",
            "status": "passed",
            "log": "2026-07-09 19:40 KST production preflight verified the database identity against private deployment evidence, confirmed the pre-expand column contract and zero overlength rows, and passed the migration 75 guard.",
            "reason": null
          },
          {
            "gateId": "DBM-GATE-010",
            "status": "passed",
            "log": "2026-07-09 19:40:54 KST prod schema_migrations rows recorded for 75/76 with matching SHA-256 checksums and target_env=prod.",
            "reason": null
          },
          {
            "gateId": "DBM-GATE-100",
            "status": "passed",
            "log": "2026-07-09 19:40 KST prod 75 returned DBM-GATE-100 OK and 76 returned admin manager nickname expand postcheck passed; final t_admin.nickname varchar(25) NOT NULL, nickname_over_25_count=0.",
            "reason": null
          },
          {
            "gateId": "DBM-GATE-200",
            "status": "not_applicable",
            "log": "2026-07-09 19:40 KST SQL header and migration review: data widening only, no backfill target.",
            "reason": "data widening only, no backfill required"
          },
          {
            "gateId": "DBM-GATE-300",
            "status": "not_applicable",
            "log": "2026-07-09 19:40 KST SQL header and migration review: same read/write column contract, no cutover.",
            "reason": "same read/write column contract, no cutover"
          },
          {
            "gateId": "DBM-GATE-400",
            "status": "not_applicable",
            "log": "2026-07-09 19:40 KST SQL header and migration review: no legacy object drop.",
            "reason": "no legacy object drop"
          }
        ],
        "preflightLog": "2026-07-09 17:33 and 19:40 KST dev/prod read-only preflight verified each database identity against private deployment evidence, checked the 75/76 ledger and target column contracts, confirmed row-safety counts, and found no running application query.",
        "ledger": {
          "dev": {
            "databaseIdentity": "development database identity matched the private deployment target",
            "log": "2026-07-09 17:33 KST dev schema_migrations read-only query",
            "rows": [
              {
                "migrationName": "75_expand_admin_manager_nickname.sql",
                "targetEnv": "dev",
                "checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
                "appliedAt": "2026-07-08 22:22:16 KST"
              },
              {
                "migrationName": "76_postcheck_admin_manager_nickname.sql",
                "targetEnv": "dev",
                "checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
                "appliedAt": "2026-07-08 22:22:16 KST"
              }
            ]
          },
          "prod": {
            "databaseIdentity": "production database identity matched the private deployment target",
            "log": "2026-07-09 19:40:54 KST prod schema_migrations query after 75/76 apply",
            "rows": [
              {
                "migrationName": "75_expand_admin_manager_nickname.sql",
                "targetEnv": "prod",
                "checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
                "appliedAt": "2026-07-09 19:40:54 KST"
              },
              {
                "migrationName": "76_postcheck_admin_manager_nickname.sql",
                "targetEnv": "prod",
                "checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
                "appliedAt": "2026-07-09 19:40:54 KST"
              }
            ]
          }
        },
        "postcheckLog": "2026-07-09 19:40 KST prod 76_postcheck_admin_manager_nickname.sql returned admin manager nickname expand postcheck passed; nickname_column_count=1, nickname_varchar_25_contract_count=1, nickname_not_null_contract_count=1, nickname_over_25_count=0.",
        "rollbackPlan": "Expand-only migration. If 75 fails before completion, stop and inspect actual column contract/ledger before retry. If 75 succeeds but 76 fails before API/Admin deployment, keep Admin writes frozen and either fix forward to varchar(25) postcheck success or restore from RDS snapshot according to DBM failure classification; do not contract back after API/Admin rollout without separate approval."
      }
    },
    "contracts-package": {
      "status": "released",
      "summary": "Release Contracts workflow와 Admin/Mobile dependency pin을 확인했다.",
      "evidence": {
        "publishedPackage": "@coupler-developer/coupler-api-contracts@0.1.1",
        "workflow": "Release Contracts run 28946135887 success, publish job 85880388116 success, completed 2026-07-08T13:25:46Z",
        "sourceRef": "ba57aa8d0e5636d3c56bc61ba4dd7653f2561920"
      }
    },
    "coupler-api": {
      "status": "released",
      "summary": "운영 API를 main ac46b79 기준으로 fast-forward 배포하고 PM2 재시작 및 smoke를 완료했다.",
      "evidence": {
        "deployment": "2026-07-09 KST the production EC2 target was verified and coupler-api was fast-forwarded to ac46b79e7298c7c04004279629e8ed9495d21681; pnpm install --frozen-lockfile passed; pm2 restart coupler-api --update-env and pm2 save passed.",
        "smoke": "2026-07-09 20:14 KST https://api.ritzy.fourhundred.co.kr/ HTTP/2 200; GET /app/auth/getSettingList?os=google&version_code=100 returned top-level keys ok,data with ok=true and force_update=0; version_code=1 returned ok,data with force_update=2.",
        "rollback": "Rollback to previous production tag v2.2.3 (ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d) or the predeploy PM2/git state, then restart pm2 coupler-api."
      }
    },
    "coupler-admin-web": {
      "status": "released",
      "summary": "운영 Admin build를 배포하고 nginx 검증, 외부 smoke, asset manifest 검증을 완료했다.",
      "evidence": {
        "deployment": "2026-07-09 KST local yarn build passed at 96034847c7f567209c533fce17bd61e96dca8700; the production Admin target was verified and rsync --delete deployed the build; nginx -t and systemctl restart nginx passed; a timestamped backup artifact was retained.",
        "smoke": "2026-07-09 20:09 KST server-internal http://127.0.0.1:8000 HTTP/1.1 200; 2026-07-09 20:10 KST https://cms.ritzy.fourhundred.co.kr HTTP/2 200; asset-manifest references main.60b2941d.js and main.2b8e6e15.css; backup quote incident remediated and external Admin remained HTTP 200.",
        "rollback": "Restore the retained timestamped production Admin backup and restart nginx, or rebuild previous Admin tag v2.1.3."
      }
    },
    "mobile-nextpush": {
      "status": "released",
      "summary": "Store 2.2.1 (100) binary를 대상으로 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 v22; iOS Production v19",
        "targetBinary": "2.2.1 (100)",
        "uploadedAt": "Android 2026-07-09T11:11:45.033Z; iOS 2026-07-09T11:12:29.655Z",
        "rollout": "Android 100; iOS 100",
        "mandatory": "Android false; iOS false",
        "disabled": "Android false; iOS false"
      }
    },
    "docs": {
      "status": "released",
      "summary": "최종 릴리즈 기록을 운영 반영 결과로 갱신하고 docs v2.2.5 tag를 생성한다.",
      "evidence": {}
    }
  },
  "apiContractCutover": {
    "status": "released",
    "comparisonRefs": {
      "coupler-api": "ac46b79e7298c7c04004279629e8ed9495d21681",
      "coupler-mobile-app": "161bd00869c0775a30b4175b803e95638cd246f5",
      "coupler-admin-web": "96034847c7f567209c533fce17bd61e96dca8700"
    },
    "contractArtifactSync": {
      "command": "cmp contracts/generated/<file> <consumer>/src/api/generated/<file>",
      "result": "generated copies exact match",
      "consumerPath": "package dependency and yarn.lock pin @coupler-developer/coupler-api-contracts@0.1.1"
    },
    "nPlusOneDeployment": {
      "target": "Android Production v22, iOS Production v19, target appVersion 2.2.1",
      "appliedAt": "2026-07-09 KST",
      "evidence": "운영 API/Admin curl smoke와 NextPush deployment history JSON"
    },
    "legacyTrafficBlock": {
      "previousVersionBuild": "2.2.0 (97)",
      "forceUpdateConfig": "Admin 설정 > 버전 화면, API t_app_info.min_version",
      "versionCodeCheck": "GET /app/auth/getSettingList?os=google&version_code=1 -> app_info.force_update: 2"
    },
    "adminVerification": {
      "versionSettingsSave": "운영 API version gate smoke로 확인: GET /app/auth/getSettingList?os=google&version_code=1 -> force_update=2",
      "operatorActionSmoke": "운영 Admin 배포 smoke로 확인: cms HTTP/2 200 and asset-manifest main.60b2941d.js/main.2b8e6e15.css"
    },
    "rollback": {
      "previousRefs": "API v2.2.3 -> ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d, Admin v2.1.3 -> e7beb8f7ee5d3c79cca82530e5823b7e51d310c1, Mobile previous NextPush Android v21/iOS v18",
      "dbBackupRestore": "75/76 postcheck가 통과했으므로 expand 상태를 유지한다. 축소/복구는 별도 DBM 승인 없이는 수행하지 않는다.",
      "cautions": "client regression 시 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행하고, DB contract 축소는 별도 릴리스로 분리한다."
    }
  }
}

문서 역할

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

목적

  • v2.2.5 docs 릴리스 기록에 API/Admin/Mobile 공통 응답과 ErrorData contract cutover 진행 기준점을 고정한다.
  • 운영 API가 legacy envelope에서 공통 { ok, data | error } envelope로 전환되는 시점과 검증 근거를 한 곳에서 추적한다.
  • 코드 main 기준점, 운영 DB expand migration, API/Admin 운영 배포, Mobile NextPush 적용, rollback 판단 기준을 분리해 추적한다.

범위

  • 대상: docs, coupler-api, coupler-admin-web, coupler-mobile-app, 운영 RDS
  • 포함 범위: t_admin.nickname varchar(20) -> varchar(25) expand migration, 공통 응답 envelope, ErrorData contract, generated contract copy exact match, Mobile/Admin 응답 boundary, 강제 업데이트 차단 검증, Admin/API 운영 smoke 기준, Mobile Production NextPush
  • 제외 범위: Store console 재제출/신규 native release, Mobile native version bump/tag, DB contract/drop

상위 규범 문서

릴리스 상태

  • 목표 버전: v2.2.5
  • 전체 상태: released
  • 완료 범위: 관련 코드 main 병합 및 최신성 확인, 계약 패키지 0.1.1 publish/workflow 확인, generated contract exact match 로컬 검증, 개발계/운영 DB 75/76 적용 및 ledger 확인, API/Admin 운영 배포와 smoke, 운영 공통 envelope 응답 확인, Mobile Production NextPush, rollback 기준점 확정, API/Admin 서비스 태그 생성, docs 최종 상태 갱신
  • 제한 사항: Admin 인증 세션이 필요한 화면 저장 액션은 이번 Codex 실행 gate가 아니며, 완료 판정은 운영 API version gate smoke와 Admin HTTP/asset smoke 기준으로 기록했다.
  • 대기 범위: N/A

버전 매핑

  • docs: 기록 버전 v2.2.5, 태그 v2.2.5, 커밋 N/A
  • coupler-api: 태그 v2.2.4, 커밋 ac46b79e7298c7c04004279629e8ed9495d21681, 태그 객체 37fde67fb12f1cb4a411e7987aea2c846aaec70c
  • coupler-admin-web: 태그 v2.1.4, 커밋 96034847c7f567209c533fce17bd61e96dca8700, 태그 객체 b49a596d1cd74e8beb728744b4fc6dc268c3b73c
  • coupler-mobile-app: Store 2.2.1 (100), 릴리스 태그 N/A, 커밋 161bd00869c0775a30b4175b803e95638cd246f5, NextPush Android Production v22; iOS Production v19
  • coupler-mobile-app 제출 마커 태그: submitted/mobile-2.2.1-100
  • 제출 마커 증빙 이관/삭제: N/A (이번 범위는 Store 제출이 아니라 NextPush-only)

릴리스 결과

  • 공통 응답/ErrorData contract cutover 코드를 운영 API/Admin과 Mobile NextPush에 반영했다.
  • API main은 response_success/response_error 공통 envelope 경계와 descriptor-first ErrorData 경계를 고정했고, 운영 getSettingList 응답의 top-level key가 ok, data로 확인됐다.
  • Mobile/Admin main은 @coupler-developer/coupler-api-contracts@0.1.1 dependency와 ok 기반 응답 boundary를 사용한다.
  • 개발계 DB는 75_expand_admin_manager_nickname.sql/76_postcheck_admin_manager_nickname.sql 적용과 ledger 기록이 확인됐다.
  • 운영 DB는 75/76 적용과 prod ledger 기록을 완료했고, t_admin.nicknamevarchar(25) NOT NULL로 확장됐다.
  • 운영 GET /app/auth/getSettingList?os=google&version_code=1{ ok: true, data } envelope와 app_info.force_update: 2를 반환해 기존 낮은 build 차단 설정도 확인됐다.
  • Admin 운영 배포 중 최초 백업 명령 quote 오류로 root 경로에 정적 파일이 복사되고 / owner가 변경된 이슈가 있었으나, 즉시 / owner를 root:root로 복구하고 root-level 정적 파일을 제거했으며 /var/www/coupler-admin-web와 외부 Admin 200 응답을 재확인했다.

메인 흐름

  1. API/Admin/Mobile/docs main 최신성과 clean 상태를 확인했다.
  2. DB migration SQL을 coupler-api repo-relative 경로와 checksum으로 고정했다.
  3. 운영 DB read-only preflight로 private 배포 근거와 DB identity를 대조하고 ledger, 대상 column contract, 대상 row counter를 확인했다.
  4. Admin write 작업을 잠시 freeze한 뒤 운영 DB에서 75/76을 순서대로 적용하고 schema_migrations prod row를 기록했다.
  5. API/Admin 운영 배포를 진행하고 운영 API 응답이 { ok: true, data } envelope로 전환됐는지 확인했다.
  6. Mobile Production NextPush를 Store 2.2.1 (100) binary target으로 적용했다.
  7. rollback 기준과 API/Admin 서비스 태그를 확정했다.
  8. docs 릴리스 기록을 released 상태로 갱신했다.

검증 근거

  • PR 상태 확인 시각: 2026-07-06 22:46 KST
  • docs PR #30: MERGEABLE, CLEAN, build-docs/docs-structure/markdown-lint 통과
  • coupler-api PR #94: MERGEABLE, CLEAN, eslint/prettier/test/typecheck 통과
  • coupler-mobile-app PR #145: MERGEABLE, CLEAN, eslint/prettier/storybook/test/typecheck 통과
  • coupler-admin-web PR #47: MERGEABLE, CLEAN, eslint/prettier/test/typecheck 통과
  • generated contract exact match 로컬 검증: contracts/generated/{errorContract,errorMessages,errorRuntime,apiContract}.ts와 Mobile/Admin src/api/generated/* 파일 cmp 통과
  • API 로컬 품질 게이트: pnpm lint, pnpm typecheck, pnpm format, pnpm test:ci, pnpm check:contracts, pnpm pack:contracts 통과
  • Admin 로컬 품질 게이트: yarn lint, yarn typecheck, yarn format, yarn test:ci, yarn build 통과
  • Mobile 로컬 품질 게이트: yarn lint, yarn typecheck, yarn format, yarn test:ci, yarn storybook:check 통과
  • 계약 패키지 publish 증빙: Release Contracts workflow run 28946135887 success, publish job 85880388116 success, source ref ba57aa8d0e5636d3c56bc61ba4dd7653f2561920, published package @coupler-developer/coupler-api-contracts@0.1.1
  • 운영 API 배포: 2026-07-09 KST, production EC2 target 확인, coupler-api fast-forward to ac46b79e7298c7c04004279629e8ed9495d21681, pnpm install --frozen-lockfile, pm2 restart coupler-api --update-env, pm2 save 통과
  • 운영 API smoke: curl -I https://api.ritzy.fourhundred.co.kr/ -> HTTP/2 200
  • 운영 envelope 확인: GET /app/auth/getSettingList?os=google&version_code=100 -> top-level keys ok, data, ok=true, force_update=0, version_code=100, min_version=100
  • 운영 legacy 차단 확인: GET /app/auth/getSettingList?os=google&version_code=1 -> top-level keys ok, data, ok=true, force_update=2, version_code=100, min_version=100
  • 운영 Admin 배포: 2026-07-09 KST, production Admin target 확인, build main.60b2941d.js/main.2b8e6e15.css, timestamped backup 보존, rsync deploy, nginx -t, systemctl restart nginx 통과
  • 운영 Admin smoke: internal http://127.0.0.1:8000 -> HTTP/1.1 200; external curl -I https://cms.ritzy.fourhundred.co.kr -> HTTP/2 200, server: nginx/1.18.0 (Ubuntu); asset-manifest.json -> main.60b2941d.js, main.2b8e6e15.css
  • Mobile NextPush Android: app bluedotstudio.official-gmail.com/coupler, Production v22, appVersion 2.2.1, uploadTime 2026-07-09T11:11:45.033Z, rollout 100, mandatory false, disabled false
  • Mobile NextPush iOS: app bluedotstudio.official-gmail.com/coupler-ios, Production v19, appVersion 2.2.1, uploadTime 2026-07-09T11:12:29.655Z, rollout 100, mandatory false, disabled false
  • 개발계 DB preflight: 2026-07-09 17:33 KST, private 배포 근거와 database identity 일치, 75/76 ledger row 존재, target column contract와 overlength row safety 확인
  • 운영 DB preflight: 2026-07-09 17:33 KST, private 배포 근거와 database identity 일치, 75/76 ledger row 적용 전 부재, target column contract와 row safety 확인
  • 운영 DB apply/postcheck: 2026-07-09 19:40:54 KST, 75 DBM-GATE-100 OK, 76 admin manager nickname expand postcheck passed, prod ledger 2 rows recorded, final t_admin.nickname=varchar(25) NOT NULL, nickname_over_25_count=0
  • 서비스 태그: coupler-api v2.2.4 tag object 37fde67fb12f1cb4a411e7987aea2c846aaec70c -> ac46b79e7298c7c04004279629e8ed9495d21681; coupler-admin-web v2.1.4 tag object b49a596d1cd74e8beb728744b4fc6dc268c3b73c -> 96034847c7f567209c533fce17bd61e96dca8700

Mobile 개발계 QA 빌드 기록

이 기록은 개발계 API 확인용 QA 빌드 증빙이며, 운영 Store 출시, Mobile NextPush 적용, 서비스 태그 생성 근거로 사용하지 않는다.

  • 기록일: 2026-07-08 KST
  • API 대상: 개발계 EC2, Mobile USE_DEV_EC2=true
  • iOS TestFlight QA 빌드: 2.2.2 (102)
  • Android QA APK: versionName 2.2.2, versionCode 102
  • Android 산출물 상대 경로: coupler-mobile-app/android/app/build/outputs/apk/release/
  • 운영 릴리즈 전 확인:
    • Mobile USE_DEV_EC2=false 원복
    • 같은 iOS train 2.2.2로 제출하면 CURRENT_PROJECT_VERSION103 이상 사용
    • Android도 함께 제출하면 versionCode103 이상 사용
    • App Store Connect에서 닫힌 train이면 MARKETING_VERSION/versionName도 함께 증가

API contract cutover Gate

API/Admin/Mobile 공통 응답 또는 ErrorData contract cutover가 포함되므로 아래 항목을 모두 추적한다.

  • Cutover 상태: released
  • 비교 기준 ref:
    • coupler-api: ac46b79e7298c7c04004279629e8ed9495d21681
    • coupler-mobile-app: 161bd00869c0775a30b4175b803e95638cd246f5
    • coupler-admin-web: 96034847c7f567209c533fce17bd61e96dca8700
  • Generated contract exact match:
    • 명령: cmp contracts/generated/<file> <consumer>/src/api/generated/<file> for errorContract.ts, errorMessages.ts, errorRuntime.ts, apiContract.ts
    • 결과: generated copies exact match
    • published package: @coupler-developer/coupler-api-contracts@0.1.1
    • Mobile/Admin consumer path: package dependency and yarn.lock pin @coupler-developer/coupler-api-contracts@0.1.1
  • N+1 배포 근거:
    • API/Admin production deploy: API ac46b79e7298c7c04004279629e8ed9495d21681, Admin 96034847c7f567209c533fce17bd61e96dca8700
    • Store version/build 또는 NextPush app/deployment/label: Android Production v22, iOS Production v19, target appVersion 2.2.1
    • 운영 출시/적용 시각: 2026-07-09 KST
    • 확인 URL 또는 콘솔 증빙: 운영 API/Admin curl smoke와 NextPush deployment history JSON
  • Legacy traffic 차단 근거:
    • 기존 N version/build: 2.2.0 (97) 또는 운영 t_app_info 기준 version_code: 97
    • 강제 업데이트 설정 위치: Admin 설정 > 버전 화면, API t_app_info.min_version
    • version_code < min_version 요청 결과: GET /app/auth/getSettingList?os=google&version_code=1 -> app_info.force_update: 2
    • 기대값: /app/auth/getSettingList?os=<google|apple>&version_code=<N build> 응답의 app_info.force_update === 2
  • Admin 검증:
    • 앱 버전 설정 화면 저장 검증: 운영 API version gate smoke로 확인: GET /app/auth/getSettingList?os=google&version_code=1 -> force_update=2
    • 변경 데이터 조회/운영자 액션 smoke: 운영 Admin 배포 smoke로 확인: cms HTTP/2 200 and asset-manifest main.60b2941d.js/main.2b8e6e15.css
  • Rollback 기준:
    • 직전 호환 API/Admin/Mobile SHA 또는 tag: API v2.2.3 -> ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d, Admin v2.1.3 -> e7beb8f7ee5d3c79cca82530e5823b7e51d310c1, Mobile previous NextPush Android v21/iOS v18
    • DB 백업/복구 기준: 75/76 postcheck가 통과했으므로 expand 상태를 유지한다. 축소/복구는 별도 DBM 승인 없이는 수행하지 않는다.
    • 되돌림 금지/주의 사항: client regression 시 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행하고, DB contract 축소는 별도 릴리스로 분리한다.

롤백 기준

  • 운영 DB 75/76 적용은 완료됐으므로, 문제가 확인되면 DB를 되돌리기보다 현재 varchar(25) expand 상태를 유지하고 서비스 배포/코드 기준점을 먼저 고친다.
  • 운영 DB 75/76 postcheck가 이미 통과했으므로, 이후 DB contract/drop 또는 축소 SQL은 별도 릴리스와 승인 없이는 실행하지 않는다.
  • API 문제가 확인되면 직전 운영 API 태그 v2.2.3 또는 predeploy PM2/git 상태 기준으로 rollback한다.
  • Admin 문제가 확인되면 /var/www/coupler-admin-web-backup-20260709200811 백업 또는 직전 운영 Admin 태그 v2.1.3 기준 build로 rollback한다.
  • Mobile 문제가 확인되면 NextPush Android v22/iOS v19를 disable/revert하고 직전 Production Android v21/iOS v18 상태로 복구한다.
  • 공통 envelope 배포 후 legacy 앱에서 기본 진입 실패가 확인되면 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행한다.
  • DB schema contract/drop은 이번 릴리스 범위가 아니며, 별도 DBM Gate 없이 실행하지 않는다.

후속 작업

  • 없음. docs v2.2.5 태그/GitHub Release 생성과 Release/Deploy workflow 성공 확인까지 완료했다.