This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned on this page are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
Status Authors Coach DRIs Owning Stage Created
proposed -

Google Artifact Registry 통합을 위한 백엔드 변경

클라이언트 SDK

GAR과 상호작용하기 위해, 공식 GAR Ruby 클라이언트 SDK를 사용할 것입니다. 기본적으로 이 클라이언트는 Artifact Registry API의 RPC 버전을 사용할 것입니다.

클라이언트를 빌드하기 위해, 서비스 계정 키가 필요할 것입니다.

흥미로운 기능

본 청사진의 범위 내에서, Ruby 클라이언트에서 다음 기능을 사용해야 합니다:

제한사항

#list_docker_images에서 필터링이 불가능합니다. 다시 말해, 반환된 목록을 (예: 특정 이름에 대해) 필터할 수 없습니다. 그러나 몇몇 열에 대한 정렬은 가능합니다.

또한, 직접 특정 페이지를 가리키는 것은 불가능합니다. 예를 들어, 첫 번째와 두 번째 페이지를 거치지 않고 Docker 이미지 목록의 3페이지에 직접 액세스할 수 없습니다. 이 기능은 너무 많은 페이지를 거쳐야 하는 상황에 직면할 수 있기 때문에 GitLab 측에서 이 기능을 구축할 수 없습니다.

클라이언트 노출

공식 Ruby 클라이언트에 대한 액세스를 중앙화하는 것이 좋습니다. 이렇게 하면 허가 사항을 확인하기가 매우 쉬워집니다.

우리는 GoogleCloudPlatform::ArtifactRegistry::Client에 위치한 사용자 정의 클라이언트 클래스를 가질 것을 제안합니다. 이 클래스는 UserIntegrations::GoogleCloudPlatform::ArtifactRegistry (자세한 내용은 프로젝트 통합을 참조)를 요구할 것입니다.

그런 다음, 이 클라이언트는 공식 클라이언트의 이름과 유사한 함수인 #repository, #docker_images, #docker_image를 노출해야 합니다.

공식 클라이언트를 호출하기 전에, 이 클래스에서 사용자 권한을 확인해야 합니다. 주어진 UserIntegrations::GoogleCloudPlatform::ArtifactRegistry와 관련된 Project에서 read_gcp_artifact_registry_repository를 가져야 합니다.

마지막으로, 공식 클라이언트를 설정하려면 다음을 제대로 설정해야 할 것입니다:

이에 대해서는, 값이 적절하다면 기본값을 사용하거나 고정값을 사용할 수 있습니다.

새로운 권한

프로젝트 정책에 새로운 권한이 필요할 것입니다:

  • 적어도 리포터 사용자에게 부여된 read_gcp_artifact_registry_repository.

프로젝트 통합

다음 속성을 가진 새로운 프로젝트 통합을 구축해야 합니다:

  • google_project_id - Google 프로젝트 ID. 간단한 문자열입니다.
  • google_location - Google 위치. 간단한 문자열입니다.
  • repositories - 리포지토리 이름의 배열(아래 참조).
  • json_key - 서비스 계정 JSON. 문자열이지만 텍스트 영역으로 표시됩니다.
  • json_key_base64 - base64로 인코딩된 서비스 계정 JSON. json_key에서 값을 설정합니다.

또한 파생된 속성이 있습니다:

  • repository - 리포지토리 이름. repositories에서 유도됩니다.

repositories는 리포지토리 이름을 배열에 저장하는 방법으로, 향후 다중 리포지토리를 지원해야 하는 후속 작업에 도움이 됩니다. 따라서 리포지토리 이름을 배열에 저장하고, 배열의 첫 번째 항목인 repository 속성을 만듭니다. repository 단일 속성을 가지고 있기 때문에 프론트엔드 도우미들은 프로젝트 통합에서 배열 값이 지원되지 않기 때문에 사용할 수 있습니다.

또한 json_key의 base64 버전이 필요합니다. 이는 CI/CD 변수에 필요합니다.

클래스 이름에 대해서는 Integrations::GoogleCloudPlatform::ArtifactRegistry를 사용하는 것을 제안합니다. Integrations::GoogleCloudPlatform 네임스페이스를 사용함으로써 Google Cloud Platform의 다른 서비스에 대한 가능성 있는 향후 다른 통합을 가질 수 있습니다.

