Google Artifact Management

Tier: Free, Premium, Ultimate Offering: GitLab.com 상태: Beta
GitLab.com에서 이 기능은 일부 사용자에게 제공됩니다. GitLab Dedicated에서는 이 기능을 사용할 수 없습니다.

이 기능은 베타 상태입니다.

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 리포지터리가 있어야 합니다:
    • Docker 형식.
    • 표준 모드. 다른 리포지터리 형식 및 모드는 지원되지 않습니다.

GitLab 프로젝트에 Google Artifact Registry 리포지터리를 연결하려면:

  1. GitLab에서 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 통합을 선택합니다.
  3. Google Artifact Management를 선택합니다.
  4. 통합 활성화 아래에서 활성 확인란을 선택합니다.
  5. 다음 필드를 완성합니다:
    • Google Cloud 프로젝트 ID: Artifact Registry 리포지터리가 있는 Google Cloud 프로젝트 ID.
    • 리포지터리 이름: Artifact Registry 리포지터리의 이름.
    • 리포지터리 위치: Artifact Registry 리포지터리의 Google Cloud 위치.
  6. Google Cloud Identity and Access Management (IAM) 정책 설정에 대한 안내에 따라 화면에 표시된 지침을 따릅니다. 자세한 내용은 IAM 정책을 참조하십시오.
  7. 변경 사항 저장을 선택합니다.

이제 배포 아래의 사이드바에 Google Artifact Registry 항목이 표시됩니다.

Google Artifact Registry에 저장된 이미지 보기

사전 조건:

  • Google Artifact Registry가 프로젝트에 구성되어 있어야 합니다.

GitLab UI에서 연결된 Artifact Registry 리포지터리의 이미지 디렉터리을 보려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > Google Artifact Registry를 선택합니다.
  3. 이미지 세부 정보를 보려면 이미지를 선택합니다.
  4. 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_CREDENTIALSCLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE 환경 자격 증명을 제공합니다. 이러한 환경 자격 증명은 gcloud CLIcrane 등의 클라이언트 도구에서 자동으로 감지됩니다.

Google Artifact Registry로 인증하려면 프로젝트의 .gitlab-ci.yml 파일에서 identity 키워드를 사용하여 google_cloud로 설정합니다.

IAM 정책

Google Cloud 프로젝트에는 Google Artifact Management 통합을 사용하려면 특정 IAM 정책이 있어야 합니다. 이 통합을 설정하면 화면에는 다음과 같은 IAM 정책을 프로젝트에서 만들기 위한 단계가 표시됩니다:

이러한 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