Day 21:GitLab Container Registry

之前在第 15 天的时候,我有提过希望可以把 build image 的步骤移到 CI pipeline 里面,虽然本来想简单比较一下各大 container registry 的,不过稍微翻了一下发现,直接使用 GitHub 或是 GitLab 提供的 container registry,那麽今天我就简单来记录一下如何设定 pipeline 吧。

因为目前 NOJ 是搬到自架的 GitLab 上面,所以这篇就来讲讲如何写出一个可以 build image 的 CI job 吧。只要把下面这段贴到 .gitlab-ci.yml 就完成了~

build:
  only:
    variables:
      - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  image: docker:19.03.12
  stage: build
  services:
    - docker:19.03.12-dind
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:latest
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG -f Dockerfile.prod .
    - docker push $IMAGE_TAG

没啦,当然是开玩笑的,虽然上面这段设定在官方文件就能找到,但我还是简单讲解一下这段逻辑吧。

首先看到 script 区段:

docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
docker build -t $IMAGE_TAG -f Dockerfile.prod .
docker push $IMAGE_TAG

首先第一行的 docker login 就是要登入 registry,因为使用 GitLab CI 的关系,其实它都已经帮我们准备好相关的变数了(CI_REGISTRY 开头的那些),所以就可以简单的登入了。

接下来要 build,这边跟官方文件唯一不同的地方是特别指定了使用 Dockerfile.prod 这个 production 用的 Dockerfile,因为预设的需要挂 volume 才能使用。

最後就是要用 docker push 把 image 推到 registry,这边的 IMAGE_TAG 是在上面定义的,内容是 $CI_REGISTRY_IMAGE:latestCI_REGISTRY_IMAGE 也是 GitLab 预先提供的变数,长得会像是 registry.gitlab.com/<owner>/<project> 这样的字串。

除了用 script 定义要执行的命令,我们还需要注意这里要使用 docker image,这样才能正常的执行 docker cli 的命令,另外还需要设定一个 docker:*-dind 的容器作为 docker daemon,关於其他实现 DinD (Docker in Docker) 的方式,可以参考官方文件的说明还有这篇讨论

最後是那个 only,因为我只需要它在 main branch 上面执行 build 就好,所以还需要定义条件,因为有用到 GitLab 的变数,所以要使用 only:variables,而不是直接写在 only 底下。


<<:  Day 20 Ruby 封装 vs 继承

>>:  关键路径法 Critical Path Method

Day30-结语

前言 今天就是铁人赛的最後一篇文章了,不免俗的要来写个总结来混一下篇幅XD,也希望这次的铁人赛可以让...

Day 29. F2E-完善过渡动画

昨天後来在看效果时,有发现过渡动画的元素已经完全超出卡片组件的范围了,这个不是我们想要的效果 理想...

Flutter体验 Day 13-弹性布局

弹性布局 介绍完线性排列的布局方式,今天我们谈谈另外的配置方式的布局组件。 挑战目标 学习 widg...

为什麽端到端加密应成为企业的重要事项?

近年来,端到端加密已变得非常流行,尤其是在消费者消息传递应用程序市场中。Signal、Telegra...

用React刻自己的投资Dashboard Day10 - 用useCallback hook帮你记住函式

tags: 2021铁人赛 React 在Day9说明了useEffect的用法,不过其实当Card...