GitLab: CI/CD
如何使用 GitLab CI/CD
👋 欢迎来到 Stackhero 文档!
Stackhero 提供即开即用的 GitLab cloud 解决方案,专为需要快速、安全且可扩展环境的团队设计:
- 无限用户、仓库、数据传输和 CI/CD 处理时间,灵活性完全不受限制。
- 一键轻松升级,让您的环境始终保持最新,无需停机。
- 自定义域名,通过HTTPS加密(例如 https://git.your-company.com),提升企业形象与安全性。
- 在您专属的私有、独立基础设施上,始终如一的性能与强大的安全性。无其他租户干扰,完全隔离。
- 可选择托管地点:🇪🇺 欧洲或🇺🇸 USA,满足您的合规或延迟需求。
快速上手,专注于您的代码。Stackhero 的 GitLab cloud hosting 解决方案大约5分钟即可投入使用。
介绍
GitLab CI/CD 是 GitLab 的一项强大且集成的功能,GitLab 是一个广受欢迎的开源版本控制与协作平台。通过该工具,您可以简化并自动化软件构建、测试和部署等关键阶段,从而更快速、更可靠地交付高质量应用。
例如,借助 GitLab CI/CD,您可以设置自动化单元测试,每当有新的 commit 推送到 GitLab 仓库时自动触发。测试通过后,您的代码会被构建并部署到预发布(staging)环境以便进一步评估。所有预发布测试通过后,系统会将代码提升到生产环境,最终交付给终端用户。
GitLab CI/CD 的一大亮点是其与 GitLab 的深度集成。您可以直接在项目仓库中定义和管理 CI/CD pipeline,极大简化了整个工作流的编排与追踪。
GitLab CI/CD 支持多种编程语言、框架和工具,具备高度的灵活性,能够适配各种类型的项目。其可自定义的 pipeline 系统允许您根据实际需求调整 CI/CD 流程的每个阶段,无论是构建、测试还是多环境部署。
总之,GitLab CI/CD 是一套全面的解决方案,旨在自动化并提升软件交付流程。它让开发者能够专注于代码编写与优化,而平台则高效地处理各类运维任务。
如何在 GitLab CI 中构建 Docker 镜像
如果您的项目仓库包含 Dockerfile 文件,您可以自动化 Docker 镜像的构建、运行,以及(如有需要)发布到镜像仓库的流程。
步骤 1:启用 Docker in Docker (DinD) 支持
首先,请在 Stackhero 控制台中启用 "Docker in Docker"(DinD)支持。

启用 DinD 支持会带来安全风险,尤其是在您希望隔离用户并防止他们访问彼此项目的场景下。
步骤 2:配置 GitLab CI pipeline
接下来,更新您的 gitlab-ci.yml 文件,添加使用 DinD 构建 Dockerfile 的 pipeline 配置。以下为示例配置:
image: docker:29
build:
stage: build
services:
- name: docker:29-dind
alias: docker
variables:
# 指定 docker CLI 连接到 Docker-in-Docker 服务,使用其明文(非 TLS)端口。
# 详见下方关于 DOCKER_HOST 重要性的说明。
DOCKER_HOST: "tcp://docker:2375"
DOCKER_TLS_CERTDIR: ""
before_script:
- docker info
script:
# 请将 "my-docker-image" 替换为您期望的镜像名称:
- docker build -t my-docker-image .
# 如有需要,可测试该 Docker 镜像:
# - docker run my-docker-image /script/to/run/tests
docker:29-dind 服务会在您的作业旁边启动一个 Docker 守护进程,而 DOCKER_HOST 则指定 docker CLI 使用该守护进程。声明 docker:dind 服务时务必设置 DOCKER_HOST: 如果省略该变量,CLI 会静默连接到其他守护进程,即使服务配置有误,构建也可能成功,从而掩盖真实问题。DOCKER_TLS_CERTDIR: "" 表示使用内部作业网络上的明文 2375 端口。
作为更简单的替代方案,您可以完全移除 services 块和上述两个变量:Stackhero 的 runner 已通过挂载的 socket 暴露了可用的 Docker 守护进程,因此直接执行 docker build 即可。
如需更多关于在 GitLab CI 中构建 Docker 镜像的指导,请参考 GitLab 官方文档。
使用 Testcontainers 运行测试
如果您的测试套件使用了 Testcontainers,即在测试运行期间以临时 Docker 容器方式启动真实服务(如数据库、消息中间件等)的库,上述配置已完全适用。请保留 docker:29-dind 服务和相关变量:Testcontainers 依赖 DOCKER_HOST 访问 Docker 守护进程并连接其启动的容器,无需额外配置。
在 CI 环境中,未设置 DOCKER_HOST 是导致 Testcontainers 失败的最常见原因。此时库会回退到 runner 挂载的 Docker socket,无法访问自身启动的测试容器,通常表现为 Ryuk 辅助容器超时。