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
도움말