Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/npm-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: npm-publish (Trusted)
on:
push:
tags:
- "release_levelcaptech/v*.*.*"
- "v*.*.*"

permissions:
contents: write
Expand Down Expand Up @@ -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")
Expand Down
18 changes: 11 additions & 7 deletions docs/npm-publish.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,30 @@
## タグ駆動リリース手順

### タグとバージョン番号の関係(必須定義)
- 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 が一致しない場合は、ワークフロー内でエラーとして停止します。

### 人間が行う操作
```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側の確認
Expand All @@ -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` タグでの公開を期待する
33 changes: 33 additions & 0 deletions src/test/npm-publish-workflow.test.ts
Original file line number Diff line number Diff line change
@@ -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");
});
});