如何在Gitlab运行程序上执行基本容器

时间:2019-11-15 12:23:28

标签: docker gitlab containers gitlab-ci-runner

我正在使用容器化环境的CI / CD管道上工作。

  • 在我的笔记本电脑上,所有东西都在包含我所有工具的centos容器中运行,而代码和配置则位于共享卷上。
  • 当我提交时,该共享卷中的大多数都被提升为主卷。
    • 但是,例如,我从虚拟环境中排除了任何python二进制文件。
  • 该容器用作Gitlab中的“基本”容器,以执行我的某些跑步程序阶段,以便
    • 对代码和ansible config都执行静态皮棉测试
    • 使用ansible-bender将最终产品构建为新图像

为了区分环境,我在entrypoint.sh中使用了一个基本的外壳程序,该外壳程序在容器出现时执行,在该外壳程序中,我使用了一个由Gitlab管理的环境变量:{{1} }。但是,当我在本地运行容器而不是在运行器上运行时,shell脚本的执行效果似乎不同。疯了是因为不是容器的全部要点?

  • 不清楚Gitlab在什么时候将跑步者主机与容器之间的份额挂载
  • 条件测试值CI_JOB_STAGE似乎不起作用,即使使用和CI_JOB_STAGE打印出值时也会显示这些值
  • 出于某种原因,入口点在阶段执行之前之前和之前执行

我要附上

的要点
  • entrypoint.sh脚本
  • 容器在本地运行时的输出
    • 在这种情况下,通过检查是否存在激活二进制文件,它可以看到虚拟环境已经存在,因此只需激活环境即可。
    • 然后检查烧瓶二进制文件以查看是否需要安装要求
    • 我知道这很原始,但这只是POC
  • 跑步者第一阶段的输出
    • 基于shell脚本,它不应该安装需求,因为无论如何这是阶段命令的一部分
    • 我不认为它确实这样做了,因为它执行得太快了,但是消息表明它已经通过了条件
    • echo
      • 如果该阶段是本地阶段(错误:我们清楚地看到该阶段是if [[ $CI_JOB_STAGE -eq "locally" ]] && ! test -f "./env/bin/flask"
      • AND
      • 烧瓶不存在(嗯,不会,但是没关系,因为前半部分已经是假的)

这些阶段仍然可以正常运行,但是我发现所有这些都很令人困惑。是否有人对这些跑步者的执行情况有详细的了解?

要点

1 个答案:

答案 0 :(得分:0)

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

general workflow是:

  1. 准备:创建并启动服务。
  2. 作业前:克隆,还原缓存并下载先前阶段的工件。这是在特殊的Docker映像上运行的。
  3. 工作:用户构建。这是在用户提供的Docker映像上运行的。
  4. 职位:创建缓存,将工件上传到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。