【问题标题】:Save and re-use entire state of previous job in subsequent job in gitlab runner (cache everything for subsequent job)在 gitlab runner 中的后续作业中保存并重新使用先前作业的整个状态(为后续作业缓存所有内容)
【发布时间】:2021-10-21 18:35:45
【问题描述】:

我对 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

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

欢迎任何提示,提前谢谢!

【问题讨论】:

  • 您能否进一步解释一下您对“环境”和“状态”的理解?你指的是例如有状态的 Web 应用程序?如果您在 prepare 阶段所做的只是安装一些软件包,那么我不明白您为什么不将其烘焙到自定义 Docker 映像中。
  • 感谢您的评论。我已经详细说明了我关于国家的问题。正如我所说,我正在寻找一种解决方案,而无需为此创建单个 docker 映像,即使您是对的,这将是一个很好的解决方案。但我试图在没有额外图像的情况下做到这一点。
  • 如果我理解正确的话,“状态”是指prepare-env作业的Docker容器的状态?
  • 是的,我会进一步说明我的问题;-)
  • 恕我直言,这里的挑战是管道中的作业可以在不同的运行器上执行,从而难以重用前一阶段的容器。我看到的唯一可能性是从prepare 阶段(例如到 GitLab 的容器注册表)推送图像,然后可以由后续阶段拉取。

标签: gitlab gitlab-ci gitlab-ci-runner


【解决方案1】:

我实际上通过仅在特定文件(此处为 Dockerfilesetup.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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多