iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 19

Day19 - GitLab CI 上傳 Image 到 Google Container Registry

  • 分享至 

  • xImage
  •  

如何建立 Publish Stage

前一天我們將 Image Build 好並上傳到 GitLab 的 Registry 以便暫時儲存,當測試完成準備進入部屬,就要推送到生產環境的 Registry 。 在使用 Docker-in-Docker 的框架下,只需要把 Image 給 pull 下來 ,tag 修改一下就可以 push 了。

https://ithelp.ithome.com.tw/upload/images/20210919/20139235uJKJ0ymL4c.png

了解完上述概念, Publish 的 Job 寫法大致上會長這樣,唯一的問題就只剩要如何擁有 GCP 的權限了。

publish:
  stage: publish
  only:
    - master
  before_script:
    - # 登入到 GitLab 的 Container Registry
    - # 登入到 GCP 的 Container Registry
  script:
    - docker pull $CI_IMAGE  
    - docker tag $CI_IMAGE $DEPLOY_IMAGE
    - docker push $DEPLOY_IMAGE

建立 IAM 服務

要讓 GitLab 有存取 GCP 的權限,可以建立 Identity and Access Management (IAM) 來讓我們管理對 GCP 服務資源的存取, 下面就來創建一個管理 GCP Storage 的 IAM 使用者。

  1. 進入 GCP 網站

  2. 點擊 console 左上角 -> IAM 與管理 -> 服務帳戶

https://ithelp.ithome.com.tw/upload/images/20210918/201392354kSc4vKF5C.png

  1. 點擊建立服務帳戶

https://ithelp.ithome.com.tw/upload/images/20210918/20139235FCFgSNihjo.png

  1. 服務帳戶名稱輸入 gitlab-ci-publish ,接著點選建立並繼續

https://ithelp.ithome.com.tw/upload/images/20210918/20139235W0tE15Kqbg.png

  1. 點擊請選擇角色,找到 Cloud Storage -> Storage 管理員 並選取

https://ithelp.ithome.com.tw/upload/images/20210918/20139235UhRN3wNcsD.png

  1. 點擊繼續,接著點選完成

https://ithelp.ithome.com.tw/upload/images/20210918/201392355WcvNP72Az.png

  1. 服務帳號建立完成後,點擊 gitlab-ci-publish 的服務帳戶

https://ithelp.ithome.com.tw/upload/images/20210918/20139235KW9tNIe5BM.png

  1. 點選金鑰

https://ithelp.ithome.com.tw/upload/images/20210918/20139235rsYW695z3T.png

  1. 點擊新增金鑰 -> 建立新的金鑰

https://ithelp.ithome.com.tw/upload/images/20210918/201392352txnj60SaI.png

  1. 金鑰類型選取 JSON,接著按下建立

https://ithelp.ithome.com.tw/upload/images/20210918/20139235p8gZX3wXJj.png

金鑰就會下載到電腦裡,可用來存取雲端資源。

https://ithelp.ithome.com.tw/upload/images/20210918/20139235d1z0CNJyjQ.png

有了此金鑰等於擁有 gitlab-ci-publish 服務帳戶的權限,不能隨意將金鑰外流。

使用環境變數將資料放入 GitLab 上

有了金鑰檔案之後,可以將其儲存到 GitLab 的環境變數,在執行 CI/CD Pipeline 時就能透過金鑰獲取 GCP 的權限,馬上來實際操作看看。

  1. GitLab 網站,點擊之前建立的 web app 的 Repository

  2. 進入到 Repository 後,點擊 Settings -> CI/CD

https://ithelp.ithome.com.tw/upload/images/20210918/20139235fUSYS3FgZu.png

  1. 找到 Variables ,展開後點擊 Add variable

https://ithelp.ithome.com.tw/upload/images/20210918/20139235xjS9KRNyHP.png

  1. 輸入以下資訊,完成後點選 Add variable
  • Key : PROJECT_ID
  • Value : < 你的 GCP Project ID >
  • Type : Variable

https://ithelp.ithome.com.tw/upload/images/20210918/20139235lSxz6xSIvD.png

  1. 再次新增 Variable ,輸入以下資訊,完成後點選 Add variable
  • Key: GCP_KEY
  • Value: < 剛剛下載的金鑰.json 內容 >
  • Type: File

https://ithelp.ithome.com.tw/upload/images/20210918/201392354Eb4ze7tlh.png

這樣 PROJECT_ID 以及 GCP_KEY 的環境變數就建置完成。

https://ithelp.ithome.com.tw/upload/images/20210918/20139235XUkKb4jWha.png

建立 Publish Stage

準備好金鑰,就可以建置 Publish Stage 了。

  1. 進入 Cloud Shell 網站

  2. 點擊左上 Explorer -> Open Folder -> 選擇 project 資料夾 -> Open

  1. 點擊 .gitlab-ci.yml 檔案並用以下內容取代

https://ithelp.ithome.com.tw/upload/images/20210918/20139235F4503Uf3JH.png

  • .gitlab-ci.yml
image: docker

services:
  - docker:dind
 
variables:
  IMAGE_NAME: node-project
  CI_IMAGE: $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
  HOST_NAME: gcr.io
  DEPLOY_IMAGE: $HOST_NAME/$PROJECT_ID/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA

stages:
  - build
  - test
  - publish
  - stg-deploy
  - prod-deploy

build:
  stage: build
  only:
    - dev
    - master
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_IMAGE .
    - docker push $CI_IMAGE

test:
  stage: test
  only:
    - dev
    - master
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker pull $CI_IMAGE
    - docker run $CI_IMAGE echo "run test script here"

publish:
  stage: publish
  only:
    - master
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - cat $GCP_KEY | docker login -u _json_key --password-stdin https://$HOST_NAME
  script:
    - docker pull $CI_IMAGE  
    - docker tag $CI_IMAGE $DEPLOY_IMAGE
    - docker push $DEPLOY_IMAGE

stg-deploy:
  stage: stg-deploy
  only:
    - master
  script:
    - echo "Staging deploy job"

prod-deploy:
  stage: prod-deploy
  only:
    - master
  script:
    - echo "Production deploy job"
  when: manual
  1. 點擊終端機輸入指令,建立 Commit 並 Push 到 GitLab 上
cd ~/project
git add .
git commit -m "add publish stage"
git push origin master
  1. 輸入 GitLab 帳號密碼後按Enter
Username for 'https://gitlab.com': 
Password for 'https://user@gitlab.com':
  1. GitLab 網站,找到 web app 的 Repo 後,點擊 CI/CD -> Pipelines

會看到新的 CI/CD Pipeline ,等待一段時間直到運行成功。

https://ithelp.ithome.com.tw/upload/images/20210918/20139235ResthHrPeo.png

  1. 回到 GCP 網站,點擊搜尋欄->輸入Container Registry,找到Container Registry

  1. 點擊node-project

裡面出現 CI/CD Pipeline 建置的 Image ,代表 Publish Stage 執行成功。

https://ithelp.ithome.com.tw/upload/images/20210918/201392350ZPl5OFBo0.png

總結

今天學會如何將 Image 推送到 Google Container Registry ,若是要 Push 到 Docker Hub,方法也是差不多,只要建立 Docker Hub 的 Access Tokens,並將其放入到環境變數,就可以用同樣步驟上傳 Image。


上一篇
Day18 - GitLab CI 自動建置 Docker Image
下一篇
Day20 - GitLab CI 更新 Manifest Image Tag
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言