GitLab.com에서 Docker 이미지를 GoogleContainerRegistry로 푸시

소개



GitLab.com에서 만든 프로젝트의 Docker 이미지를 GCP에서 사용하려면 Google Container Registry로 푸시합니다.

1. [GCP] 어비스 계정 얻기



GitLab에서 GCR에 액세스하기 위한 서비스 계정을 발급합니다.
GCP 프로젝트 > IAM 및 관리 > 서비스 계정 > 서비스 계정을 게시에서 발급합니다.


1-1. 서비스 계정 세부정보



서비스 계정 이름, 서비스 계정 ID 및 서비스 계정 설명을 설정합니다.
여기는 자유롭게 설정해 OK입니다.


1-2. 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여



만든 서비스 계정에 프로젝트에 대한 액세스 권한을 설정합니다.
여기에서는 Project > 편집자의 권한을 설정합니다.
Project > 참조자, Cloud Build > Cloud Build 편집자, 스토리지 > 스토리지 관리자의 3개라도 할 수 있는 것 같습니다만 내 환경에서는 잘 움직이지 않았습니다.


1-3. 사용자가 이 서비스 계정에 액세스하도록 허용



액세스 권한 부여는 무시하고 GitLab에서 서비스 계정에 로그인하는 키를 만듭니다.
종류로 JSON을 선택하고 만들기를 누르면 JSON 키가 다운로드됩니다.

2. [GitLab] 환경 변수 설정



GitLab 프로젝트 > 설정 > CI/CD > 변수 에서 CI에서 사용할 환경 변수를 설정합니다.
설정할 변수는 다음 두 가지입니다.


변수 이름
내용            


GCLOUD_SERVICE_KEY
1.에서 취득한 JSON 키의 내용을 copipe

PROJECT_ID_PRODUCTION
GCP 프로젝트 이름


3. [GitLab].gitlab-ci.yml 작성



3-1. Cloud Build를 사용하는 경우



.gitlab-ci.yml
image: google/cloud-sdk:alpine

services:
  - docker:dind

before_script:
  - echo $GCLOUD_SERVICE_KEY > ${HOME}/gcloud-service-key.json
  - gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json
  - gcloud config set project $PROJECT_ID_PRODUCTION

build-master:
  stage: build
  script:
    - gcloud builds submit --tag "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME" .
  only:
    - master

build:
  stage: build
  script:
    - gcloud builds submit --tag "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG" .
  except:
    - master
before_script에서 gcloud를 인증하고 stage: build에서 Cloud Build를 시작합니다.gcloud config set project 를 잊으면 권한이 부족하다는 오류가 나오므로 조심하세요. (1패)

3-2. docker push 명령을 사용하는 경우



.gitlab-ci.yml
image: docker:latest

variables:
  DOCKER_DRIVER: overlay

services:
  - docker:dind

before_script:
  - apk add --update make ca-certificates openssl python
  - update-ca-certificates
  - wget https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz
  - tar zxvf google-cloud-sdk.tar.gz && ./google-cloud-sdk/install.sh --usage-reporting=false --path-update=true
  - google-cloud-sdk/bin/gcloud --quiet components update
  - google-cloud-sdk/bin/gcloud auth configure-docker
  - docker login -u _json_key -p "$GCLOUD_SERVICE_KEY" https://asia.gcr.io

build-master:
  stage: build
  script:
    - docker build --pull -t "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME" .
    - docker push "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME"
  only:
    - master

build:
  stage: build
  script:
    - docker build --pull -t "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG" .
    - docker push "asia.gcr.io/$PROJECT_ID_PRODUCTION/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG"
  except:
    - master
google/cloud-sdk:alpine 이미지로 docker build를 이동하는 것이 더 빠르다고 생각되지만, 잘 움직이지 않았기 때문에 어쩔 수없이 docker:latestgcloud를 다운로드하고 있습니다.

참고


  • Build and Push images to GCP Container Registry with Gitlab CI
  • Publishing Google Cloud Container Registry Images from Gitlab CI
  • 좋은 웹페이지 즐겨찾기