구성 테스트에 관해서는 공식 API(method #get_repository)에서 리포지토리 정보를 가져오도록 해야 합니다. 호출이 성공하고 반환된 리포지토리가 DOCKER 형식이면 테스트가 성공합니다.

GraphQL API들

UI는 기본적으로 두 페이지를 가지게 됩니다: 프로젝트 통합에서 구성된 리포지토리에서 Docker 이미지를 나열하고 특정 Docker 이미지의 세부 정보를 표시합니다.

향후를 위해 다른 리포지토리 형식을 지원하기 위해, GraphQL 필드나 메소드에 공식 클라이언트 함수 이름을 매핑하지 않고 보다 재사용 가능한 접근 방식을 취하기로 결정했습니다.

모든 GraphQL 변경 사항은 alpha로 표시되어야 합니다.

먼저, ProjectType에서 google_cloud_platform_artifact_registry_repository_artifacts라는 새 필드가 필요합니다. 이는 추상의 새로운 유형인 GoogleCloudPlatform::ArtifactRegistry::ArtifactType의 목록을 반환할 것입니다. 이 목록은 페이지네이션을 지원합니다. 정렬 옵션이 있을 것입니다.

다음으로, GoogleCloudPlatform::ArtifactRegistry::DockerImageGoogleCloudPlatform::ArtifactRegistry::ArtifactType의 구체적인 유형으로 사용합니다. 이 유형은 다음과 같은 필드를 가집니다:

  • name. 문자열.
  • uri. 문자열.
  • image_size_bytes. 정수.
  • upload_time. 타임스탬프.

그런 다음, Query.google_cloud_platform_registry_registry_artifact_details라는 새로운 쿼리가 필요합니다. 이 쿼리는 GoogleCloudPlatform::ArtifactRegistry::DockerImage의 이름을 받아서 다음 필드를 가진 단일 GoogleCloudPlatform::ArtifactRegistry::ArtifacDetailsType을 반환할 것입니다:

  • GoogleCloudPlatform::ArtifactRegistry::ArtifactType의 모든 필드.
  • tags. 문자열의 배열.
  • media_type. 문자열.
  • build_time. 타임스탬프.
  • updated_time. 타임스탬프.

모든 GraphQL 변경 사항에는 사용자가 read_gcp_artifact_registry_repository 권한을 가지고 있어야 합니다.

CI/CD 변수들

Harbor 통합과 유사하게, 사용자가 GAR(Google Artifact Registry) 통합을 활성화하면, 해당 통합이 활성화되면 자동으로 추가적인 CI/CD 변수가 사용 가능해집니다. 이들은 문서에 설명된 요구사항에 따라 설정됩니다:

  • GCP_ARTIFACT_REGISTRY_URL: 이는 https://LOCATION-docker.pkg.dev으로 설정될 것입니다. 여기서 LOCATION은 통합에 구성된 GCP 프로젝트 위치입니다.
  • GCP_ARTIFACT_REGISTRY_PROJECT_URI: 이는 LOCATION-docker.pkg.dev/PROJECT-ID로 설정될 것입니다. PROJECT-ID는 통합에 구성된 GAR 리포지토리의 GCP 프로젝트 ID입니다.
  • GCP_ARTIFACT_REGISTRY_PASSWORD: 이는 통합에 구성된 서비스 계정 JSON 키 파일의 base64로 인코딩된 버전으로 설정될 것입니다.
  • GCP_ARTIFACT_REGISTRY_USER: 이는 _json_key_base64로 설정될 것입니다.

이러한 변수들은 docker login을 사용하여 로그인하거나, docker pull을 사용하여 리포지토리에서 이미지를 다운로드하는 데 사용할 수 있습니다. 이것은 순수하게 예시일 뿐입니다.

마지막으로, 구성된 서비스 계정이 Artifact Registry Writer 역할을 가지고 있다면, GAR에 이미지를 푸시할 수도 있습니다. 이에 대한 예제 역시 순수한 예시입니다.

주의: 확장성을 위해, 사용자가 위의 명령에 리포지토리 이름 (REPOSITORY)을 추가해야 합니다. 처음에는 하나의 GAR 리포지토리만 지원할 예정이지만, 나중에 여러 리포지토리를 지원하게 되면, 특정 지시를 위해 사용자가 어떤 리포지토리를 대상으로 할 것인지를 확인할 수 있는 방법이 없을 것입니다.