【发布时间】:2020-04-18 19:22:31
【问题描述】:
我希望了解如何正确构建我的 .gitlab-ci.yml 和 Dockerfile,以便我可以将 C++ 应用程序构建到 Docker 容器中。
我正在为 C++ 应用程序的实际编译和链接应该在 CI 工作流程中的哪个位置进行而苦恼。
我做了什么:
- 我目前的方法是在 Docker 中使用带有私有 gitlab docker 注册表的 Docker。
- 我的 gitlab-ci.yml 使用我基于 docker:19.03.1-dind 映像创建的 dind docker 映像服务,但包含我的证书以安全地与我的私人 gitlab docker 注册表通信。
- 我还有一个基于 docker:19.03.1 的 gitlab-ci.yml 引用的自定义基础镜像,其中包括我构建所需的内容,例如 cmake、build-base mariadb-dev 等。
- 将我的构建脚本添加到 gitlab-ci.yml 以构建应用程序 cmake ... && cmake --build 。 然后,dockerfile 会复制在我的构建步骤中生成的最终二进制文件。
完成所有这些后,我觉得不太对劲,我想知道我是否错过了意图。我试图在网上找到一个 C++ 示例作为示例,但没有成功。
我没有完全理解的是每个参与者在 docker-in-docker 设置中的角色:docker 镜像、dind 镜像,最后是我正在生产的容器……
我想知道的……
- 谁应该执行构建并包含构建环境、我的 .gitlab-ci.yml 或我的 Dockerfile 中指定的基础镜像?
- 如果我使用 dockerfile 构建,如何将源代码的内容放入 docker 容器中?我要复制 /builds 目录吗?我应该安装它吗?
- 在哪里划分谁执行工作,gitlab-ci.yml 或 Docker 文件?
- 参考使用 Docker-in-Docker Gitlab CI 构建的 C++ docker 应用程序的工作示例。
.gitlab-ci.yml
image: $CI_REGISTRY/building-blocks/dev-mysql-cpp:latest
#image: docker:19.03.1
services:
- name: $CI_REGISTRY/building-blocks/my-dind:latest
alias: docker
stages:
- build
- release
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_TLS_CERTDIR: "/certs"
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
stage: build
script:
- mkdir build
【问题讨论】:
标签: c++ docker gitlab gitlab-ci-runner docker-in-docker