首页 > 解决方案 > 在 gitlab runner 中的后续作业中保存并重新使用先前作业的整个状态(为后续作业缓存所有内容)

问题描述

我对 gitlab 比较陌生,并且已经知道如何创建和运行运行良好的 CI/CD 管道。尽管如此,它运行速度相对较慢,因为我目前使用before_script.

所以我想要的是一次安装一堆包,然后在不同的工作中重新使用它们。我知道通常会为此创建一个 docker 映像并重新使用它来运行 CI。但在这里,我对在后续工作中重用不同工作状态的可能性感兴趣。

这是一个解释我的问题以及我想要实现的目标的最小示例:

stages:
  - prepare
  - stage1
  - stage2

image: python

variables:
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"

cache:
  paths:
    - .cache/pip

.prepare_step1:
  before_script:
    - pip install requests

prepare-env:
  image: python:3.7
  stage: prepare
  tags:
    - docker
  extends:
    - .prepare_step1
  script:
    - pip list

run-first-job:
  stage: stage1
  tags:
    - docker
  script:
    # I want to re-use the complete last state of the "prepare-env" stage here
    # i. e. use the installed requests package
    - pip list

run-second-job:
  stage: stage2
  tags:
    - docker
  script:
    # I want to re-use the complete last state of the "prepare-env" stage here
    # i. e. use the installed requests package
    - pip list

我知道工件缓存,但我不确定这些是否是为了将作业的 Docker 容器的整个状态转移prepare-env到后续作业中run-first-jobrun-second-job即只安装一次包,然后在其他作业中使用它们。

欢迎任何提示,在此先感谢!

标签: gitlabgitlab-cigitlab-ci-runner

解决方案


Dockerfile实际上,仅当特定文件(此处和setup.cfg)发生更改时,我才通过构建 docker 映像找到了解决方案:

stages:
  - prepare
  - run

image: python

variables:
  GIT_SUBMODULE_STRATEGY: recursive
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"

cache:
  paths:
    - .cache/pip

.build_docker_image_ci:
  before_script:
    - IMAGE_NAME=$CI_REGISTRY_IMAGE:"my-ci-image"
    - echo $IMAGE_NAME
    - git submodule update --recursive --remote
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN $CI_REGISTRY
    - DOCKER_BUILDKIT=1 docker build
      --build-arg PYTHON_REGISTRY_CONSTRING="$PYTHON_REGISTRY_CONSTRING"
      --pull -t $IMAGE_NAME .
    - docker push $IMAGE_NAME

build-docker-image-ci:
  image: python:3.7
  tags:
    - dockerbuilder
  stage: prepare
  extends:
    - .build_docker_image_ci
  rules:
    - changes:
        - Dockerfile
        - setup.cfg

run-job:
  stage: run
  image: $CI_REGISTRY_IMAGE:my-ci-image
  tags:
    - docker
  script:
    - pip list

感谢您的帮助,亚当马歇尔和斯劳斯!


推荐阅读