きっかけ
https://github.com/smartbank-inc/action_ip_filter のソースを見てたら https://github.com/rubygems/release-gem が使われていたのでついカッとなってやりました。
3日間で計50リポジトリくらいで作業してgemをリリースしてまわったと思います。

作業全部終わってから気づいたけどCursorとかにやらせればよかったな...
参考にしたドキュメント
この辺はむっちゃ読みました。
github.com
guides.rubygems.org
guides.rubygems.org
参考にした設定
下記を参考にしました。
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
with:
egress-policy: audit
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
- name: Set up Ruby
uses: ruby/setup-ruby@eaecf785f6a34567a6d97f686bbb7bccc1ac1e5c
with:
bundler-cache: true
ruby-version: ruby
- name: Publish to RubyGems
uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32
- 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を手動実行
https://github.com/ruby-go-gem/go-gem-wrapper ではrubygems/release-gemを導入できずに導入後にrevertしました。
他リポジトリと同様の手順で導入したら、Gemfile.lockに書かれているgemのバージョンと違うバージョンをbundlerがロードしようとして謎でした...
詳しいログ。
bundler 2.7.2でのエラー
github.com
bundler 4.0.0でのエラー
github.com
2025/12/10 13:14 追記
id:r7kamura さんみたいにworkflow用のリポジトリを作ってそこに集約させるの全然アリだな。この方式パクらせてもらおうw
https://github.com/r7kamura/slimi/blob/08a68e419692a8d681e9e078a38fc40604cff6c1/.github/workflows/release.yml
github.com
2025/12/11 12:51 追記
現状だと無理っぽい...