- きっかけ
- 参考にしたドキュメント
- 参考にした設定
- 実際にやったこと
- gemリリースの流れ
- rubygems/release-gem を導入できなかったリポジトリ
- 2025/12/10 13:14 追記
- 2025/12/11 12:51 追記
きっかけ
https://github.com/smartbank-inc/action_ip_filter のソースを見てたら https://github.com/rubygems/release-gem が使われていたのでついカッとなってやりました。
3日間で計50リポジトリくらいで作業してgemをリリースしてまわったと思います。

ここ2日間くらいで無限にgemをリリースしている...(まだ半分くらい残ってる) pic.twitter.com/FGsxyHtAlb
— sue445 (@sue445) 2025年11月29日
昨日と今日だけでgemを30個くらいバージョンアップしてる(まだ全部終わっていない)のでGitHubで僕をフォローしてる人のタイムラインが確実に破滅してそう…(懺悔)
— sue445 (@sue445) 2025年11月29日
作業全部終わってから気づいたけどCursorとかにやらせればよかったな...
参考にしたドキュメント
この辺はむっちゃ読みました。
参考にした設定
下記を参考にしました。
- https://github.com/smartbank-inc/action_ip_filter/blob/32b862f9828fedf27d8cc2c8c6fd3189f765be22/.github/workflows/release.yml
- https://github.com/itamae-plugins/itamae-plugin-recipe-rbenv/blob/2b35996adb54e9c9aeefc31ac533288b624f1f20/.github/workflows/push_gem.yml
tag pushをトリガにしてgemをリリースするか workflow_dispatch を使って手動実行でgemをリリースするかは悩ましかったんですが、 rubygems/release-gem 内で bundle exec rake release を実行している *1ため後者の手動実行を採用しました。( rake release 内のgemのリリースフローでもtagを作ってpushするのだが、同名のtagが存在しているとエラーになって rake release が失敗するため)
実際にやったこと
下記のような作業を50個くらいのリポジトリでやってまわりました。
自分用の作業メモをそのままブログに載せてるので合わないものは適宜変えてください。
.github/workflows/release_gem.yml を追加
リポジトリから手動実行してgemをリリースしてGitHubにReleaseを作るワークフロー。
USER_NAME と REPO_NAME と GEM_NAME を適宜書き換える。
name: Publish gem to rubygems.org on: workflow_dispatch: jobs: release: if: github.repository == 'USER_NAME/REPO_NAME' runs-on: ubuntu-latest environment: name: rubygems.org url: https://rubygems.org/gems/GEM_NAME permissions: contents: write id-token: write steps: - name: Harden Runner uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 with: egress-policy: audit - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set up Ruby uses: ruby/setup-ruby@eaecf785f6a34567a6d97f686bbb7bccc1ac1e5c # v1.237.0 with: bundler-cache: true ruby-version: ruby - name: Publish to RubyGems uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1 - name: Create GitHub release run: | tag_name="$(git describe --tags --abbrev=0)" gh release create "${tag_name}" --verify-tag --generate-notes env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
forkされたリポジトリでworkflowを実行できないようにするのを最初見た時 *2 は「なるほど〜」と思いました。
なのでリポジトリ名をハードコーディングしてた方がよさそう。(後述のrubygems.org側のTrusted publishersがあるのでどっちにしろgemリリース時にエラーになるんだけど)
あと、 gh release create でreleaseを作るので .github/release.yml *3を作っておくとリリースノートをいい感じにできそう。
自分のリポジトリで使ってる設定はこれ。 https://github.com/sue445/sashimi_tanpopo/blob/1f3566456f6f39198ed7468653bd52cd17660e8b/.github/release.yml
リポジトリにEnvironmentを追加
Environmentsから rubygems.org を作ります。

複数人でメンテするgemはRequired reviewersがあると、リポジトリへのコミット権は渡したいけどgemのpush権は渡したくような場合に制御できて安心ですね。

基本的に「Protected branch = デフォルトブランチ」になっていると思うので下記のいずれかを設定。
- Protected branch only
- デフォルトブランチ(mainブランチなど)を個別に設定する
- Protected branchが複数あるけどgemのリリースはmainブランチだけで行いたい場合などはこっち

rubygems.orgでTrusted publishersを追加
https://guides.rubygems.org/trusted-publishing/adding-a-publisher/ を参考に設定。

下記を設定します。
- Workflow Filename:
release_gem.yml - Environment:
rubygems.org
リポジトリの .github/workflows/ に release か push を含むyamlがあると補完されてる*4ようなので、workflowのファイル名もそれに合わせておくとよさそう。
gemリリースの流れ
Before
CHANGELOG.mdを書くversion.rbを編集- ローカルで
bundle exec rake releaseを実行
After
CHANGELOG.mdを書くversion.rbを編集git push- リポジトリからworkflowを手動実行
rubygems/release-gem を導入できなかったリポジトリ
https://github.com/ruby-go-gem/go-gem-wrapper ではrubygems/release-gemを導入できずに導入後にrevertしました。
他リポジトリと同様の手順で導入したら、Gemfile.lockに書かれているgemのバージョンと違うバージョンをbundlerがロードしようとして謎でした...
詳しいログ。
bundler 2.7.2でのエラー
bundler 4.0.0でのエラー
2025/12/10 13:14 追記
id:r7kamura さんみたいにworkflow用のリポジトリを作ってそこに集約させるの全然アリだな。この方式パクらせてもらおうw
2025/12/11 12:51 追記
現状だと無理っぽい...
@sue445 workflowsに集約するの便利なんですが、不具合なのか意図的なのかrubygems/release-gemが外部のworkflow経由だと動かないので、その用途だと現状無理かもしれない https://t.co/ruezpFdMZf
— r7kamura (@r7kamura) 2025年12月11日
昨日ちょうど同じエラー踏んだところでしたね...https://t.co/wrH32G5HX5
— sue445 (@sue445) 2025年12月11日
*1: https://github.com/rubygems/release-gem/blob/1c162a739e8b4cb21a676e97b087e8268d8fc40b/action.yml#L45-L49
*2:https://github.com/itamae-plugins/itamae-plugin-recipe-rbenv/blob/2b35996adb54e9c9aeefc31ac533288b624f1f20/.github/workflows/push_gem.yml#L13
*3: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#example-configurations
*4:https://github.com/rubygems/rubygems.org/blob/9dd72413bed319d62eddc0bd409a963ef4e7e868/app/controllers/oidc/rubygem_trusted_publishers_controller.rb#L75-L80