Packages (PREMIUM)
This document will guide you through adding another package management system support to GitLab.
See already supported package types in Packages documentation
Since GitLab packages' UI is pretty generic, it is possible to add new package system support by solely backend changes. This guide is superficial and does not cover the way the code should be written. However, you can find a good example by looking at existing merge requests with Maven and NPM support:
General information
The existing database model requires the following:
- Every package belongs to a project.
- Every package file belongs to a package.
- A package can have one or more package files.
- The package model is based on storing information about the package and its version.
API endpoints
Package systems work with GitLab via API. For example ee/lib/api/npm_packages.rb
implements API endpoints to work with NPM clients. So, the first thing to do is to
add a new ee/lib/api/your_name_packages.rb
file with API endpoints that are
necessary to make the package system client to work. Usually that means having
endpoints like:
- GET package information.
- GET package file content.
- PUT upload package.
Since the packages belong to a project, it's expected to have project-level endpoint for uploading and downloading them. For example:
GET https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/
PUT https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/
Group-level and instance-level endpoints are good to have but are optional.
NOTE: Note: To avoid name conflict for instance-level endpoints we use the package naming convention
Configuration
GitLab has a packages
section in its configuration file (gitlab.rb
).
It applies to all package systems supported by GitLab. Usually you don't need
to add anything there.
Packages can be configured to use object storage, therefore your code must support it.
Database
The current database model allows you to store a name and a version for each package.
Every time you upload a new package, you can either create a new record of Package
or add files to existing record. PackageFile
should be able to store all file-related
information like the file name
, side
, sha1
, etc.
If there is specific data necessary to be stored for only one package system support,
consider creating a separate metadata model. See packages_maven_metadata
table
and Packages::MavenMetadatum
model as example for package specific data.