极狐 GitLab 软件包仓库管理
Tier: 基础版,专业版,旗舰版
Offering: 私有化部署
要将极狐GitLab 用作各种常见软件包管理器的私有仓库,请使用软件包仓库。 你可以构建和发布软件包,这些软件包可以作为依赖项在下游项目中使用。
支持的格式
软件包仓库支持以下格式:
| 软件包类型 | 极狐GitLab 版本 |
|---|---|
| Composer | 13.2+ |
| Conan 1 | 12.6+ |
| Conan 2 | 18.1+ |
| Go | 13.1+ |
| Maven | 11.3+ |
| npm | 11.7+ |
| NuGet | 12.8+ |
| PyPI | 12.10+ |
| Generic packages | 13.5+ |
| Helm Charts | 14.1+ |
软件包仓库还用于存储 模型仓库数据。
接受贡献
下表列出了不支持的软件包格式。 考虑为极狐GitLab 做出贡献,以增加对这些格式的支持。
速率限制
在下游项目中下载作为依赖项的软件包时,会通过软件包 API 发出许多请求。因此,你可能会达到强制执行的用户和 IP 速率限制。要解决此问题,你可以为软件包 API 定义特定的速率限制。有关更多详细信息,请参见 软件包仓库速率限制。
启用或禁用软件包仓库
软件包仓库默认启用。要禁用它:
-
编辑 /etc/gitlab/gitlab.rb:
ruby# Change to true to enable packages - enabled by default if not defined gitlab_rails['packages_enabled'] = false -
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
更改存储路径
默认情况下,软件包存储在本地,但你可以更改默认的本地位置,甚至使用对象存储。
更改本地存储路径
默认情况下,软件包存储在相对于极狐GitLab 安装目录的本地路径中:
- Linux 安装包 (Omnibus): /var/opt/gitlab/gitlab-rails/shared/packages/
- 从源代码编译: /home/git/gitlab/shared/packages/
要更改本地存储路径:
-
编辑 /etc/gitlab/gitlab.rb 并添加以下行:
rubygitlab_rails['packages_storage_path'] = "/mnt/packages" -
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
如果你已在旧存储路径中存储了软件包,请将所有内容从旧位置移动到新位置,以确保现有软件包可以继续访问:
shellmv /var/opt/gitlab/gitlab-rails/shared/packages/* /mnt/packages/
Docker 和 Kubernetes 不使用本地存储。
- 对于 Helm chart (Kubernetes): 请改用对象存储。
- 对于 Docker: /var/opt/gitlab/ 目录已挂载到主机的一个目录上。无需更改容器内的本地存储路径。
使用对象存储
你可以使用对象存储来存储软件包,而不是依赖本地存储。
有关更多信息,请参见如何使用 统一对象存储设置。
在对象存储和本地存储之间迁移软件包
配置对象存储后,你可以使用以下任务在本地和远程存储之间迁移软件包。该过程在后台 worker 中处理,无需停机。
迁移到对象存储
迁移任务将软件包文件和元数据缓存移动到对象存储:软件包文件 (packages_package_files)、Helm 元数据缓存 (packages_helm_metadata_caches)、NPM 元数据缓存 (packages_npm_metadata_caches) 和 NuGet 符号 (packages_nuget_symbols)。如果你之前运行过迁移,并保留了上述任何类型的文件,请再次运行该任务;它将迁移所有剩余的本地文件。
-
将软件包迁移到对象存储:
shellsudo gitlab-rake "gitlab:packages:migrate"
shellRAILS_ENV=production sudo -u git -H bundle exec rake gitlab:packages:migrate
-
使用 PostgreSQL 控制台跟踪进度并验证所有软件包是否已成功迁移:
shellsudo gitlab-rails dbconsole
shellsudo gitlab-rails dbconsole --database main
shellRAILS_ENV=production sudo -u git -H psql -d gitlabhq_production
-
使用以下 SQL 查询验证所有软件包是否已迁移到对象存储。objectstg 的数量应与 total 相同:
sqlSELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM packages_package_files;示例输出:
plaintexttotal | filesystem | objectstg ------+------------+----------- 34 | 0 | 34 -
最后,验证 packages 目录在磁盘上是否没有文件:
shellsudo find /var/opt/gitlab/gitlab-rails/shared/packages -type f | grep -v tmp | wc -l
shellsudo -u git find /home/git/gitlab/shared/packages -type f | grep -v tmp | wc -l
从对象存储迁移到本地存储
迁移的类型与迁移到对象存储时相同(软件包文件、Helm 元数据缓存、NPM 元数据缓存和 NuGet 符号)。
-
将软件包从对象存储迁移到本地存储:
shellsudo gitlab-rake "gitlab:packages:migrate[local]"
shellRAILS_ENV=production sudo -u git -H bundle exec rake "gitlab:packages:migrate[local]"
-
使用 PostgreSQL 控制台跟踪进度并验证所有软件包是否已成功迁移:
shellsudo gitlab-rails dbconsole
shellsudo gitlab-rails dbconsole --database main
shellRAILS_ENV=production sudo -u git -H psql -d gitlabhq_production
-
使用以下 SQL 查询验证所有软件包是否已迁移到本地存储。filesystem 的数量应与 total 相同:
sqlSELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM packages_package_files;示例输出:
plaintexttotal | filesystem | objectstg ------+------------+----------- 34 | 34 | 0 -
最后,验证 packages 目录中是否存在文件:
shellsudo find /var/opt/gitlab/gitlab-rails/shared/packages -type f | grep -v tmp | wc -l
shellsudo -u git find /home/git/gitlab/shared/packages -type f | grep -v tmp | wc -l