QT+GitLab+CI/CD架构与本地搭建全流程指南(windos系统)

一、核心架构总览

GitLab CI/CD 是一个「中心化调度 + 分布式执行」的事件驱动系统,主要组件如下:
  • GitLab Server(Rails 后端):负责事件监听、YAML 解析、流水线调度、状态管理和数据存储。
  • GitLab Runner(Go 客户端):主动轮询任务,隔离环境执行,负责日志与产物回传。
  • PostgreSQL:存储全链路数据(如分区表是核心数据载体)。

二、完整流程与底层代码原理

1. 触发事件:流水线的起点

触发场景:
  • git push 推送代码
  • 创建/更新 Merge Request
  • 打 Tag
  • 定时任务
  • API 手动触发
底层代码逻辑(GitLab Rails 后端):
  • 事件触发后,Ci::CreatePipelineService 被调用,作为流水线创建的入口服务。
  • 主要步骤:
  1. 校验项目是否启用 CI/CD,是否存在 .gitlab-ci.yml
  2. 解析 YAML 配置,生成流水线结构(Stage → Job)
  3. 在数据库中创建流水线、阶段、Job 记录

2. 流水线调度:GitLab 的核心大脑

调度逻辑( ProcessPipelineService 服务):
  • 作为调度中枢,负责状态流转和任务下发。
核心规则:
  • 同一 Stage 内 Job 并行执行,前一 Stage 所有 Job 成功后,才进入下一 Stage
  • 任一 Job 失败,流水线默认终止(可配置 allow_failure 跳过)
  • Job 状态流转:created → pending → running → success/failed
  • 数据库状态实时更新(p_ci_pipelines、p_ci_stages、p_ci_builds 的 status 字段)
  • 记录 Job 的 started_at、finished_at、duration 等执行耗时

3. Runner 轮询:任务领取的核心机制

Runner 底层原理(Go 语言实现):
  • Runner 是独立的 Go 二进制程序,主动长轮询 GitLab API(/api/v4/jobs/request)
轮询逻辑:
  • 每隔几秒向 GitLab 发送请求:「有没有任务给我?」
  • GitLab 根据 Runner 标签、并发限制、项目权限,匹配并下发 Job
  • Runner 领取任务后,进入执行流程
关键特性:
  • Pull 模型:GitLab 不主动连接 Runner,Runner 主动拉取,防火墙友好,天然分布式
  • 每个 Runner 可配置并发数,支持水平扩容,多 Runner 自动负载均衡

4. Runner 执行 Job:真正干活的环节

执行流程(以 Docker Executor 为例):
  1. 环境准备:调用本地 Docker API,拉取 Job 指定镜像,启动全新容器,实现完全隔离
  2. 代码拉取:自动执行 git clone,拉取对应分支/Commit 的代码
  3. 脚本执行:按顺序执行 .gitlab-ci.yml 中 script 定义的命令(如构建、测试、打包、部署)
  4. 日志实时回传:边执行边将 stdout/stderr 分块上传到 ci_build_trace_chunks 表
  5. 产物上传:执行完成后,将 artifacts(如 dist 包、jar 包等)上传到 ci_job_artifacts 表
  6. 状态回传:向 GitLab 返回 Job 执行结果(success/failed),销毁容器
数据库操作:
  • 更新 p_ci_builds 的 status、runner_id、duration、coverage 等字段
  • 向 ci_build_trace_chunks 插入日志分块,向 ci_job_artifacts 插入产物元数据

5. 结果同步与流水线推进

GitLab 后端处理:
  • 接收 Runner 回传的 Job 结果,更新 p_ci_builds 状态
  • 重新触发 ProcessPipelineService,检查当前 Stage 所有 Job 状态
  • 若 Stage 全部成功,将下一 Stage 的 Job 状态从 created → pending,等待 Runner 领取
  • 若所有 Stage 完成,更新 p_ci_pipelines 的最终状态(success/failed),记录总耗时
通知与可视化:
  • 发送邮件/钉钉通知,更新 GitLab 页面流水线状态
  • 页面展示的流水线、Job、日志,全部从 PostgreSQL 分区表读取

流程总结:
代码 push 触发事件 → GitLab 解析 YAML 创建流水线(写入 p_ci_pipelines 等表) → 调度服务下发任务 → Runner 主动轮询领取 → 隔离环境执行脚本 → 回传日志/产物/状态 → GitLab 更新数据库推进流水线 → 最终展示结果

