基础容器在Gitlab runner上是如何执行的

How is base container executed on Gitlab runner

我正在研究使用容器化环境的 CI/CD 管道。

为了区分环境,我在entrypoint.sh中使用了一个基本的shell,它在容器启动时执行,在那个shell中,我使用了一个环境变量由 Gitlab 管理:CI_JOB_STAGE。但是当我 运行 本地容器而不是 运行 容器时,shell 脚本的执行方式似乎不同。这太疯狂了,因为容器的全部意义不是吗?

我正在为

附上要点

阶段仍然 运行 正确,但我发现这一切都很混乱。有没有人详细了解这些 运行 人的执行方式?

要点

Gitlab 支持 number of executors 每个行为可能略有不同(执行程序可能会挂载自定义卷,禁止特权容器)

general workflow是:

  1. 准备:创建并启动服务。
  2. 作业前:克隆、恢复缓存并下载前一阶段的工件。这是一张特殊的 Docker 图片上的 运行。
  3. 工作:用户构建。这是用户提供的 Docker 图片上的 运行。
  4. Post-job:创建缓存,上传工件到GitLab。这是一张特殊的 Docker 图片上的 运行。

我不鼓励在 entrypoint.sh 中编写脚本。尝试将其重写为 .gitlab-ci.yml:

stages:
  - install
  - build
  - test

job 0:
  stage: .pre
  script: install some prerequisites 

job 1:
  stage: install
  script:
    - python3 -m venv env
    - source ./env/bin/activate
    - pip install -r ./dev/requirements.txt

job 2:
  stage: build
  script: make build

job 3:
  stage: test
  script: make test

它将使构建可重现且更易于阅读。您可能会使用 .pre and .post stage,只要确保您使用的 Gitlab >= 12.4.