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. The development, release, and timing of any products, features, or functionality may be subject to change or delay and remain at the sole discretion of GitLab Inc.
Status Authors Coach DRIs Owning Stage Created
proposed -

Google Artifact Registry 통합을 위한 Backend 변경

클라이언트 SDK

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

클라이언트를 빌드하려면 서비스 계정 키가 필요합니다.

흥미로운 기능

이 청사진의 범위 내에서 Ruby 클라이언트에서 다음 함수를 사용해야 합니다.

제한 사항

#list_docker_images에서 필터링이 사용할 수 없습니다. 다시 말해, 반환된 디렉터리을 필터링할 수 없습니다(예: 특정 이름 기준). 그러나 일부 열에서의 정렬만 가능합니다.

또한 특정 페이지로 직접 접근할 수 없습니다. 예를 들어, 페이지 1과 2를 거치지 않고 Docker 이미지 디렉터리의 3페이지에 직접 액세스하는 것은 불가능합니다. GitLab 측에서 이 기능을 구현할 수 없습니다. 왜냐하면 이는 모든 페이지를 거쳐가야 하며 매우 많은 페이지를 거쳐야 하는 상황이 발생할 수 있기 때문입니다.

클라이언트 노출

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

우리는 GoogleCloudPlatform::ArtifactRegistry::Client에 위치한 사용자 및 Integrations::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 속성을 만듭니다. 이렇게 하면 프론트엔드 도우미에서 배열값을 사용할 수 있습니다.

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

클래스 이름에 대해, Integrations::GoogleCloudPlatform::ArtifactRegistry를 사용하는 것을 제안합니다. Integrations::GoogleCloudPlatform 네임스페이스를 사용하면 Google Cloud Platform의 다른 서비스를 위한 가능한 향후 다른 통합도 지원할 수 있습니다.

구성 테스트에 대해서는 공식 API에서 리포지터리 정보 (메소드 #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. 타임스탬프.

그 다음, 주어진 GoogleCloudPlatform::ArtifactRegistry::DockerImage의 이름을 사용하여 단일 GoogleCloudPlatform::ArtifactRegistry::ArtifacDetailsType를 반환할 새로운 쿼리 Query.google_cloud_platform_registry_registry_artifact_details가 필요합니다. 이는 다음 필드를 가질 것입니다.

  • 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 login -u $GCP_ARTIFACT_REGISTRY_USER -p $GCP_ARTIFACT_REGISTRY_PASSWORD $GCP_ARTIFACT_REGISTRY_URL

마찬가지로, 이들은 docker pull을 사용하여 리포지터리에서 이미지를 다운로드하는 데에도 사용될 수 있습니다:

docker pull $GCP_ARTIFACT_REGISTRY_PROJECT_URI/REPOSITORY/myapp:latest

마지막으로, 구성된 서비스 계정이 Artifact Registry Writer 역할을 갖고 있다면, GAR에 이미지를 푸시할 수도 있습니다:

docker build -t $GCP_ARTIFACT_REGISTRY_REPOSITORY_URI/myapp:latest .
docker push $GCP_ARTIFACT_REGISTRY_REPOSITORY_URI/myapp:latest

미래 호환성을 위해, 사용자가 명령어 위에 REPOSITORY를 추가해야 하는데 이는 리포지터리 이름을 나타냅니다. 처음에는 하나의 GAR 리포지터리만 지원될 것이므로, 기술적으로 사용자가 원하는 리포지터리를 나타내는 변수인 GCP_ARTIFACT_REGISTRY_REPOSITORY_URI를 이미 포함하여 제공할 수 있습니다. 그러나 나중에 우리가 여러 리포지터리를 지원하게 되면, 특정 명령에 대해 사용자가 어떤 리포지터리를 대상으로 할 것인지 알 방법이 없습니다.