在推送到容器的注册表之前如何对构建的映像运行测试?

Lea*_*oob 7 python gitlab gitlab-ci kaniko

从 gitlab 文档中可以看出如何使用 kaniko 创建 docker 镜像:

build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
  only:
    - tags
Run Code Online (Sandbox Code Playgroud)

但我想先运行测试(pytest),然后再将其推送到容器注册表。任何帮助是极大的赞赏。谢谢!

Mic*_*ihs 1

我假设您想在正在为其构建映像的 Docker 容器内运行测试。

到目前为止我想出的最好的解决方案是

  1. 将测试添加为多阶段中的另一个阶段Dockerfile
  2. 在您的test-image工作中,运行 Kaniko 而无需在最后推送映像(这将在映像构建期间运行您的测试)
  3. 在作业中build-image,运行 Kaniko 并推送图像,并使用--target指令指定要推送的图像的阶段/层

这是一个例子:

.gitlab-ci.yml

build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  before_script:
    - mkdir -p /kaniko/.docker
    - >-
     echo "{\"auths...}" > /kaniko/.docker/config.json
  script:
    - >-
      /kaniko/executor
      --context $KANIKO_BUILD_CONTEXT
      --dockerfile $DOCKERFILE_PATH
      --destination $IMAGE_TAG
      --target image
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM ubuntu as image

RUN apt update -y && \
    apt upgrade -y
    
RUN apt install -y git



FROM devimage as test

# smoke test to see whether git was installed as expected
RUN git --version

# you can add further tests here...
Run Code Online (Sandbox Code Playgroud)

这将在 Docker 构建的第二阶段运行测试。您还可以在此处安装测试框架和其他仅供测试的资源,这些资源不应放入推送到容器注册表的映像中。

如果测试失败,Kaniko 不会推送图像。