跳过自动化的三种方式:
  1. 提交信息加关键词:如“修复了xxx [skip ci]”,带 [skip ci] 会跳过
  2. 构建脚本判断:仅指定分支构建
  3. 手动触发:需自行点击触发

三、GitLab CI/CD 本地搭建实战

【整体架构】

  • WSL Ubuntu:运行 GitLab 服务端(网页、数据库、CI/CD 调度)
  • Windows 10/11:运行 GitLab Runner(实际执行 CI/CD 任务)
  • 通信方式:Runner 主动连接 WSL 中的 GitLab

第一步:开启 WSL + 安装 Ubuntu

  1. 以管理员身份打开 Windows 终端(PowerShell)
wsl --install
自动安装 WSL2 + Ubuntu,安装完成后重启电脑。
  1. 打开 Ubuntu,设置用户名/密码
第一次打开会提示创建账号,随便输入,记住密码即可。

第二步:在 WSL Ubuntu 安装 GitLab 服务端

  1. 安装依赖
sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl
  1. 添加 GitLab 源
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
  1. 安装 GitLab 社区版(CE)
sudo EXTERNAL_URL="http://localhost" apt install gitlab-ce
等待 2~3 分钟,自动安装完成。
  1. 启动 GitLab(如未自动启动)
sudo gitlab-ctl reconfigure sudo gitlab-ctl start
  1. 查看 GitLab 初始 root 密码
sudo cat /etc/gitlab/initial_root_password
复制密码,用户名为 root。
  1. 浏览器访问 GitLab

第三步:Windows 安装 GitLab Runner(最关键)

  1. 下载 Windows Runner
  • 打开 PowerShell(普通用户即可):
mkdir C:\GitLab-Runner cd C:\GitLab-Runner Invoke-WebRequest -Uri "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe" -OutFile "gitlab-runner.exe"
  1. 注册 Runner 到 WSL 的 GitLab
  • 前往 GitLab 获取注册地址和 token:
    • 打开 http://localhost
    • 进入 Menu → Admin → Runners
    • 点击 Register an instance runner,复制 URL 和 Token
  • 回到 Windows PowerShell 执行注册:
cd C:\GitLab-Runner
.\gitlab-runner.exe register
  • 按提示输入:
    • GitLab instance URL: http://localhost
    • token: 复制的 token
    • 描述:windows-runner
    • 标签:windows
    • 执行器:powershell
  1. 安装服务并启动
.\gitlab-runner.exe install
.\gitlab-runner.exe start
✅ 现在 Windows Runner 已经连上 WSL GitLab,状态信号为绿色。

第四步:测试 CI/CD 是否能跑

  • 在 GitLab 新建项目,
  • 创建文件 .gitlab-ci.yml:
  • test_job:
      tags:
        - windows
      script:
        - echo "我在 Windows 上运行 CI/CD 成功!"
  • 提交后,前往 CI/CD → Pipelines 查看运行结果。

配置 Qt 环境

  1. 添加以下路径到系统 PATH:
C:\Qt\5.15.2\mingw81_64\bin
C:\Qt\Tools\mingw81_64\bin
  1. 测试是否配置成功
  • 打开新的 CMD / PowerShell 输入:
qmake --version
mingw32-make --version
若输出版本号,则配置成功!
  • 重启 GitLab Runner:
cd C:\GitLab-Runner
.\gitlab-runner.exe stop
.\gitlab-runner.exe start

给 Qt 项目写 CI/CD 配置

  • 在项目根目录创建 .gitlab-ci.yml:
stages:
  - build

build_qt:
  stage: build
  tags:
    - windows       # 必须匹配你的 runner 标签
  script:
    - echo "========== 开始编译 Qt 项目 =========="
    - qmake your_project_name.pro   # 替换成你的 pro 文件
    - mingw32-make -j4
    - echo "========== 编译完成 =========="
  artifacts:
    paths:
      - release/*.exe
  • 提交并推送,即可在 Pipelines 查看构建结果!

遇到的问题

1.docker部署失败 不能用 需要物理机开启虚拟化
2. .gitlab-ci.yml 识别失败 需要严格控制格式
3.windows下 用 PowerShell ( 是因为 CMD 根本跑不动现代自动化!PowerShell 是 Windows 上唯一能稳定跑 CI/CD 的 shell! )
shell = "powershell"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一然明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值