网站首页 > 博客文章 正文
一、前提准备
- GitLab Runner 安装与配置
- 使用 Docker executor,并开启特权模式(privileged = true),以支持 Docker-in-Docker(DinD)或挂载宿主机 Docker socket。
- Runner 配置示例(/etc/gitlab-runner/config.toml):
[[runners]]
name = "docker-runner"
url = "https://gitlab.example.com/"
token = "YOUR_RUNNER_TOKEN"
executor = "docker"
[runners.docker]
image = "docker:20.10.16"
privileged = true # 必须
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
- 在 GitLab 项目中配置 CI/CD 变量
- HARBOR_REGISTRY:你的 Harbor 域名,例如 harbor.example.com
- HARBOR_PROJECT:Harbor 中的项目名,如 my-app
- HARBOR_USERNAME / HARBOR_PASSWORD:用于登录 Harbor 的账号凭证
- (可选)IMAGE_NAME、IMAGE_TAG:自定义镜像名称和标签
二、.gitlab-ci.yml 示例
stages:
- build
- push
variables:
DOCKER_DRIVER: overlay2
# 镜像全路径
IMAGE: "$HARBOR_REGISTRY/$HARBOR_PROJECT/$CI_PROJECT_NAME"
before_script:
# 登录 Harbor
- echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USERNAME" --password-stdin "$HARBOR_REGISTRY"
build-image:
stage: build
image: docker:20.10.16
services:
- docker:20.10.16-dind
script:
# 构建镜像并打上 commit SHA 作为 tag
- docker build -t "$IMAGE:$CI_COMMIT_SHORT_SHA" .
# 另打一个 latest tag
- docker tag "$IMAGE:$CI_COMMIT_SHORT_SHA" "$IMAGE:latest"
artifacts:
expire_in: 1h
reports:
dotenv: .env # 如果需要传递变量到后续阶段
push-image:
stage: push
image: docker:20.10.16
services:
- docker:20.10.16-dind
script:
# 将两种 tag 的镜像推送到 Harbor
- docker push "$IMAGE:$CI_COMMIT_SHORT_SHA"
- docker push "$IMAGE:latest"
要点说明:
- DinD 服务:通过 services: - docker:dind 启动 Docker-in-Docker 容器,Runner 以特权模式连接它执行构建与推送。
- 登录凭证:在 before_script 中使用 CI 变量安全登录 Harbor。
- 多标签管理:同时推送基于 commit SHA 的不可变 tag 和 latest。
- 缓存与加速:可根据需要挂载 /cache 卷或配置 registry mirror,加快依赖下载。
三、流水线执行流程
- 触发:每次 git push 或合并请求(MR)时,GitLab 自动触发 CI。
- Build 阶段:
- 启动 DinD 服务
- docker build 构建镜像
- 为镜像打上 SHA 和 latest 标签
- Push 阶段:
- 已登录的 Runner 将镜像推送到 Harbor
- 完成后,你可以在 Harbor UI 中看到新镜像
四、常见问题与优化
- 登录失败:确认 CI 变量无误,Harbor 支持的认证方式(如 LDAP、OIDC)是否与凭证匹配。
- 构建超时:在项目设置中适当增加 pipeline 超时时间,或拆分镜像层次以复用缓存。
- 安全加固:尽量使用专用的 CI 账号和最小权限,避免在脚本中硬编码密码。
- 多架构镜像:可引入 Docker Buildx,通过 docker buildx 构建多平台镜像并推送。
猜你喜欢
- 2025-05-11 idea整合dockerfile插件,打包镜像(docker环境可不安装)
- 2025-05-11 超详细!基于k8s+docker+jenkins的一站式 DevOps 环境搭建教程-下
- 2025-05-11 Kubernetes(K8s)+ GitLab + Jenkins 实现CI/CD
- 2025-05-11 docker的镜像和仓库(docker镜像仓库地址)
- 2025-05-11 轻量容器如何改变开发世界?Docker 基本概念与架构详解
- 2025-05-11 微服务时代,运维必须了解的那些事(服务架构演变)
- 2025-05-11 目前还能用的Docker容器加速方案和可用镜像源
- 2025-05-11 替代虚拟机的容器Docker安装教程——(Windows版)
- 2025-05-11 k8s系列-06-containerd的基本操作
- 2025-05-11 K8s+Jenkins+Harbor+Gitlab+Pipeline+Rust 持续集成(三)
你 发表评论:
欢迎- 366℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 353℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 344℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)