作业产物管理

本文是管理员文档。要了解如何在极狐GitLab CI/CD 流水线中使用作业产物,请参阅作业产物配置文档

产物是作业完成后附加到作业的文件和目录列表。在所有极狐GitLab 安装中默认启用此功能。

禁用作业产物

要在站点范围内禁用产物:

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['artifacts_enabled'] = false
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        artifacts:
          enabled: false
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

:::TabTitle Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['artifacts_enabled'] = false
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      artifacts:
        enabled: false
    
  2. 保存文件并重启极狐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 包或自编译安装,则可以更改产物在本地存储的位置。

note 对于 Docker 安装实例,您可以更改装载数据的路径。对于 Helm chart 安装实例,请使用对象存储

::Tabs

:::TabTitle Linux package (Omnibus)

产物默认存储在 /var/opt/gitlab/gitlab-rails/shared/artifacts 中。

  1. 要修改存储路径,比如到 /mnt/storage/artifacts,编辑 /etc/gitlab/gitlab.rb 并添加或修改以下内容:

    gitlab_rails['artifacts_path'] = "/mnt/storage/artifacts"
    
  2. 保存文件并重新配置GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Self-compiled (source)

产物默认存储在 /home/git/gitlab/shared/artifacts

  1. 要修改存储路径,比如到 /mnt/storage/artifacts,编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下内容:

    production: &base
      artifacts:
        enabled: true
        path: /mnt/storage/artifacts
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

::EndTabs

使用对象存储

如果您不想使用安装极狐GitLab 的本地磁盘来存储产物,则可以改用像 AWS S3 这样的对象存储。

如果您将极狐GitLab 配置为在对象存储上存储产物,您可能还想禁用作业日志使用本地磁盘。 在这两种情况下,作业日志都会在作业完成时存档并移动到对象存储中。

caution 在多服务器设置中,您必须使用选项之一来禁用作业日志使用本地磁盘,否则作业日志可能会丢失。

我们应该使用统一形式对象存储设置

迁移到对象存储

您可以将作业产物从本地存储迁移到对象存储。使用以下任务将现有作业产物从本地存储迁移到远程存储。处理在后台 worker 中完成,要求无停机时间

  1. 配置对象存储
  2. 迁移产物:

    ::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

  3. 可选。追踪进度并验证所有作业产物都已通过 PostgreSQL 控制台完成了迁移。
    1. 打开一个 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

    2. 验证所有的产物都使用如下 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
      
  4. 验证在 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 任务来清理孤立产物。

从对象存储迁移到本地存储

将作业产物迁移回本地存储:

  1. 运行 gitlab-rake gitlab:artifacts:migrate_to_local
  2. gitlab.rb选择性地禁用产物存储
  3. 重新配置GitLab

过期产物

如果 artifacts:expire_in 用于设置产物的到期时间,则在该日期过后将立即将其标记为删除。否则,它们会根据默认产物过期设置过期。

产物由 Sidekiq 每 7 分钟运行一次的 expire_build_artifacts_worker cron 作业清理(*/7 * * * *)。

要更改产物过期的默认计划:

::Tabs

Omnibus

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行(如果它已经存在并被注释掉,则取消注释),用 cron 语法替换您的计划:

    gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

Kubernetes

  1. 导出 Helm 值:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        cron_jobs:
          expire_build_artifacts_worker:
            cron: "*/7 * * * *"
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

源安装

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      cron_jobs:
        expire_build_artifacts_worker:
          cron: "*/7 * * * *"
    
  2. 保存文件并重启极狐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。