Skip to content

fix: Auto Releaseがタグの重複で失敗する問題を修正 - #216

Merged
Tsuchiya2 merged 1 commit into
mainfrom
fix/auto-release-tag-collision
Aug 16, 2026
Merged

fix: Auto Releaseがタグの重複で失敗する問題を修正#216
Tsuchiya2 merged 1 commit into
mainfrom
fix/auto-release-tag-collision

Conversation

@Tsuchiya2

@Tsuchiya2 Tsuchiya2 commented Aug 16, 2026

Copy link
Copy Markdown
Owner

概要

Auto Release ワークフローが Release.tag_name already exists(HTTP 422)で失敗していた問題を修正しました。ワークフローの削除ではなく、原因を取り除く形で対応しています。

原因

1つのコミットに2つのタグが付いていた

$ git log --oneline --decorate -4
ba42fdb (HEAD -> main) Merge pull request #215 from Tsuchiya2/docs/sync-with-current-implementation
1aedab2 docs: READMEとテストガイドを現行実装に同期
5c861f2 (tag: v1.0.28, tag: v1.0.27) Merge pull request #214 from Tsuchiya2/chore/remove-docs
0026767 Merge pull request #213 from Tsuchiya2/chore/organize-configs

#213#214 が相次いでマージされたことで Auto Release が並走し、どちらも --target main を指定していたため、その時点の先端だった 5c861f2v1.0.27v1.0.28 の両方が付きました。

git describe は最大バージョンを返さない

$ git tag --list 'v*' --sort=-v:refname | head -1
v1.0.28

$ git describe --tags --abbrev=0
v1.0.27

git describe --tags --abbrev=0 が返すのはコミット距離が最も近いタグです。同じコミットに複数のタグがあると、どれが返るかはバージョンの大小と無関係になります。

その結果 #215 のマージ時には v1.0.27 を起点に v1.0.28 を算出し、既存のタグと衝突して422で落ちていました。

修正内容

変更 理由
最新タグの判定を git describe から git tag --list 'v*' --sort=-v:refname | head -n 1 バージョン番号の大小で判定する。コミットの並びやタグの重複に影響されない
算出したタグが既にある場合、空いている番号まで繰り上げる 万一衝突しても失敗せず次へ進む
concurrency: auto-release を追加(cancel-in-progress: false 並走そのものを防ぐ。連続マージ時も順番に実行される
タグの付与先を --target main から --target ${{ github.sha }} 実行時点の先端ではなく、そのpushのコミットにタグが付く
PR番号の取得を gh pr list --state merged --limit 1 からマージコミットのメッセージ経由へ 連続マージ時に別のPRのタイトルを拾わないようにする
リリースノートの変数を env: 経由で渡すよう変更 PRタイトルに "$ が含まれてもスクリプトが壊れない

検証

修正後のバージョン算出ロジックをローカルで実行し、期待どおりの結果になることを確認しました。

$ # 修正後のロジック
修正後: v1.0.28 -> v1.0.29

$ # 修正前のロジック
修正前(git describe): v1.0.27 -> v1.0.28(既存のため422)

PR番号の抽出も確認しています。

$ git log -1 --pretty=%s HEAD | grep -oE '#[0-9]+' | head -n 1 | tr -d '#'
215
$ git log -1 --pretty=%s HEAD
Merge pull request #215 from Tsuchiya2/docs/sync-with-current-implementation

squashマージの title (#215) 形式でも同じく抽出できます。PR番号が取れない場合(rebaseマージなど)は、従来どおりコミットメッセージをリリースノートに使います。

ワークフロー3ファイルのYAML構文も検証済みです。

補足

既に作られてしまった重複タグ(5c861f2v1.0.27 / v1.0.28)はそのままにしています。修正後は最大バージョンを起点にするため、次回は v1.0.29 が作られ、重複タグがあっても支障はありません。整理をご希望であれば別途対応します。

Summary by CodeRabbit

  • Chores
    • Improved release automation to produce consistent version numbers and avoid duplicate releases.
    • Release workflows are now serialized to prevent conflicting runs.
    • Releases are associated with the correct triggering commit and pull request details.
    • Added fallback handling for releases without available pull request metadata.

連続してマージされた際に Auto Release が並走し、どちらも --target main で
その時点の先端へタグを打った結果、1つのコミット(5c861f2)に v1.0.27 と
v1.0.28 の両方が付いた。

git describe --tags --abbrev=0 はコミット距離が最も近いタグを返すため、
この状態では v1.0.27 が返り、次版を v1.0.28 と算出して
「Release.tag_name already exists」(HTTP 422)で失敗していた。

- 最新タグの判定を git describe から、バージョン番号での並べ替え
  (git tag --sort=-v:refname)へ変更
- 算出したタグが既にある場合は、空いている番号まで繰り上げる
- concurrency でワークフローを直列化し、並走そのものを防ぐ
- タグの付与先を --target main から push されたコミットへ変更
- PR番号の取得を gh pr list からマージコミットのメッセージ経由へ変更
  (連続マージ時に別のPRを拾わないようにする)
- リリースノートの組み立てで、PRタイトルなどを環境変数経由で渡すよう変更
@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0025179b-7e0e-4353-a1c4-a2ec1f899c5b

📥 Commits

Reviewing files that changed from the base of the PR and between ba42fdb and fe51414.

📒 Files selected for processing (1)
  • .github/workflows/release.yml

Included review availability: Your plan includes up to 1 review per rolling hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The release workflow now serializes runs, selects an unused patch version from sorted tags, derives pull request metadata from the triggering commit, and creates the release against that commit SHA.

Changes

Release workflow

Layer / File(s) Summary
Release serialization and version selection
.github/workflows/release.yml
Releases use a shared concurrency group. Version selection sorts v* tags, defaults to v0.0.0, and skips existing patch tags.
PR metadata and release publication
.github/workflows/release.yml
The workflow extracts the pull request number from the triggering commit, retrieves its title, builds release notes with commit fallback, and targets the triggering commit SHA.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to fe514

The workflow changes address duplicate release tags and target the correct commit for automatic releases; no actionable merge-blocking risk remains beyond normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseWorkflow
  participant GitTags
  participant TriggeringCommit
  participant GitHubPullRequestAPI
  participant GitHubReleaseAPI
  ReleaseWorkflow->>GitTags: Select highest version-sorted v* tag
  GitTags-->>ReleaseWorkflow: Return latest and unused new version
  ReleaseWorkflow->>TriggeringCommit: Read commit message and SHA
  TriggeringCommit-->>ReleaseWorkflow: Return PR reference or commit message
  ReleaseWorkflow->>GitHubPullRequestAPI: Retrieve PR title
  GitHubPullRequestAPI-->>ReleaseWorkflow: Return PR metadata
  ReleaseWorkflow->>GitHubReleaseAPI: Create release at triggering commit SHA
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: fixing Auto Release failures caused by duplicate tags.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/auto-release-tag-collision

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Tsuchiya2
Tsuchiya2 merged commit 707a002 into main Aug 16, 2026
3 checks passed
@Tsuchiya2
Tsuchiya2 deleted the fix/auto-release-tag-collision branch August 16, 2026 14:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant