我想使用自托管的 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 容器。
有没有办法让两个阶段使用同一个容器,比如说,第一个(构建)阶段通过标签选择镜像并启动容器并将其传递到第二个(部署)阶段?
感谢您的提示!
答案 0 :(得分:0)
目前,无法在同一个容器中运行两个作业。 gitlab-runner 将为管道中的每个作业启动一个新的容器,并在作业完成后销毁它。但是,您可以在单个运行器上运行它们,因此可以重复使用下载的 Docker 映像。但是,以这种方式工作有一些好处,包括单个阶段中的并行作业,每个作业都有自己的工作空间,并且每个作业都有一个干净的起点(没有遗留的可能导致意外副作用的工件)。
在作业和阶段之间传递 gitlab Artifacts 效果很好,即使它启动了一个新容器。