在同一个 dockerized runner 上构建和部署

Build and deploy on the same dockerized runner

我想使用自托管的 GitLab 实例和 CI 运行器构建和部署静态网站(中间人),所有 运行 在本地 Docker 引擎上。如果我在一项工作中同时进行构建和部署,它会工作得很好,但是,我想知道是否可以像官方示例所建议的那样将它分成两个工作:

cache:
  paths:
    - _vendor

build:
  stage: build
  tags:
    - ruby-3.0
  only:
    - master
  script:
    - apk update
    - apk add build-base nodejs git
    - command -v bundler || { gem install bundler; }
    - bundle config set --local path '_vendor/'
    - bundle install
    - MM_ENV=production bundle exec middleman build

deploy:
  stage: deploy
  tags:
    - ruby-3.0
  only:
    - master
  variables:
    PROJECT_HANDLE: "$CI_PROJECT_NAMESPACE-$CI_PROJECT_NAME"
  script:
    - mkdir -p /deployment/$PROJECT_HANDLE
    - cd /deployment/$PROJECT_HANDLE
    - mkdir -p current
    - rm -rf next
    - mkdir next
    - cp -pr $CI_PROJECT_DIR/build/* next
    - rm -rf previous
    - mv current previous
    - mv next current

这个问题,你必须将构建结果作为工件传递给部署,每个作业都会启动它自己的 Docker 容器。

有没有办法让两个阶段使用同一个容器,比如说,第一个(构建)阶段通过标签选择图像并启动容器并将其传递给第二个(部署)阶段?

感谢您的提示!

目前,无法在同一个容器中 运行 两个作业。 gitlab-运行ner 将为管道中的每个作业启动一个新的容器,并在作业完成后销毁它。但是,您可以 运行 它们放在一个 运行 上,因此可以重复使用下载的 Docker 图像。然而,以这种方式工作有一些好处,包括单个阶段中的并行作业,每个作业都有自己的工作区,并且每个作业都有一个干净的起点(没有留下可能导致意外副作用的工件)。

在作业和阶段之间传递 gitlab 工件效果很好,即使它会启动一个新容器。