From a75c797f7c1436d01cb84ed4ea1cd58c12c4e79f Mon Sep 17 00:00:00 2001 From: 6-keem <6ukeem@gmail.com> Date: Wed, 24 Jun 2026 20:23:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B2=A0=ED=83=80=20=EC=B1=84=EB=84=90?= =?UTF-8?q?=20=EB=B3=84=EB=8F=84=20=ED=95=AD=EB=AA=A9=20Chrome=20Web=20Sto?= =?UTF-8?q?re=20=EC=9E=90=EB=8F=99=EB=B0=B0=ED=8F=AC=20=EA=B3=A8=EA=B2=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - manifest: isBeta 시 BETA_CLIENT_ID·icon-beta 아이콘으로 분기 - manifest: BETA_VERSION(4-파트 숫자)으로 store-valid 버전 주입 - release-beta.yml: manifest 버전을 X.Y.Z.RUN_NUMBER 로 계산해 빌드에 주입 - 베타 아이콘 자산 icon-beta-{16,32,48,128}.png 추가 Closes #112 --- .github/workflows/release-beta.yml | 8 ++++++-- manifest.config.ts | 28 ++++++++++++++++++--------- public/images/icon/icon-beta-128.png | Bin 0 -> 11531 bytes public/images/icon/icon-beta-16.png | Bin 0 -> 841 bytes public/images/icon/icon-beta-32.png | Bin 0 -> 2069 bytes public/images/icon/icon-beta-48.png | Bin 0 -> 5075 bytes 6 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 public/images/icon/icon-beta-128.png create mode 100644 public/images/icon/icon-beta-16.png create mode 100644 public/images/icon/icon-beta-32.png create mode 100644 public/images/icon/icon-beta-48.png diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml index 4129e13..e355bd8 100644 --- a/.github/workflows/release-beta.yml +++ b/.github/workflows/release-beta.yml @@ -29,7 +29,10 @@ jobs: id: ver run: | BASE=$(node -p "require('./package.json').version" | sed 's/-.*//') + # GitHub 태그/릴리즈는 SemVer prerelease 표기를 쓴다. echo "tag=v${BASE}-beta.${GITHUB_RUN_NUMBER}" >> "$GITHUB_OUTPUT" + # manifest version 은 숫자만 허용 → 4-파트 숫자 스킴으로 별도 계산. + echo "manifest=${BASE}.${GITHUB_RUN_NUMBER}" >> "$GITHUB_OUTPUT" - name: 의존성 설치 run: npm ci @@ -38,6 +41,7 @@ jobs: run: npm run build env: RELEASE_CHANNEL: beta + BETA_VERSION: ${{ steps.ver.outputs.manifest }} - name: dist 압축 env: @@ -58,8 +62,8 @@ jobs: # ── 베타 Chrome Web Store 게시 (기반 — 기본 비활성) ────────────── # 베타는 별도 스토어 항목이므로 BETA_EXTENSION_ID 사용. - # ※ Chrome manifest version은 숫자만 허용되므로, 스토어 발행을 켤 때는 - # `-beta.N` 대신 숫자 스킴(예: x.y.z.N)으로 manifest 버전을 맞춰야 함. + # manifest 버전은 위 빌드에서 BETA_VERSION(숫자 4-파트)으로 주입되어 + # 스토어 버전 규칙(숫자만 허용)을 만족한다. - name: Chrome Web Store 게시 (beta) if: vars.ENABLE_STORE_PUBLISH == 'true' uses: mnao305/chrome-extension-upload@4008e29e13c144d0f6725462cbd49b7c291b4928 # v5.0.0 diff --git a/manifest.config.ts b/manifest.config.ts index c46b2e2..2fc6aa2 100644 --- a/manifest.config.ts +++ b/manifest.config.ts @@ -3,27 +3,37 @@ import packageJson from './package.json' with { type: 'json' }; const PROD_CLIENT_ID = '804067218183-3pev3tppten6i94lrfvmk729hmbdejqb.apps.googleusercontent.com'; const DEV_CLIENT_ID = '981860765955-t69elhj8osi7vdp84m5bf8b9hdib44kr.apps.googleusercontent.com'; +// 베타는 별도 스토어 항목 = 별도 확장 ID로 게시되므로, 그 확장 ID에 묶인 +// 전용 OAuth client_id 가 필요하다. (스테이블용 PROD_CLIENT_ID 로는 베타에서 +// chrome.identity 토큰 검증이 실패한다.) +// TODO(#112): 베타 스토어 항목 생성 후 발급받은 client_id 로 교체. +const BETA_CLIENT_ID = ''; export function createManifest(mode?: string): ManifestV3Export { - const clientId = mode === 'mock' ? DEV_CLIENT_ID : PROD_CLIENT_ID; - - // 베타 채널 빌드 기반 (Chrome Web Store 2단계 게시 대비) + // 베타 채널 빌드 (Chrome Web Store 별도 항목 게시 대비) // 릴리즈 워크플로의 베타 빌드에서 RELEASE_CHANNEL=beta 를 주입하면 - // 별도 스토어 항목/아이콘과 구분되도록 이름에 (Beta) 가 붙는다. + // 이름에 (Beta) 가 붙고, 별도 아이콘/OAuth client_id 로 분기된다. const isBeta = process.env.RELEASE_CHANNEL === 'beta'; + const clientId = mode === 'mock' ? DEV_CLIENT_ID : isBeta ? BETA_CLIENT_ID : PROD_CLIENT_ID; + const iconPrefix = isBeta ? 'icon-beta' : 'icon'; + + // Chrome manifest version 은 숫자 점 표기만 허용하므로 `-beta.N` 을 못 쓴다. + // 베타 워크플로는 BETA_VERSION 으로 4-파트 숫자(X.Y.Z.RUN_NUMBER)를 주입한다. + const version = isBeta && process.env.BETA_VERSION ? process.env.BETA_VERSION : packageJson.version; + return { manifest_version: 3, name: isBeta ? '__MSG_extName__ (Beta)' : '__MSG_extName__', - version: packageJson.version, + version, description: '__MSG_extDescription__', default_locale: 'ko', action: {}, icons: { - '16': 'images/icon/icon-16.png', - '32': 'images/icon/icon-32.png', - '48': 'images/icon/icon-48.png', - '128': 'images/icon/icon-128.png', + '16': `images/icon/${iconPrefix}-16.png`, + '32': `images/icon/${iconPrefix}-32.png`, + '48': `images/icon/${iconPrefix}-48.png`, + '128': `images/icon/${iconPrefix}-128.png`, }, background: { service_worker: 'src/background.ts', diff --git a/public/images/icon/icon-beta-128.png b/public/images/icon/icon-beta-128.png new file mode 100644 index 0000000000000000000000000000000000000000..7b752f00d93af126b7f55121b1e211605b048e14 GIT binary patch literal 11531 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 literal 0 HcmV?d00001 diff --git a/public/images/icon/icon-beta-48.png b/public/images/icon/icon-beta-48.png new file mode 100644 index 0000000000000000000000000000000000000000..f0246289e280bb941baf062852cbab3de09f73fc GIT binary patch literal 5075 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