Skip to content

CI: master 版本號變更時自動發佈 gem 到 RubyGems(Trusted Publishing) - #50

Merged
adz624 merged 1 commit into
masterfrom
ci/gem-publish-workflow
Oct 23, 2026
Merged

adz624 merged 1 commit into
masterfrom
ci/gem-publish-workflow

Conversation

@sensui624

Copy link
Copy Markdown
Contributor

內容

新增 .github/workflows/publish.yml:當 master 上 gemspec 的版本號尚未存在於 rubygems.org 時,透過 RubyGems Trusted Publishing(OIDC)自動發佈 gem。只新增這個 workflow 檔,不改 gem 程式碼與版本號,Rakefile 已有 require "bundler/gem_tasks",不需修改。

觸發邏輯

  • 觸發:push 到 master、手動 workflow_dispatch(publish job 只在 refs/heads/master 執行)。沒有 pull_request 觸發。
  • check job:用 Gem::Specification.load 讀出 gem 名稱與版本,查詢 https://rubygems.org/api/v1/versions/super_tools.json ,版本已存在 → should_publish=false,後續全部跳過;不存在 → true。
  • test job:以 Ruby 3.4.11 + gemfiles/ruby_3.4_rails_8.1.gemfile(與 test.yml 同一組矩陣)跑 bundle exec rake t。
  • publish job:environment: gem-publish,執行 rubygems/release-gem(rake release:build、建立並推送 vX.Y.Z tag、push gem)。
  • concurrency 避免重複發佈。

安全性

  • 不儲存任何 RubyGems API key,使用 OIDC 短效 token(rubygems.org trusted publisher:superlanding/super_tools / publish.yml / gem-publish)。
  • 頂層 permissions: contents: read;只有 publish job 取得 id-token: write 與 contents: write(推 tag 用)。
  • 所有第三方 action 皆釘選 commit SHA:
    • actions/checkout 3d3c42e5aac5ba805825da76410c181273ba90b1 (v7.0.1)
    • ruby/setup-ruby b1da4809b005e0178fe08a1d57317bffc00b7b4c (v1.332.0)
    • rubygems/release-gem 7f9650160c1a4e7989fdc9855807bdbd421d8b6b (v1.4.1)
  • 無 PR 觸發,fork 的 PR 無法取得發佈權限。

⚠️ 注意

目前 master 的版本是 4.0.2,rubygems.org 最新是 4.0.1,合併此 PR 後會立即發佈 4.0.2 並建立 v4.0.2 tag。

發佈流程 checklist

  • 在 lib/super_tools/version.rb 調整版本號(並更新 Gemfile.lock 如有需要)
  • 開 PR → CI 通過 → 合併到 master
  • Actions 的「Publish gem」自動執行(若 gem-publish environment 設定了 reviewer,需核准)
  • 確認 https://rubygems.org/gems/super_tools 與 vX.Y.Z tag 已出現

@adz624
adz624 merged commit ce0dc7b into master Oct 23, 2026
10 checks passed
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.

2 participants