透過Gitlab CI將私有docker image後發布至Gitlab Registry

2022/04/26

建立deploy token

首先要建立一個deploy token

提供後續給gitlab-ci的job

在執行docker push的gitlab registry權限

 

前往group或專案設定的Settings > Repository Settings頁面

並使用Deploy Token區塊設定

1.png

 

這邊必須選取read_registrywrite_registry權限

並且要設定username並做好保留

設定好建立後必須自行保留deploy token(之後無法再次取得)

 

透過CI/CD variables設定dpeloy token

由於deploy token算是敏感資料

不應該直接寫進.gitlab-ci.yml

因此在執行打包之前

必須前往設定group或專案的Settings > CI/CD頁面(設定group的話每個底下的project就都可以使用,僅須設定一次)

設定Variables區塊

 

這邊定義一個GITLAB_REGISTRY_PASSWORD變數

Protect variable就依照實際需求看需不需要選取(在protected branch或tag才會生效)

3.png

 

 

設定gitlab-ci.yml

image: docker

services:
  - docker:dind # docker in docker

variables:
  CI_IMAGE: $CI_REGISTRY_IMAGE:latest # 設定docker image name 
  GITLAB_REGISTRY_USERNAME: ciao-docker-test # 前面設定deploy token的username

build:
  stage: build
  # 這邊設定僅在git commit message或git tag還有"build-image"字串的時候執行docker build的job
  only:
    variables:
      - $CI_COMMIT_MESSAGE =~ /build-image/
      - $CI_COMMIT_TAG =~ /build-image/
  # 進行docker login取得授權($GITLAB_REGISTRY_PASSWORD來自外部專案設定)
  before_script:
    - docker login $CI_REGISTRY -u $GITLAB_REGISTRY_USERNAME -p $GITLAB_REGISTRY_PASSWORD
  script:
    - docker build -t $CI_IMAGE .
    - docker push $CI_IMAGE

 

開始透過Gitlab CI執行docker build

建立一個含有build-image字串的tag並push到gitlab上

git tag build-image/2022/04/28/001
git push origin build-image/2022/04/28/001

 

接著進入CI/CD的Jobs頁面查看執行的job

就會看到依照gitlab-ci.yml依序執行docker login、docker build、docker push等動作

4.png

 

前往Gitlab Registry確認image

5.png

前往gitlab的Container Registry

看到剛才建立的image

即代表成功!

 

其他補充

 

一個專案內的Container Registry儲存多個image

以上面實做為例

可將$CI_REGISTRY_IMAGE:latest

改為$CI_REGISTRY_IMAGE/image1:latest$CI_REGISTRY_IMAGE/image2:latest

將一次儲存多個image