RubyGems Publish
Publish or update a Ruby gem on RubyGems.org with metadata optimized for discoverability
Instructions
RubyGems Publish
Publish a Ruby gem to RubyGems.org with metadata configured for developer discoverability.
Tools
| Tool | Method | Docs |
|------|--------|------|
| gem CLI | gem push | https://guides.rubygems.org/publishing/ |
| RubyGems API | POST /api/v1/gems | https://guides.rubygems.org/rubygems-org-api/ |
| GitHub Actions | rubygems/release-gem | https://github.com/rubygems/release-gem |
| Bundler | bundle exec rake release | https://bundler.io/guides/creating_gem.html |
Authentication
- gem CLI:
gem signinor setGEM_HOST_API_KEYenv var. Get key at https://rubygems.org/profile/api_keys - CI: Create a scoped API key with push permission for the specific gem.
Instructions
1. Configure gemspec for discoverability
Gem::Specification.new do |spec|
spec.name = "your-gem-name"
spec.version = "1.0.0"
spec.summary = "Verb-first summary with primary keyword."
spec.description = "Longer description with secondary keywords and use cases."
spec.homepage = "https://yoursite.com/docs/sdk/ruby?utm_source=rubygems&utm_medium=registry&utm_campaign=ruby-sdk"
spec.license = "MIT"
spec.metadata = {
"source_code_uri" => "https://github.com/org/ruby-sdk",
"changelog_uri" => "https://github.com/org/ruby-sdk/blob/main/CHANGELOG.md",
"documentation_uri" => "https://yoursite.com/docs/sdk/ruby",
"homepage_uri" => spec.homepage,
"rubygems_mfa_required" => "true"
}
spec.required_ruby_version = ">= 3.1"
spec.files = Dir["lib/**/*", "README.md", "LICENSE", "CHANGELOG.md"]
end
2. Build and publish
gem build your-gem-name.gemspec
gem push your-gem-name-1.0.0.gem
3. Verify publication
gem info your-gem-name --remote
# Visit: https://rubygems.org/gems/your-gem-name
Error Handling
| Error | Cause | Fix |
|-------|-------|-----|
| 401 Unauthorized | Invalid or expired API key | Re-authenticate with gem signin |
| Repushing of gem versions is not allowed | Version already exists | Bump version number |
| This gem name is reserved | Name conflicts with reserved names | Choose a different name, optionally prefix with org |
Notes
- README on RubyGems: RubyGems renders README.md as the gem landing page. Include CTA with
utm_source=rubygems. - Yank: To remove a version:
gem yank your-gem-name -v 1.0.0