Files
artifactapi/docs/gems/local.md
T
unkin-agent 7dd7fc70d1 Add local gems repositories (#153)
In-house gems have nowhere to publish: gems locals only take raw file uploads, which `gem push`, `gem install` and bundler cannot use.

- accept `gem push` (`POST <repo>/api/v1/gems`, 256MiB cap, 8MiB metadata cap) and `gem yank` (`DELETE <repo>/api/v1/gems/yank`); any API key works
- parse the gemspec from the `.gem`; reject an existing name-version-platform with 409
- serve the compact index (`versions`, `info/<gem>`, `names`), `.gem` files and generated `quick/Marshal.4.8` specs; no legacy `specs.4.8.gz`
- route HEAD on locals (gem probes `versions` with HEAD)
- add `docs/gems/local.md`, a UI snippet and a stock `ruby:3.3` e2e-docker case

Reviewed-on: #153
Co-authored-by: unkin-agent <unkin-agent@unkin.net>
Co-committed-by: unkin-agent <unkin-agent@unkin.net>
2026-10-18 01:12:37 +11:00

977 B

Local gems repository

A local gems repo is a RubyGems source: gem push, gem yank, gem install and bundle install work against /api/v1/local/<repo>. gem push needs an API key; any value works.

GEM_HOST_API_KEY=unused gem push --host https://artifactapi.example.com/api/v1/local/<repo> mygem-1.0.0.gem
gem install mygem --source https://artifactapi.example.com/api/v1/local/<repo>/
gem yank mygem -v 1.0.0 --host https://artifactapi.example.com/api/v1/local/<repo>
# Gemfile
source "https://artifactapi.example.com/api/v1/local/<repo>/"
gem "mygem"

The repo serves the compact index (versions, info/<gem>, names), gems/*.gem and quick/Marshal.4.8/*.gemspec.rz. The legacy specs.4.8.gz indexes are not served; current gem and bundler clients use the compact index.

Versions are immutable: pushing an existing name-version-platform is rejected with 409. A yanked version disappears from the index and its files are removed.