Status | Authors | Coach | DRIs | Owning Stage | Created |
---|---|---|---|---|---|
proposed | - |
Google Artifact Registry 통합을 위한 Backend 변경
클라이언트 SDK
GAR과 상호 작용하기 위해 공식 GAR Ruby 클라이언트 SDK를 사용할 것입니다. 기본적으로 이 클라이언트는 Artifact Registry API의 RPC 버전을 사용할 것입니다.
클라이언트를 빌드하려면 서비스 계정 키가 필요합니다.
흥미로운 기능
이 청사진의 범위 내에서 Ruby 클라이언트에서 다음 함수를 사용해야 합니다.
-
#get_repository
. API 문서. 이 함수는 단일Repository
를 반환합니다. -
#list_docker_images
. API 문서. 이 함수는 DockerImage 디렉터리을 반환합니다. -
#get_docker_image
. API 문서. 이 함수는 단일DockerImage
를 반환합니다.
제한 사항
#list_docker_images
에서 필터링이 사용할 수 없습니다. 다시 말해, 반환된 디렉터리을 필터링할 수 없습니다(예: 특정 이름 기준). 그러나 일부 열에서의 정렬만 가능합니다.
또한 특정 페이지로 직접 접근할 수 없습니다. 예를 들어, 페이지 1과 2를 거치지 않고 Docker 이미지 디렉터리의 3페이지에 직접 액세스하는 것은 불가능합니다. GitLab 측에서 이 기능을 구현할 수 없습니다. 왜냐하면 이는 모든 페이지를 거쳐가야 하며 매우 많은 페이지를 거쳐야 하는 상황이 발생할 수 있기 때문입니다.
클라이언트 노출
공식 Ruby 클라이언트에 대한 액세스를 중앙화하는 것이 좋습니다. 이렇게 하면 권한을 확인하기가 매우 쉬워집니다.
우리는 GoogleCloudPlatform::ArtifactRegistry::Client
에 위치한 사용자 및 Integrations::GoogleCloudPlatform::ArtifactRegistry
(자세한 내용은 프로젝트 통합 참조)를 요구하는 사용자 정의 클라이언트 클래스를 가질 것을 제안합니다.
이 클라이언트는 공식 클라이언트의 유사한 이름의 함수에 매핑될 #repository
, #docker_images
, #docker_image
를 노출해야 합니다.
공식 클라이언트를 호출하기 전에, 이 클래스는 사용자 권한을 확인해야 합니다. 주어진 User
는 Integrations::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::DockerImage
를 GoogleCloudPlatform::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
를 이미 포함하여 제공할 수 있습니다. 그러나 나중에 우리가 여러 리포지터리를 지원하게 되면, 특정 명령에 대해 사용자가 어떤 리포지터리를 대상으로 할 것인지 알 방법이 없습니다.