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.ymlimage: 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.ymlimage: 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:latest로 gcloud를 다운로드하고 있습니다.
 참고
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.ymlimage: 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.ymlimage: 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:latest로 gcloud를 다운로드하고 있습니다.
 참고
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:latest로 gcloud를 다운로드하고 있습니다.참고
Reference
이 문제에 관하여(GitLab.com에서 Docker 이미지를 GoogleContainerRegistry로 푸시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/proudust/items/d94c60ec69dead927954텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)