From 930e6173776cb4abccd6f298034b7873b13cd6af Mon Sep 17 00:00:00 2001 From: Bori-github Date: Fri, 17 Jul 2026 15:44:08 +0900 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=EC=9B=8C=ED=81=AC=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=20=EA=B3=B5=EA=B8=89=EB=A7=9D=C2=B7=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=ED=95=98=EB=93=9C=EB=8B=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이번 스택이 만든 문제가 아니라 기존 워크플로의 문제이나, 성격이 같아 한 브랜치로 묶는다. deploy-zpl-viewer: - `pnpm dlx vercel` → `pnpm dlx vercel@56.3.1` 매 배포마다 핀 없는 최신 CLI를 받아 프로덕션 토큰을 바로 넘기고 있었다. 락파일도 무결성 검사도 거치지 않는 경로였음 - `--token=` 인자 → VERCEL_TOKEN env 인자로 주면 러너의 process argv에 남는다. CLI가 env를 읽는 것은 실제로 확인함 ("The token provided via VERCEL_TOKEN environment variable...") - permissions: contents: read 추가 deploy-docs: - 최상위 permissions에서 pages: write·id-token: write 제거 (contents: read만) deploy 잡이 이미 자체 선언하고 있어 최상위 grant는 build 잡의 폭발 반경만 넓혔다. build는 pnpm install로 서드파티 lifecycle 스크립트를 실행하는 잡이라 id-token: write가 있으면 그 코드가 OIDC 토큰을 발급할 수 있었다 publish-npm-zpl-core, publish-npm-react-zpl: - permissions: contents: read 추가. NPM_TOKEN을 든 잡의 GITHUB_TOKEN 범위를 레포 기본값에 맡기지 않는다 release-drafter: - @v6 → @6a93d829887aa2e0748befe2e808c66c0ec6e4c7 (v6.4.0) contents: write를 부여받는 서드파티 액션을 가변 태그로 참조하고 있었다. 태그가 재지정되면 레포 쓰기 권한이 임의 코드로 넘어간다 남은 항목(별도 판단 필요): - publish 워크플로의 NPM_TOKEN을 protected environment 뒤로 옮기는 건 레포 설정 변경이라 포함하지 않음 Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/deploy-docs.yml | 6 ++++-- .github/workflows/deploy-zpl-viewer.yml | 10 +++++++++- .github/workflows/publish-npm-react-zpl.yml | 5 +++++ .github/workflows/publish-npm-zpl-core.yml | 5 +++++ .github/workflows/release-drafter.yml | 5 ++++- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index ad66c05..144d15a 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -9,10 +9,12 @@ on: - '.github/workflows/deploy-docs.yml' workflow_dispatch: +# deploy 잡이 pages·id-token 권한을 자체 선언하므로 최상위는 읽기만 준다. +# 최상위에 두면 build 잡까지 상속받는데, build는 pnpm install로 서드파티 +# lifecycle 스크립트를 실행하는 잡이다. id-token: write가 있으면 그 코드가 +# 설정된 클라우드 신뢰 정책에 대해 OIDC 토큰을 발급할 수 있다. permissions: contents: read - pages: write - id-token: write concurrency: group: pages diff --git a/.github/workflows/deploy-zpl-viewer.yml b/.github/workflows/deploy-zpl-viewer.yml index 6fb1e81..74e240a 100644 --- a/.github/workflows/deploy-zpl-viewer.yml +++ b/.github/workflows/deploy-zpl-viewer.yml @@ -6,6 +6,9 @@ on: - 'zpl-viewer/v*' workflow_dispatch: +permissions: + contents: read + jobs: deploy: runs-on: ubuntu-latest @@ -22,8 +25,13 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + # CLI 버전을 고정한다. `pnpm dlx vercel`은 매 실행마다 최신을 받아 + # 프로덕션 토큰을 바로 넘기는 구조라 락파일도 무결성 검사도 없었다. + # 토큰은 --token= 인자 대신 VERCEL_TOKEN env로 넘긴다. 인자로 주면 + # 러너의 process argv에 남아 같은 러너의 다른 프로세스에서 보인다. - name: Deploy to Vercel - run: pnpm dlx vercel --prod --yes --token=${{ secrets.VERCEL_TOKEN }} + run: pnpm dlx vercel@56.3.1 --prod --yes env: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} diff --git a/.github/workflows/publish-npm-react-zpl.yml b/.github/workflows/publish-npm-react-zpl.yml index fc0cdc6..b10708b 100644 --- a/.github/workflows/publish-npm-react-zpl.yml +++ b/.github/workflows/publish-npm-react-zpl.yml @@ -6,6 +6,11 @@ on: - 'react-zpl/v*' workflow_dispatch: +# 두 잡 모두 레포 쓰기 권한이 필요 없다. publish 잡은 NPM_TOKEN을 들고 있으므로 +# GITHUB_TOKEN 범위는 최소로 둔다. +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest diff --git a/.github/workflows/publish-npm-zpl-core.yml b/.github/workflows/publish-npm-zpl-core.yml index c4ed0ca..eb30b41 100644 --- a/.github/workflows/publish-npm-zpl-core.yml +++ b/.github/workflows/publish-npm-zpl-core.yml @@ -6,6 +6,11 @@ on: - 'zpl-core/v*' workflow_dispatch: +# 두 잡 모두 레포 쓰기 권한이 필요 없다. publish 잡은 NPM_TOKEN을 들고 있으므로 +# GITHUB_TOKEN 범위는 최소로 둔다. +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 784de66..06c69ee 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -13,7 +13,10 @@ jobs: update-draft: runs-on: ubuntu-latest steps: - - uses: release-drafter/release-drafter@v6 + # 서드파티 액션이므로 가변 태그(@v6) 대신 커밋 SHA로 고정한다. + # contents: write를 주는 액션이라 태그가 재지정되면 레포 쓰기 권한이 + # 임의 코드에 넘어간다. + - uses: release-drafter/release-drafter@6a93d829887aa2e0748befe2e808c66c0ec6e4c7 # v6.4.0 with: publish: false env: