从 gitlab runner 上的 docker 容器访问存储库时出现问题

Problem with repository access from a docker container on a gitlab runner

tl;dr

使用具有 docker 支持的 gitlab runner 以及来自存储库的完成容器和源代码的预期方式和理念是什么?如何将源代码存储库挂载到容器中?


我们目前正在将我们的 gitlab runner(本地)转换为 gitlab runner,并提供 docker 支持。它们的工作原理不同,我仍然无法理解如何将它们用于我们的目的。 尽管问题有点宽泛,但我尽量将其限制在更具体的用例中。

假设我们想要在编程项目(例如 Java 或 C++)中进行代码分析,这应该在推送到开发分支后定期进行。

第 1 阶段:构建容器 为此,我创建了一个 docker 文件和 assemble 所有必需的应用程序和库。我将这个容器推送到我们的注册表中,以便可以一次又一次地使用它。只有我修改了docker文件,才应该重建它。

第 2 阶段:验证源代码 这一步要拉取Docker容器,分析源码。我的问题来了:容器如何从存储库中获取源代码?

我已经尝试通过 -v 使用 docker 调用来包含源代码文件夹,但它似乎不起作用。我收到 -v 不是可执行程序的错误消息。所以我猜想这种可能性不是故意的。

另一种可能是在构建容器时集成源代码,但我认为这没有用。另一种可能性是包括通过 config.toml 的路径,类似于 -v,但即使这样对我来说似乎也不是正确的解决方案。我只能通过 ssh.

访问配置文件

另一种解决方案是通过 git 查看 运行 容器中的源代码...也不太好。

长话短说:使用存储库中完成的容器和源代码的预期方式和理念是什么?


我们将 gitlab runner 与 shell executor 一起使用。

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_BUILDKIT: 1
  CI_REGISTRY: ***
  CI_REGISTRY_IMAGE: ***/test
  CI_REGISTRY_USER: ***
  CI_REGISTRY_PASSWORD: ***


stages:
- build
- test

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build_container:
  stage: build
  only:
    changes:
      - Dockerfile
  tags:
    - docker
  before_script:
    - docker pull $CI_REGISTRY_IMAGE:latest 
  script:
    - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE .
  after_script:
    - docker push $CI_REGISTRY_IMAGE:latest

validate:
  stage: test
  script:
    - docker run $CI_REGISTRY_IMAGE /script/to/validate/code

我认为混淆是由于将两个本来应该分开的东西混在一起造成的。

Docker 图像应该在其自己的项目中构建和发布,如果您想重复使用它。有些构建需要一段时间,因此您可以使用已构建的映像来节省时间。

准备好要下拉的图像后,您可以继续使用该图像做任何您想要的事情。

您在 gitlab-ci.yml 文件中调用图像,然后它可以访问管道正在 运行 中的项目的存储库。

在 gitlab-ci.yml 中,您使用 'image' 标签来指定您想要使用的 docker 图像。您可以为单个作业指定图像。

image: python

python job:
  script: python hello-world.py

java job:
  image: golang
  script: go run hello-world.go

好吧,我通过再次阅读 Docker manual 解决了这个问题。 -v 的执行错误在于参数放错了地方。下面的示例显示了正确的使用方法。

解释:

  • --rm - 导致 Docker 在容器退出时自动删除容器
  • -v - 导致 Docker 在容器
  • /mnt 中安装 repository/project $CI_PROJECT_DIR

代码片段:

validate:
  stage: test
  tags:
    - docker
  script:
    - docker run --rm -v $CI_PROJECT_DIR:/mnt $CI_REGISTRY_IMAGE /bin/ash -c "/some/command /mnt/sourcecode/"