Day19 - GitLab CI 上传 Image 到 Google Container Registry

如何建立 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://[email protected]':
  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。


<<:  [Pizza吃到饱-3] 牛室炙烧牛排 BEEFHOUSE - 台中大里店 #珍珠奶茶口味的披萨才是卖点~

>>:  Day 7 - 数学是不是会击垮一个人的信心? 会

Day 24「小步快跑」Service 与单元测试(上)

笔者前阵子蛮喜欢路跑的,但跑了很久,成绩却一直没有明显进步,为此感到因扰。後来有一天,一位朋友跟我说...

系统分析师的养成之路—案例分享(2)

看完第一个案例不知道大家有什麽收获?欢迎给我一些回馈哦!接着,跟大家分享第二个案例罗! 欢迎有兴趣的...

[Day24] Scrum 的交付与迭代迷思

「Scrum 说每个 Sprint 结束,都应该有可以使用的新功能释出,如果一个 Story 在一个...

Day 1:过时的 Android 口罩地图 APP 应用程序 ?!

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...

Day_26 vsftpd

今天介绍另外一个古老的文件技术FTP(File Transfer Protocol)。建立一个档案s...