Google Artifact Management
- GitLab 16.10에서 도입,
google_cloud_support_feature_flag
라는 플래그로 함께 제공됩니다. 이 기능은 베타 상태입니다.
이 기능은 베타 상태입니다.
Google Artifact Management 통합을 사용하여 GitLab 프로젝트에 Google Artifact Registry 리포지터리를 구성하고 연결할 수 있습니다.
Google Artifact Registry를 프로젝트에 연결한 후에는 Google Artifact Registry 리포지터리에서 Docker 및 OCI 이미지를 볼 수 있으며 이미지를 푸시하고 풀 수 있습니다.
GitLab 프로젝트에서 Google Artifact Registry 설정
사전 조건:
- GitLab 프로젝트의 적어도 Maintainer 역할이 있어야 합니다.
- Artifact Registry 리포지터리에 액세스를 관리할 수 있는 권한이 있어야 합니다.
- 워크로드 ID 연합 (WLIF) 풀 및 제공자가 구성되어 Google Cloud에 인증할 수 있어야 합니다.
- 다음 구성을 갖춘 Google Artifact Registry 리포지터리가 있어야 합니다:
GitLab 프로젝트에 Google Artifact Registry 리포지터리를 연결하려면:
- GitLab에서 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 설정 > 통합을 선택합니다.
- Google Artifact Management를 선택합니다.
- 통합 활성화 아래에서 활성 확인란을 선택합니다.
- 다음 필드를 완성합니다:
- Google Cloud 프로젝트 ID: Artifact Registry 리포지터리가 있는 Google Cloud 프로젝트 ID.
- 리포지터리 이름: Artifact Registry 리포지터리의 이름.
- 리포지터리 위치: Artifact Registry 리포지터리의 Google Cloud 위치.
- Google Cloud Identity and Access Management (IAM) 정책 설정에 대한 안내에 따라 화면에 표시된 지침을 따릅니다. 자세한 내용은 IAM 정책을 참조하십시오.
- 변경 사항 저장을 선택합니다.
이제 배포 아래의 사이드바에 Google Artifact Registry 항목이 표시됩니다.
Google Artifact Registry에 저장된 이미지 보기
사전 조건:
- Google Artifact Registry가 프로젝트에 구성되어 있어야 합니다.
GitLab UI에서 연결된 Artifact Registry 리포지터리의 이미지 디렉터리을 보려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > Google Artifact Registry를 선택합니다.
- 이미지 세부 정보를 보려면 이미지를 선택합니다.
- Google Cloud 콘솔에서 이미지를 보려면 Google Cloud에서 열기를 선택합니다. 해당 Artifact Registry 리포지터리를 보려면 필요한 권한을 가져야 합니다.
CI/CD
미리 정의된 변수
Artifact Registry 통합이 활성화되면 다음 미리 정의된 환경 변수가 CI/CD에서 사용할 수 있습니다. 연결된 리포지터리에 이미지를 풀거나 푸시하는 등 Artifact Registry와 상호 작용하기 위해 이러한 환경 변수를 사용할 수 있습니다.
변수 | GitLab | Runner | 설명 |
---|---|---|---|
GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID
| 16.10 | 16.10 | Artifact Registry 리포지터리가 있는 Google Cloud 프로젝트 ID입니다. |
GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME
| 16.10 | 16.10 | 연결된 Artifact Registry 리포지터리의 이름입니다. |
GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION
| 16.10 | 16.10 | 연결된 Artifact Registry 리포지터리의 Google Cloud 위치입니다. |
Google Artifact Registry로 인증
파이프라인을 구성하여 파이프라인 실행 중에 Google Artifact Registry와 인증할 수 있습니다.
GitLab은 구성된 workload identity pool IAM 정책을 사용하고 GOOGLE_APPLICATION_CREDENTIALS
및 CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
환경 자격 증명을 제공합니다. 이러한 환경 자격 증명은 gcloud CLI 및 crane 등의 클라이언트 도구에서 자동으로 감지됩니다.
Google Artifact Registry로 인증하려면 프로젝트의 .gitlab-ci.yml
파일에서 identity
키워드를 사용하여 google_cloud
로 설정합니다.
IAM 정책
Google Cloud 프로젝트에는 Google Artifact Management 통합을 사용하려면 특정 IAM 정책이 있어야 합니다. 이 통합을 설정하면 화면에는 다음과 같은 IAM 정책을 프로젝트에서 만들기 위한 단계가 표시됩니다:
- Artifact Registry Reader 역할을 Guest 역할 이상의 GitLab 프로젝트 구성원에게 부여합니다.
- Artifact Registry Writer 역할을 Developer 역할 이상의 GitLab 프로젝트 구성원에게 부여합니다.
이러한 IAM 정책을 매뉴얼으로 만들려면 다음과 같은 gcloud
명령을 사용합니다. 다음 값을 바꿔치기합니다:
-
<your_google_cloud_project_id>
: Artifact Registry 리포지터리가 있는 Google Cloud 프로젝트 ID입니다. -
<your_workload_identity_pool_id>
: 워크로드 ID 풀의 ID입니다. 이 값은 Google Cloud IAM 통합에 사용된 값과 동일합니다. -
<your_google_cloud_project_number>
: 워크로드 ID 풀이 있는 Google Cloud 프로젝트의 번호입니다. 이 값은 Google Cloud IAM 통합에 사용된 값과 동일합니다.
gcloud projects add-iam-policy-binding '<your_google_cloud_project_id>' \
--member='principalSet://iam.googleapis.com/projects/<your_google_cloud_project_number>/locations/global/workloadIdentityPools/<your_workload_identity_pool_id>/attribute.guest_access/true' \
--role='roles/artifactregistry.reader'
gcloud projects add-iam-policy-binding '<your_google_cloud_project_id>' \
--member='principalSet://iam.googleapis.com/projects/<your_google_cloud_project_number>/locations/global/workloadIdentityPools/<your_workload_identity_pool_id>/attribute.developer_access/true' \
--role='roles/artifactregistry.writer'
사용 가능한 클레임 디렉터리은 OIDC custom claims을 참조하십시오.
예제
gcloud CLI를 사용하여 이미지 디렉터리 나열
list-images:
image: gcr.io/google.com/cloudsdktool/google-cloud-cli:466.0.0-alpine
identity: google_cloud
script:
- gcloud artifacts docker images list $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/app
crane을 사용하여 이미지 디렉터리 나열
list-images:
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: [""]
identity: google_cloud
before_script:
# https://github.com/google/go-containerregistry/issues/1886을 위한 임시 해결책
- wget -q "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v2.1.22/docker-credential-gcr_linux_amd64-2.1.22.tar.gz" -O - | tar xz -C /tmp && chmod +x /tmp/docker-credential-gcr && mv /tmp/docker-credential-gcr /usr/bin/
- docker-credential-gcr configure-docker --registries=$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev
script:
- crane ls $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/app
Docker로 이미지 가져오기
다음 예는 Google이 제공하는 독립형 Docker 자격 증명 도우미를 사용하여 Docker의 인증을 설정하는 방법을 보여줍니다.
pull-image:
image: docker:24.0.5
identity: google_cloud
services:
- docker:24.0.5-dind
variables:
# 다음 두 변수는 DinD 서비스가 TLS 모드로 시작되고 Docker CLI가 API와 통신하기 위해 올바르게 구성되도록합니다. 이 중요성에 대한 자세한 내용은 다음 위치에서 찾을 수 있습니다.
# https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-the-docker-executor-with-docker-in-docker
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- wget -q "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v2.1.22/docker-credential-gcr_linux_amd64-2.1.22.tar.gz" -O - | tar xz -C /tmp && chmod +x /tmp/docker-credential-gcr && mv /tmp/docker-credential-gcr /usr/bin/
- docker-credential-gcr configure-docker --registries=$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev
script:
- docker pull $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/app:v0.1.0
CI/CD 컴포넌트를 사용하여 이미지 복사
Google은 GitLab 컨테이너 레지스트리에서 Artifact Registry로 이미지를 복사하는 데 사용할 수있는 upload-artifact-registry
CI/CD 컴포넌트를 제공합니다.
upload-artifact-registry
컴포넌트를 사용하려면 .gitlab-ci.yml
에 다음을 추가하십시오.
include:
- component: gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main
inputs:
stage: deploy
source: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
target: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
상세 내용은 구성요소 문서를 참조하십시오.
upload-artifact-registry
컴포넌트를 사용하면 이미지를 Artifact Registry로 복사하는 작업이 간소화되며이 통합에 대한 의도 된 방법입니다. Docker 또는 Crane을 사용하려는 경우 다음 예를 참조하십시오.
Docker를 사용하여 이미지 복사
다음 예에서 독립형 Docker 자격 증명 도우미 대신 Docker 인증을 설정하는 데 gcloud
CLI를 사용합니다.
copy-image:
image: gcr.io/google.com/cloudsdktool/google-cloud-cli:466.0.0-alpine
identity: google_cloud
services:
- docker:24.0.5-dind
variables:
SOURCE_IMAGE: $CI_REGISTRY_IMAGE:v0.1.0
TARGET_IMAGE: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/app:v0.1.0
DOCKER_HOST: tcp://docker:2375
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- gcloud auth configure-docker $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev
script:
- docker pull $SOURCE_IMAGE
- docker tag $SOURCE_IMAGE $TARGET_IMAGE
- docker push $TARGET_IMAGE
Crane을 사용하여 이미지 복사
copy-image:
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: [""]
identity: google_cloud
variables:
SOURCE_IMAGE: $CI_REGISTRY_IMAGE:v0.1.0
TARGET_IMAGE: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/app:v0.1.0
before_script:
# https://github.com/google/go-containerregistry/issues/1886을 위한 임시 해결책
- wget -q "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v2.1.22/docker-credential-gcr_linux_amd64-2.1.22.tar.gz" -O - | tar xz -C /tmp && chmod +x /tmp/docker-credential-gcr && mv /tmp/docker-credential-gcr /usr/bin/
- docker-credential-gcr configure-docker --registries=$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev
script:
- crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- crane copy $SOURCE_IMAGE $TARGET_IMAGE