정리 정책

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

컨테이너 레지스트리

컨테이너 레지스트리의 정리 정책은 단일 프로젝트에 호스팅된 모든 컨테이너 저장소에 작용합니다. 정리 매개변수와 일치하는 모든 태그가 제거됩니다.

매개변수

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가 있습니다.

이 실행에 대한 백그라운드 작업은 다음과 같은 위치에 구성됩니다.

  • 매 시간 실행되는 cron 백그라운드 작업.
  • 정책 실행이 필요한 컨테이너 저장소를 반복하는 일련의 백그라운드 작업.

cron 백그라운드 작업

cron 백그라운드 작업은 매우 간단합니다. 주요 작업은 다음과 같습니다.

  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의 더 나은 사용과 같은 개선 사항이 가능하며 정리 정책 실행 중에 사용됩니다.

과거 참조 링크