作业产物管理
本文是管理员文档。要了解如何在极狐GitLab CI/CD 流水线中使用作业产物,请参阅作业产物配置文档。
产物是作业完成后附加到作业的文件和目录列表。在所有极狐GitLab 安装中默认启用此功能。
禁用作业产物
要在站点范围内禁用产物:
::Tabs
:::TabTitle Linux package (Omnibus)
-
编辑
/etc/gitlab/gitlab.rb
:gitlab_rails['artifacts_enabled'] = false
-
保存文件并重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
:::TabTitle Helm chart (Kubernetes)
-
导出 Helm values:
helm get values gitlab > gitlab_values.yaml
-
编辑
gitlab_values.yaml
:global: appConfig: artifacts: enabled: false
-
保存文件并应用新值:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
:::TabTitle Docker
-
编辑
docker-compose.yml
:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['artifacts_enabled'] = false
-
保存文件并重启极狐GitLab:
docker compose up -d
:::TabTitle Self-compiled (source)
-
编辑
/home/git/gitlab/config/gitlab.yml
:production: &base artifacts: enabled: false
-
保存文件并重启极狐GitLab:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
::EndTabs
存储作业产物
GitLab Runner 可以将包含作业产物的存档上传到极狐GitLab。默认情况下,这是在作业成功时完成的,但也可以在失败时完成,或者总是使用 artifacts:when
参数完成。
大多数产物在发送到 coordinator 之前由 GitLab Runner 压缩。报告产物例外,它们在上传后被压缩。
使用本地存储
如果您使用的是 Linux 包或自编译安装,则可以更改产物在本地存储的位置。
::Tabs
:::TabTitle Linux package (Omnibus)
产物默认存储在 /var/opt/gitlab/gitlab-rails/shared/artifacts
中。
-
要修改存储路径,比如到
/mnt/storage/artifacts
,编辑/etc/gitlab/gitlab.rb
并添加或修改以下内容:gitlab_rails['artifacts_path'] = "/mnt/storage/artifacts"
-
保存文件并重新配置GitLab:
sudo gitlab-ctl reconfigure
:::TabTitle Self-compiled (source)
产物默认存储在 /home/git/gitlab/shared/artifacts
。
-
要修改存储路径,比如到
/mnt/storage/artifacts
,编辑/home/git/gitlab/config/gitlab.yml
并添加或修改以下内容:production: &base artifacts: enabled: true path: /mnt/storage/artifacts
-
保存文件并重启极狐GitLab:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
::EndTabs
使用对象存储
如果您不想使用安装极狐GitLab 的本地磁盘来存储产物,则可以改用像 AWS S3 这样的对象存储。
如果您将极狐GitLab 配置为在对象存储上存储产物,您可能还想禁用作业日志使用本地磁盘。 在这两种情况下,作业日志都会在作业完成时存档并移动到对象存储中。
我们应该使用统一形式对象存储设置。
迁移到对象存储
您可以将作业产物从本地存储迁移到对象存储。使用以下任务将现有作业产物从本地存储迁移到远程存储。处理在后台 worker 中完成,要求无停机时间。
- 配置对象存储。
-
迁移产物:
::Tabs
:::TabTitle Linux package (Omnibus)
sudo gitlab-rake gitlab:artifacts:migrate
:::TabTitle Docker
sudo docker exec -t <container name> gitlab-rake gitlab:artifacts:migrate
:::TabTitle Self-compiled (source)
sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production
::EndTabs
- 可选。追踪进度并验证所有作业产物都已通过 PostgreSQL 控制台完成了迁移。
-
打开一个 PostgreSQL 控制台:
::Tabs
:::TabTitle Linux package (Omnibus)
sudo gitlab-psql
:::TabTitle Docker
sudo docker exec -it <container_name> /bin/bash gitlab-psql
:::TabTitle Self-compiled (source)
sudo -u git -H psql -d gitlabhq_production
::EndTabs
-
验证所有的产物都使用如下 SQL 查询迁移到了对象存储。
objectstg
的数值应该和total
相同:gitlabhq_production=# SELECT 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 ci_job_artifacts; total | filesystem | objectstg ------+------------+----------- 19 | 0 | 19
-
-
验证在
artifacts
目录中没有任何文件:::Tabs
:::TabTitle Linux package (Omnibus)
sudo find /var/opt/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
:::TabTitle Docker
假设你将
/var/opt/gitlab
挂载到了/srv/gitlab
:sudo find /srv/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
:::TabTitle Self-compiled (source)
sudo find /home/git/gitlab/shared/artifacts -type f | grep -v tmp | wc -l
::EndTabs
在某些情况下,您需要运行孤立产物文件清理 Rake 任务来清理孤立产物。
从对象存储迁移到本地存储
将作业产物迁移回本地存储:
- 运行
gitlab-rake gitlab:artifacts:migrate_to_local
。 - 在
gitlab.rb
中选择性地禁用产物存储。 - 重新配置GitLab。
过期产物
如果 artifacts:expire_in
用于设置产物的到期时间,则在该日期过后将立即将其标记为删除。否则,它们会根据默认产物过期设置过期。
产物由 Sidekiq 每 7 分钟运行一次的 expire_build_artifacts_worker
cron 作业清理(*/7 * * * *
)。
要更改产物过期的默认计划:
::Tabs
Omnibus
-
编辑
/etc/gitlab/gitlab.rb
并添加以下行(如果它已经存在并被注释掉,则取消注释),用 cron 语法替换您的计划:gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
-
保存文件并重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
Kubernetes
-
导出 Helm 值:
helm get values gitlab > gitlab_values.yaml
-
编辑
gitlab_values.yaml
:global: appConfig: cron_jobs: expire_build_artifacts_worker: cron: "*/7 * * * *"
-
保存文件并应用新值:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
Docker
-
编辑
docker-compose.yml
:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
-
保存文件并重启极狐GitLab:
docker compose up -d
源安装
-
编辑
/home/git/gitlab/config/gitlab.yml
:production: &base cron_jobs: expire_build_artifacts_worker: cron: "*/7 * * * *"
-
保存文件并重启极狐GitLab:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
设置产物的最大文件大小
如果启用了产物,您可以通过管理中心设置,更改产物的最大文件大小。
存储统计
您可以在如下位置看到群组或项目中使用的存储总量:
实施细则
当极狐GitLab 收到产物存档时,GitLab Workhorse 也会生成存档元数据文件。此元数据文件描述了位于产物存档本身中的所有条目。 元数据文件采用二进制格式,带有额外的 Gzip 压缩。
极狐GitLab 不提取产物存档,节省空间、内存和磁盘 I/O。相反,它会检查包含所有相关信息的元数据文件。当存在大量产物或存档文件非常大时,这一点尤其重要。
单击特定文件时,GitLab Workhorse 从存档中提取它并开始下载。此实现可节省空间、内存和磁盘 I/O。