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

时间:2021-01-21 16:07:58

标签: docker gitlab gitlab-ci gitlab-ci-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 容器。

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

感谢您的提示!

1 个答案:

答案 0 :(得分:0)

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

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