Tagging Docker in Action

tech, engineering practice, tips, cdci

今天, 我们就根据这篇tagging docker 的理念来搭建一个简单的pipeline. 让团队每天都在重复, 每天都在干的事情自动化.

这个pipeline 包括了

  1. build
  2. test
  3. deploy

build 和deploy 的唯一区别就是tag 不一样. 举一反三后, 大家都能找到自己团队最适合的流程.

准备 #

准备几样东西:

  1. 一个 gitlab/github 及其一段可编译运行的代码👇🏻️
git@github.com:docker/getting-started.git

Image

  1. 一个 docker repository 👇🏻️

Image

开始! #

第一步 进入gitlab cdci editor 在 CI/CD > Editor, 创建一个新的cdci yaml 文件. #
第二步 选择一个分支, 或许对于我们的团队来说, 只有分支main/master 的代码需要打包发布, 而其它分支的代码我们只需要checkstyle 或者sonar scan. #

Image

第三步 定义每一步的工作内容吧 #
image: docker:19.03.12

variables:
  CI_REGISTRY: docker.io
  CI_REGISTRY_IMAGE: index.docker.io/lewei/repo
  CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG.$CI_COMMIT_SHORT_SHA
  CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest

services:
  - docker:19.03.12-dind

before_script:
  - docker info
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - echo "start build"
    - docker build -t $CONTAINER_TEST_IMAGE .
    - docker push $CONTAINER_TEST_IMAGE
    - echo "build done"

test:
  stage: test
  script:
    - echo "start test"
    - docker pull $CONTAINER_TEST_IMAGE
    # - docker run $CONTAINER_TEST_IMAGE /script/to/run/tests
    - echo "test done"

deploy:
  stage: deploy
  only:
    - main
    - master
  script:
    - echo "start deploy"
    - docker pull $CONTAINER_TEST_IMAGE
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
    - docker push $CONTAINER_RELEASE_IMAGE
    # - ./deploy.sh
    - echo "deploy done"

大致意思就是, 这个pipeline 分了三步,

具体配置细节下次我们再聊.

先本地执行一下👇🏻️

Image

提交之后的一个执行效果👇🏻️

Image

然后我们发现, docker repo 被更新了 👇🏻️

Image

修改配置一下变量, 把你的帐号密码藏起来, 把你的docker repo 地址配置一下, 我用的是官方的repo 就如下配置啦.

CI_REGISTRY_USER: jakob
CI_REGISTRY_PASSWORD: password

几个要注意的地方

Image

最后 #

对于所有的one time work, 我希望团队都是不遗余力的干, 鬼知道你提高了多少效率, 鬼知道别人赶着做的项目, 对你来说是那么的轻松, 还可以腾出时间写点博客啥的~

源码在这 gitlab/leweii/tagging-docker-demo