diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 041bfb18b..7b13de48d 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -3,7 +3,7 @@ name: npm-publish (Trusted) on: push: tags: - - "release_levelcaptech/v*.*.*" + - "v*.*.*" permissions: contents: write @@ -33,10 +33,10 @@ jobs: # package.json の version は別途管理し、release タグと一致させる - name: Validate tag version matches package.json run: | - EXPECTED_VERSION="${GITHUB_REF#refs/tags/release_levelcaptech/v}" + EXPECTED_VERSION="${GITHUB_REF#refs/tags/v}" VERSION_PATTERN="^[0-9]+\.[0-9]+\.[0-9]+$" if [[ ! "${EXPECTED_VERSION}" =~ ${VERSION_PATTERN} ]]; then - echo "Invalid tag format: ${GITHUB_REF}. Expected release_levelcaptech/vX.Y.Z (e.g., release_levelcaptech/v1.2.3)" + echo "Invalid tag format: ${GITHUB_REF}. Expected vX.Y.Z (e.g., v1.2.3)" exit 1 fi ACTUAL_VERSION=$(node -p "require('./package.json').version") diff --git a/docs/npm-publish.md b/docs/npm-publish.md index aad56b1e5..32606932a 100644 --- a/docs/npm-publish.md +++ b/docs/npm-publish.md @@ -27,8 +27,9 @@ ## タグ駆動リリース手順 ### タグとバージョン番号の関係(必須定義) -- npm リリース対象タグは `release_levelcaptech/vMAJOR.MINOR.PATCH` の形式のみです。 -- `release_levelcaptech/v1.2.3` の場合、`package.json` の version は `1.2.3` に設定しておきます。 +- npm リリース対象タグは `vMAJOR.MINOR.PATCH` の形式のみです。 +- `v1.2.3` の場合、`package.json` の version は `1.2.3` に設定しておきます。 +- 旧タグ `release_levelcaptech/vX.Y.Z` はフォーク時の衝突回避のために使っていましたが、今後は新規利用しません(既存タグは保持し、ワークフローのトリガー対象外です)。 - `release/vX.Y.Z` は本リポジトリではリリーストリガーとして扱いません。 - タグと `package.json` の version が一致しない場合は、ワークフロー内でエラーとして停止します。 @@ -36,18 +37,20 @@ ```bash npm version 1.2.3 git push -git tag release_levelcaptech/v1.2.3 -git push origin release_levelcaptech/v1.2.3 +git tag v1.2.3 +git push origin v1.2.3 ``` +※ `npm version` がタグを自動生成する設定の場合は、`git tag` 手順を省略するか `--no-git-tag-version` を利用してください。 + #### 緊急時の差し戻し操作 1. GitHub Actions を止める 2. 下記コマンドを実行する ```bash -git tag -d release_levelcaptech/v1.2.3 -git push origin :refs/tags/release_levelcaptech/v1.2.3 +git tag -d v1.2.3 +git push origin :refs/tags/v1.2.3 ``` 3. npm側の確認 @@ -65,5 +68,6 @@ npm view @levelcaptech/gantt-task-react-custom versions ### 禁止事項 - `package.json` の version を手動編集する -- `release_levelcaptech/` プレフィックス無しタグでの公開を期待する +- `v` プレフィックス無しや SemVer 形式外のタグでの公開を期待する +- `release_levelcaptech/` プレフィックス付きタグでの新規公開を行う - `release/vX.Y.Z` タグでの公開を期待する diff --git a/src/test/npm-publish-workflow.test.ts b/src/test/npm-publish-workflow.test.ts new file mode 100644 index 000000000..068d06e7a --- /dev/null +++ b/src/test/npm-publish-workflow.test.ts @@ -0,0 +1,33 @@ +import fs from "fs"; +import path from "path"; + +const workflowPath = path.join( + process.cwd(), + ".github", + "workflows", + "npm-publish.yml" +); +const workflowContent = fs.readFileSync(workflowPath, "utf8"); + +describe("npm-publish workflow tag strategy", () => { + test("uses vX.Y.Z tag trigger", () => { + expect(workflowContent).toContain('- "v*.*.*"'); + }); + + test("does not use release_levelcaptech tag prefix", () => { + expect(workflowContent).not.toContain("release_levelcaptech/"); + }); + + test("validates tag version format and error message", () => { + const expectedVersionSnippet = [ + 'EXPECTED_VERSION="', + "$", + '{GITHUB_REF#refs/tags/v}"', + ].join(""); + expect(workflowContent).toContain(expectedVersionSnippet); + expect(workflowContent).toContain( + 'VERSION_PATTERN="^[0-9]+\\.[0-9]+\\.[0-9]+$"' + ); + expect(workflowContent).toContain("Expected vX.Y.Z"); + }); +});