정리 정책

정리 정책은 사용자가 설정한 일부 매개변수에 따라 자동으로 객체를 제거하는 주기적인 백그라운드 프로세스입니다.

컨테이너 레지스트리

컨테이너 레지스트리에 대한 정리 정책은 단일 프로젝트 내에 호스팅된 모든 컨테이너 리포지토리에서 작동합니다.

정리 매개변수와 일치하는 모든 태그가 제거됩니다.

매개변수

ContainerExpirationPolicy는 컨테이너 레지스트리 정리 정책에 대한 모든 매개변수를 포함합니다.

매개변수는 두 그룹으로 나뉩니다:

  • 유지할 태그를 정의하는 매개변수:
    • keep_n. 가장 최근의 n개 태그를 유지합니다.
    • name_regex_keep. 이 정규 표현식과 일치하는 태그를 유지합니다.
  • 제거할 태그를 정의하는 매개변수:
    • older_than. 이 타임스탬프보다 오래된 태그를 제거합니다.
    • name_regex. 이 정규 표현식과 일치하는 태그를 제거합니다.

나머지 매개변수는 정책이 실행되는 시점에 영향을 미칩니다:

  • enabled. 정책이 활성화되었는지 여부를 정의합니다.
  • cadence. 정책의 실행 주기를 정의합니다.
  • next_run_at. 다음 실행이 언제 발생해야 하는지를 정의합니다.

실행

GitLab.com에서 처리해야 하는 정책의 수가 많기 때문에, 실행은 다음과 같은 방식으로 설계됩니다.

  • 정책 실행은 시간에 제한됩니다.
  • 정책 실행은 완전하거나 부분적입니다.
  • 백그라운드 작업은 두 가지 우선 순위를 기반으로 다음 작업을 실행할 대상을 고려합니다:
    • 과거의 next_run_at이 있는 정책.
    • 부분적으로 실행된 정책.

컨테이너 리포지토리에서 정리 정책 상태를 추적하기 위해 ContainerRepository 모델에 expiration_policy_cleanup_status가 있습니다.

이 실행을 위한 백그라운드 작업은 다음과 같이 구성됩니다:

  • 매시간 실행되는 크론 백그라운드 작업.
  • 정책 실행이 필요한 컨테이너 리포지토리에 대해 반복되는 일련의 백그라운드 작업.

크론 백그라운드 작업

크론 백그라운드 작업은 꽤 간단합니다.

주요 작업은 다음과 같습니다:

  1. 정리가 필요한 컨테이너 리포지토리가 있는지 확인합니다.

    있는 경우, 필요에 따라 제한된 용량의 작업을 최대 한도로 큐에 추가합니다.

  2. 정리 정책에 대한 메트릭을 계산하고 이를 기록합니다.

제한된 용량 작업

작업제한된 용량 고려 사항에 기반합니다.

이 작업은 특정 용량까지 병렬로 실행됩니다.

이 작업의 주요 책임은 정리가 필요한 다음 컨테이너 리포지토리를 선택하고 이에 대한 관련 서비스를 호출하는 것입니다.

여기에서 두 가지 우선 순위가 순서대로 평가됩니다.

컨테이너 리포지토리가 발견되면, 정리 서비스가 호출됩니다.

특정 컨테이너 리포지토리에서 한 번에 하나의 정리만 실행되도록 보장하기 위해 데이터베이스 잠금과 함께 expiration_policy_cleanup_status 열을 사용합니다.

이 작업은 더 이상 정리가 필요한 컨테이너 리포지토리가 없을 때까지 자기 자신을 재차 큐에 추가합니다.

서비스

여기 제한 용량 작업에서 발생하는 서비스 호출이 있습니다:

flowchart TD job[제한 용량 작업] --> cleanup([ContainerExpirationPolicies::CleanupService]) cleanup --> cleanup_tags([Projects::ContainerRepository::CleanupTagsService]) cleanup_tags --> delete_tags([Projects::ContainerRepository::DeleteTagsService])

클린업 태그 서비스는 파괴할 태그 목록을 빌드하기 위해 매우 특정한 실행 순서를 사용합니다.

마지막으로, 클린업 태그 서비스와 삭제 태그 서비스는 파사드를 사용하여 작동합니다. 실제 구현은 연결된 컨테이너 레지스트리의 유형에 따라 달라집니다. GitLab 컨테이너 레지스트리가 연결된 경우, 여러 개선 사항이 클린업 정책 실행 중에 사용 가능합니다. 그러한 개선 사항에는 컨테이너 레지스트리 API의 더 나은 사용 등이 포함됩니다.

역사적 참조 링크