7dd7fc70d1
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>
25 lines
977 B
Markdown
25 lines
977 B
Markdown
# 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.
|
|
|
|
```bash
|
|
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>
|
|
```
|
|
|
|
```ruby
|
|
# 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.
|