정리 정책

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

컨테이너 레지스트리

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

매개변수

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. 정리 정책에 대한 메트릭을 계산하고 기록합니다.

한정된 용량의 작업

작업한정된 용량 관련입니다.

이 작업은 특정 용량까지 병렬로 실행됩니다(설정.md#컨테이너-레지스트리).

주요 책임은 다음으로 순서대로 평가하는 것입니다. 컨테이너 리포지터리로 전달하여 관련 서비스를 호출하는 것입니다.

특정 컨테이너 리포지터리가 발견된다면 정리 서비스가 호출됩니다.

특정 컨테이너 리포지터리에서 한 번에 한 번의 정리만 실행되도록 보장하기 위해 데이터베이스 잠금과 함께 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의 더 나은 사용와 같은 정리 정책 실행 중 가능한 여러 개선 사항을 사용할 수 있습니다.

역사적 참조 링크