작업 아티팩트 관리

Tier: Free, Premium, Ultimate Offering: Self-managed

이 문서는 관리 문서입니다. 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을 다시 시작합니다:

    # systemd를 실행하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행하는 시스템의 경우
    sudo service gitlab restart
    

작업 아티팩트 저장

GitLab Runner는 작업 아티팩트를 포함하는 아카이브를 GitLab에 업로드할 수 있습니다. 기본적으로 작업이 성공할 때 이 작업이 수행되지만, 실패시에도 또는 항상 artifacts:when 매개변수로 수행할 수 있습니다.

대부분의 아티팩트는 GitLab Runner에 의해 전송되기 전에 압축됩니다. 이에 대한 예외는 보고 아티팩트로, 이는 업로드 후에 압축됩니다.

로컬 저장소 사용

Linux 패키지를 사용하거나 자체 컴파일된 설치를 사용하는 경우 아티팩트를 로컬로 저장하는 경로를 변경할 수 있습니다.

참고: 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을 다시 시작합니다:

    # systemd를 실행하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행하는 시스템의 경우
    sudo service gitlab restart
    

객체 저장소 사용

GitLab이 설치된 로컬 디스크를 사용하지 않고 아티팩트를 저장하려면, AWS S3와 같은 객체 저장소를 사용할 수 있습니다.

GitLab을 객체 저장소에 아티팩트를 저장하도록 구성하면 작업이 완료되면 작업 로그를 아카이브하고 객체 저장소로 이동시켜야 합니다.

경고: 다중 서버 설정에서는 작업 로그가 손실될 수 있으므로 반드시 작업 로그에 대한 로컬 디스크 사용 제거 옵션 중 하나를 사용해야 합니다.

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 작업을 실행해야 할 수 있습니다.

객체 저장소에서 로컬 저장소로 이관하기

아티팩트를 다시 로컬 저장소로 이관하려면:

  1. gitlab-rake gitlab:artifacts:migrate_to_local을 실행합니다.
  2. gitlab.rb에서 아티팩트 저장소 비활성화하기.
  3. GitLab 재구성하기.

아티팩트 만료

artifacts:expire_in을 사용하여 아티팩트의 만료일을 설정한 경우 해당 날짜가 지나면 삭제를 위해 표시됩니다. 그렇지 않은 경우 기본 아티팩트 만료 설정에 따라 만료됩니다.

아티팩트는 Sidekiq이 7분마다 실행하는 expire_build_artifacts_worker 크론 작업에 의해 삭제됩니다 (*/7 * * * *Cron 구문으로 사용).

만료된 아티팩트가 삭제되는 기본 일정을 변경하려면:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가합니다 (또는 이미 존재하고 주석 처리된 경우 주석 처리를 해제한 후 작성합니다), 적절한 경우 cron 구문을 대체합니다:

    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을 다시 시작합니다:

    # systemd를 사용하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 사용하는 시스템의 경우
    sudo service gitlab restart
    

아티팩트의 최대 파일 크기 설정

아티팩트가 활성화되어 있다면 관리자 영역 설정을 통해 아티팩트의 최대 파일 크기를 변경할 수 있습니다.

저장 공간 통계

그룹 및 프로젝트의 작업 아티팩트에 사용된 총 저장 공간을 확인할 수 있습니다:

구현 세부 정보

GitLab이 아티팩트 아카이브를 받으면 GitLab Workhorse에 의해 아카이브 메타데이터 파일도 생성됩니다. 이 메타데이터 파일에는 아티팩트 아카이브 자체에 있는 모든 항목에 대한 설명이 포함되어 있습니다. 메타데이터 파일은 이진 형식으로 되어 있으며 추가적으로 Gzip 압축을 포함합니다.

GitLab은 공간, 메모리 및 디스크 I/O를 절약하기 위해 아티팩트 아카이브를 추출하지 않습니다. 대신 관련 정보가 모두 포함된 메타데이터 파일을 검토합니다. 이는 특히 많은 양의 아티팩트가 있는 경우나 아카이브가 매우 큰 파일인 경우 중요합니다.

특정 파일을 선택하면 GitLab Workhorse가 해당 파일을 아카이브에서 추출하고 다운로드가 시작됩니다. 이 구현은 공간, 메모리 및 디스크 I/O를 절약합니다.