정리 정책

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

컨테이너 레지스트리

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

매개변수

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시간마다 실행되는 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의 더 나은 활용 과 같은 정리 정책 실행 중에 사용 가능하고 사용되는 여러 개선 사항이 있습니다.

과거 참조 링크