ジョブのアーティファクト管理

これは管理のためのドキュメントです。GitLab CI/CDパイプラインでジョブアーティファクトを使用する方法については、ジョブアーティファクト設定ドキュメントをご覧ください。

アーティファクトとは、ジョブが終了した後に添付されるファイルやディレクトリのリストです。この機能はすべてのGitLabインストールでデフォルトで有効になっています。

ジョブのアーティファクトを無効にする

サイト全体でアーティファクトを無効にするには、以下の手順に従います:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb を編集します:

    gitlab_rails['artifacts_enabled'] = false
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Helm の値をエクスポートします:

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

ジョブのアーティファクトの保存

GitLab Runnerはジョブのアーティファクトを含むアーカイブをGitLabにアップロードすることができます。デフォルトではジョブが成功したときにアップロードされますが、artifacts:when パラメータで失敗したときや常にアップロードすることもできます。

ほとんどのアーティファクトは GitLab Runner によって圧縮されてからコーディネータに送られます。ただし、レポートのアーティファクトは例外で、アップロード後に圧縮されます。

ローカルストレージの使用

Linux パッケージを使用している場合、またはセルフコンパイルしたインストールを使用している場合、アーティファクトをローカルに保存する場所を変更することができます。

note
Dockerインストールの場合は、データがマウントされるパスを変更できます。Helmチャートでは、オブジェクトストレージを使用してください。
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
    
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
    

オブジェクトストレージの使用

GitLabがインストールされているローカルディスクを使ってアーティファクトを保存したくない場合は、代わりにAWS S3のようなオブジェクトストレージを使うことができます。

オブジェクトストレージにアーティファクトを保存するようにGitLabを設定する場合、ジョブログのためのローカルディスクの使用も省きたいかもしれません。どちらの場合も、ジョブログはアーカイブされ、ジョブが完了するとオブジェクトストレージに移動します。

caution
マルチサーバーのセットアップでは、ジョブログのローカルディスク使用を排除するオプションのいずれかを使用する必要があります。

GitLab 13.2以降では、連結オブジェクトストレージの設定を使用する必要があります。

オブジェクトストレージへのマイグレーション

ジョブのアーティファクトをローカルストレージからオブジェクトストレージにマイグレーションできます。処理はバックグラウンドワーカーで行われるため、ダウンタイムは必要ありません。

  1. オブジェクトストレージを設定します。
  2. アーティファクトをマイグレーションします:

    Linux package (Omnibus)
    sudo gitlab-rake gitlab:artifacts:migrate
    
    Docker
    sudo docker exec -t <container name> gitlab-rake gitlab:artifacts:migrate
    
    Self-compiled (source)
    sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production
    
  3. オプション。進捗を追跡し、PostgreSQLコンソールを使用してすべてのジョブのアーティファクトが正常にマイグレーションされたことを確認します。
    1. PostgreSQLコンソールを開きます:

      Linux package (Omnibus)
      sudo gitlab-psql
      
      Docker
      sudo docker exec -it <container_name> /bin/bash
      gitlab-psql
      
      Self-compiled (source)
      sudo -u git -H psql -d gitlabhq_production
      
    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 ディレクトリにディスク上のファイルがないことを確認します:

    Linux package (Omnibus)
    sudo find /var/opt/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
    
    Docker

    /var/opt/gitlab/srv/gitlabにマウントしたと仮定します:

    sudo find /srv/gitlab/gitlab-rails/shared/artifacts -type f | grep -v tmp | wc -l
    
    Self-compiled (source)
    sudo find /home/git/gitlab/shared/artifacts -type f | grep -v tmp | wc -l
    

場合によっては、オーファンアーティファクトファイルのクリーンアップRakeタスクを実行して、オーファンアーティファクトをクリーンアップする必要があります。

オブジェクトストレージからローカルストレージへのマイグレーション

ローカル ストレージにマイグレーションを戻すには、アーティファクト ストレージを選択的に無効にする必要があります。

期限切れのアーティファクト

artifacts:expire_in を使用してアーティファクトの有効期限を設定した場合、その日付が過ぎるとすぐに削除されます。そうでない場合は、デフォルトのアーティファクトの有効期限設定に従って期限が切れます。

アーティファクトは、Sidekiqが7分ごとに実行するexpire_build_artifacts_worker cronジョブによってクリーンアップされます(Cron構文では*/7 * * * * )。

アーティファクトが期限切れになるデフォルトのスケジュールを変更するには、次の手順に従います:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb を編集し、以下の行を追加してください(すでに存在し、コメントアウトされている場合は、コメントアウトを解除してください):

    gitlab_rails['expire_build_artifacts_worker_cron'] = "*/7 * * * *"
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (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
    
Self-compiled (source)
  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
    

アーティファクトの最大ファイルサイズの設定

アーティファクトが有効になっている場合、管理エリアの設定でアーティファクトの最大ファイルサイズを変更できます。

ストレージの統計

グループやプロジェクトのアーティファクトに使用されているストレージの合計は、管理エリアやグループプロジェクトのAPIで確認できます。

実装の詳細

GitLabがアーティファクトアーカイブを受け取ると、GitLab Workhorseによってアーカイブメタデータファイルも生成されます。このメタデータファイルには、アーティファクトアーカイブ自体にあるすべてのエントリが記述されています。メタデータファイルはバイナリ形式で、Gzip圧縮が追加されています。

GitLabはスペース、メモリ、ディスクI/Oを節約するためにアーティファクトアーカイブを抽出しません。代わりに、すべての関連情報を含むメタデータファイルを検査します。これは、アーティファクトが大量にある場合やアーカイブが非常に大きなファイルである場合に特にインポートされます。

特定のファイルを選択すると、GitLab Workhorseはアーカイブからそのファイルを抽出し、ダウンロードを開始します。この実装はスペース、メモリ、ディスクI/Oを節約します。