腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南
适用场景:个人学习 / 体验 CI/CD 流程
总耗时:约 2~3 小时(含 CVM 创建等待时间)
预算:腾讯云 CVM 按量计费约 0.4~0.5 元/小时
文章目录
- [腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南](#腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南)
-
- [1. 架构概览](#1. 架构概览)
- [2. 第一步:创建腾讯云 CVM 实例](#2. 第一步:创建腾讯云 CVM 实例)
-
- [2.1 登录腾讯云控制台](#2.1 登录腾讯云控制台)
- [2.2 推荐配置](#2.2 推荐配置)
- [2.3 安全组配置](#2.3 安全组配置)
- [3. 第二步:连接 CVM 并安装 Docker](#3. 第二步:连接 CVM 并安装 Docker)
-
- [3.1 SSH 登录](#3.1 SSH 登录)
- [3.2 安装 Docker(官方脚本,最快最稳)](#3.2 安装 Docker(官方脚本,最快最稳))
- [4. 第三步:Docker 部署 Jenkins](#4. 第三步:Docker 部署 Jenkins)
-
- [4.1 创建 Jenkins 数据目录](#4.1 创建 Jenkins 数据目录)
- [4.2 启动 Jenkins 容器](#4.2 启动 Jenkins 容器)
- [4.3 确认 Jenkins 正在运行](#4.3 确认 Jenkins 正在运行)
- [5. 第四步:Jenkins 初始化配置](#5. 第四步:Jenkins 初始化配置)
-
- [5.1 访问 Jenkins Web UI](#5.1 访问 Jenkins Web UI)
- [5.2 获取初始管理员密码](#5.2 获取初始管理员密码)
- [5.3 安装推荐插件](#5.3 安装推荐插件)
- [5.4 创建管理员账户](#5.4 创建管理员账户)
- [5.5 实例配置](#5.5 实例配置)
- [6. 第五步:GitLab.cn 创建项目并推送代码](#6. 第五步:GitLab.cn 创建项目并推送代码)
- [7. 第六步:Jenkins 配置 GitLab 集成](#7. 第六步:Jenkins 配置 GitLab 集成)
-
- [7.1 安装必要插件](#7.1 安装必要插件)
- [7.2 添加 GitLab 凭据](#7.2 添加 GitLab 凭据)
- [7.3 配置 GitLab 服务器连接](#7.3 配置 GitLab 服务器连接)
- [8. 第七步:创建 Jenkins Pipeline 任务](#8. 第七步:创建 Jenkins Pipeline 任务)
-
- [8.1 新建 Pipeline 任务](#8.1 新建 Pipeline 任务)
- [8.2 配置 Pipeline](#8.2 配置 Pipeline)
-
- [General 部分](#General 部分)
- [Build Triggers 部分](#Build Triggers 部分)
- [8.3 Pipeline 定义](#8.3 Pipeline 定义)
- [9. 第八步:触发 CI/CD 并验证](#9. 第八步:触发 CI/CD 并验证)
-
- [9.1 方式一:手动触发(先试这个)](#9.1 方式一:手动触发(先试这个))
- [9.2 方式二:Git Push 自动触发(配置 Webhook)](#9.2 方式二:Git Push 自动触发(配置 Webhook))
- [9.3 验证自动触发](#9.3 验证自动触发)
- [10. 附:Python Demo 项目文件清单](#10. 附:Python Demo 项目文件清单)
-
- [快速本地验证(在 WSL 中)](#快速本地验证(在 WSL 中))
- 视频演示
- 常见问题排查
- 清理资源(重要!)
- 源码下载
1. 架构概览
┌──────────────┐ push code ┌──────────────┐
│ GitLab │ ──────────────────▶│ Jenkins │
│ (代码仓库) │ webhook 触发 │ (CI/CD 引擎) │
└──────────────┘ └──────┬───────┘
│
Docker 执行
│
┌────────────┴────────────┐
│ ① Build (docker build) │
│ ② Test (pytest) │
│ ③ Deploy (echo) │
└─────────────────────────┘
│
┌──────▼──────┐
│ 腾讯云 CVM │
│ (Ubuntu) │
└─────────────┘
核心组件:
| 组件 | 用途 | 部署方式 |
|---|---|---|
| 腾讯云 CVM | 运行 Jenkins 的服务器 | 云控制台创建 |
| Docker | 容器运行时,运行 Jenkins 和构建任务 | apt 安装 |
| Jenkins | CI/CD 编排引擎 | Docker 容器 |
| GitLab | 源代码托管 | SaaS 平台 |
| Python Demo | 被构建和测试的项目 | Flask 应用 |
2. 第一步:创建腾讯云 CVM 实例
2.1 登录腾讯云控制台
打开 https://console.cloud.tencent.com/cvm ,点击 「新建」。
2.2 推荐配置
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 计费模式 | 按量计费 | 体验用,用完即删,省钱 |
| 地域 | 任意(如广州/上海) | 跟着推荐走 |
| 机型 | 任意标准型 /2核4G以上 | Jenkins + Docker 最低需求 |
| 镜像 | Ubuntu 22.04 LTS | 稳定,Docker 支持好 |
| 系统盘 | 高性能云硬盘 50GB | 默认即可 |
| 网络 | 子网选择要正确 | 比如南京三区,子网选择对应 |
| 带宽 | 按流量计费 | 体验够用 |
2.3 安全组配置
关键步骤! 需要放行以下端口:
| 端口 | 协议 | 来源 | 用途 |
|---|---|---|---|
| 22 | TCP | 你的 IP(建议) | SSH 连接 |
| 8080 | TCP | 0.0.0.0/0 | Jenkins Web UI |
| 50000 | TCP | 0.0.0.0/0 | Jenkins Agent 通信 |
嫌麻烦的直接安全组配置:0.0.0.0/0 ALL
⚠️ 安全提醒:体验结束后建议将 8080 和 50000 的来源改回你的 IP 或直接删除安全组规则。
3. 第二步:连接 CVM 并安装 Docker
3.1 SSH 登录
bash
# 从你的本地机器执行(替换 YOUR_IP 和 YOUR_KEY.pem)
ssh ubuntu@公网IP
3.2 安装 Docker(官方脚本,最快最稳)
Ubuntu / Debian
bash
sudo apt update
sudo apt install -y ca-certificates curl gnupg
添加 Docker 官方 GPG key:
bash
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
添加源:
bash
. /etc/os-release
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
${VERSION_CODENAME} stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker:
bash
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动并设置开机自启:
bash
sudo systemctl enable --now docker
验证:
bash
sudo docker run hello-world
# 如果失败,先编辑下面的仓库
如果不想每次都写 sudo:
sudo usermod -aG docker $USER
然后执行:
newgrp docker
查看:
docker ps
仓库配置:
编辑 /etc/docker/daemon.json:
bash
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://xxx.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://mirror.ccs.tencentyun.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 阿里云的镜像自行获取
4. 第三步:Docker 部署 Jenkins
4.1 创建 Jenkins 数据目录
bash
# Jenkins 数据持久化到宿主机,容器删了数据还在
mkdir -p ~/jenkins_home
sudo chown 1000:1000 ~/jenkins_home # Jenkins 容器内用 uid=1000
4.2 启动 Jenkins 容器
bash
docker run -d \
--name jenkins \
--restart unless-stopped \
-p 8080:8080 \
-p 50000:50000 \
-v ~/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
参数说明:
-d后台运行--restart unless-stopped开机自启-p 8080:8080Jenkins Web UI 端口-p 50000:50000Jenkins Agent 通信端口-v ~/jenkins_home:...数据持久化-v /var/run/docker.sock:...关键! 让 Jenkins 容器内可以调用宿主机的 Docker(Docker-in-Docker 简化版)
4.3 确认 Jenkins 正在运行
bash
docker ps | grep jenkins
# 应该看到 jenkins 容器状态为 Up
5. 第四步:Jenkins 初始化配置
5.1 访问 Jenkins Web UI
浏览器打开:http://YOUR_CVM_IP:8080
如果打不开,检查安全组是否放行了 8080 端口
5.2 获取初始管理员密码
回到 SSH 终端执行:
bash
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
将输出的密码粘贴到 Web 页面的输入框中。
5.3 安装推荐插件
选择 「Install suggested plugins」,等待插件安装完成(约 3~5 分钟)。
这一步会自动安装 Git、Pipeline、Docker 等核心插件。
5.4 创建管理员账户
按提示创建:
- 用户名:
admin - 密码:自己设一个,记住
- 邮箱:你的邮箱
5.5 实例配置
Jenkins URL 保持默认 http://YOUR_IP:8080,点击 Save and Finish。
6. 第五步:GitLab.cn 创建项目并推送代码
6.1 注册/登录 GitLab.cn
打开 https://gitlab.cn ,注册或登录你的账号。
6.2 创建新项目
- 点击 「New project」 → 「Create blank project」
- 填写:
- Project name:
calculator-api - Visibility Level:选 Private 或 Public(看你喜好)
- Project name:
- 点击 「Create project」
6.3 获取项目地址
项目创建后,页面顶部会显示 Git 地址,例如:
https://gitlab.cn/your-username/calculator-api.git
6.4 生成 GitLab Personal Access Token
- 点击右上角头像 → 「Preferences」
- 左侧菜单 「Access Tokens」
- 填写:
- Token name:
jenkins-ci - Expiration date:随便选个远的(如 2027-01-01)
- Scopes:勾选
read_repository和write_repository
- Token name:
- 点击 「Create personal access token」
- 立即复制 Token! 页面刷新后就看不到了
6.5 从本地推送 Demo 项目
回到你的本地开发机(或 WSL 终端),项目文件已在 /home/yl/ci-demo-project/ 目录中。
bash
cd /home/yl/ci-demo-project
# 初始化 Git
git init
git add .
git commit -m "feat: init calculator API project"
# 关联远程仓库(替换为你的地址)
git remote add origin https://gitlab.cn/YOUR_USERNAME/calculator-api.git
# 推送到 GitLab(会提示输入用户名和 Access Token)
git push -u origin main
用户名填你的 GitLab 用户名,密码填刚才生成的 Personal Access Token
6.6 验证
刷新 GitLab.cn 项目页面,应该能看到所有文件(app.py, Jenkinsfile, Dockerfile 等)。
7. 第六步:Jenkins 配置 GitLab 集成
7.1 安装必要插件
回到 Jenkins Web UI → 「Manage Jenkins」 → 「Plugins」 → 「Available plugins」,搜索并安装:
- GitLab Plugin
- Docker Pipeline
安装后重启 Jenkins(或勾选「重启后安装」)。
7.2 添加 GitLab 凭据
- 「Manage Jenkins」 → 「Credentials」 → 「System」 → 「Global credentials」
- 点击 「Add Credentials」
- 填写:
- Kind:GitLab API token
- API token:粘贴 6.4 步生成的 Personal Access Token
- ID:
gitlab-token(自定义标识) - Description:
GitLab API Token for calculator-api
- 点击 「Create」
7.3 配置 GitLab 服务器连接
- 「Manage Jenkins」 → 「Configure System」
- 找到 「GitLab」 部分
- 点击 「Add」 → 「GitLab Servers」
- 填写:
- Server name:
jihulab - URL:
https://jihulab.com - Credentials:选择刚才创建的
gitlab-token
- Server name:
- 点击 「Test Connection」 → 应该显示 「Success」
- 保存
8. 第七步:创建 Jenkins Pipeline 任务
8.1 新建 Pipeline 任务
- Jenkins 首页点击 「New Item」
- 输入名称:
calculator-api-pipeline - 选择 「Pipeline」,点击 OK
8.2 配置 Pipeline
在任务配置页面:
General 部分
- 勾选 「GitLab Connection」 :选择
gitlab.cn - 勾选 「This project is parameterized」:(可跳过)
Build Triggers 部分
- 勾选 「Build when a change is pushed to GitLab」
- 勾选以下事件:
- ✅ Push Events
- ✅ Merge Request Events
- 点击 「Advanced」 ,在 「Secret token」 处点击 「Generate」 ,生成一个 Token
- 复制这个 Secret token 值,后面配置 webhook 要用!
- 然后点击页面底部的 「Save」
8.3 Pipeline 定义
在 「Pipeline」 部分,选择 「Pipeline script from SCM」:
- SCM:Git
- Repository URL:
https://jihulab.com/ylqb1124/calculator-api.git - Credentials:Username with password
- Branches to build:
*/main - Script Path:
Jenkinsfile - 点击 「Save」
项目里已经有一个写好的
Jenkinsfile,Pipeline 会自动读取它。
9. 第八步:触发 CI/CD 并验证
9.1 方式一:手动触发(先试这个)
在 Jenkins 任务页面点击 「Build Now」,观察构建过程。
点击构建编号(如 #1)→ 「Console Output」,你应该看到:
bash
[Pipeline] stage (Build)
Building Docker image...
docker build -t calculator-api .
[Pipeline] stage (Test)
Running tests in container...
docker run --rm calculator-api pytest test_app.py -v
test_health PASSED
test_add PASSED
...
8 passed
[Pipeline] stage (Deploy)
Deploying calculator-api...
[Pipeline] End of Pipeline
Finished: SUCCESS
!!!注意:这里很有可能会Failure,这是因为容器内没有docker环境
可以下载一个最小的二进制Docker环境:
bash
docker exec -u root jenkins sh -c "
curl -fsSLo /tmp/docker.tgz https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-27.5.1.tgz && \
tar xzf /tmp/docker.tgz -C /usr/local/bin --strip-components=1
"
随后给权限:
bash
docker exec -u root jenkins sh -c "
# 把 docker.sock 的组改成 docker(宿主机映射过来的可能需要这一步)
chmod 666 /var/run/docker.sock
"
9.2 方式二:Git Push 自动触发(配置 Webhook)
- 回到 GitLab.cn 项目页面
- 「Settings」 → 「Webhooks」
- 填写:
- URL:
http://YOUR_CVM_IP:8080/project/calculator-api-pipeline⚠️ 注意:GitLab.cn 的 Webhook URL 必须是公网可访问的。如果你的 CVM 没有固定公网 IP,webhook 可能不生效,但手动触发完全不受影响。 - Secret token:粘贴 8.2 步生成的 Secret token
- Trigger:勾选 「Push events」
- 取消勾选 「Enable SSL verification」(新手建议取消)
- URL:
- 点击 「Add webhook」
- 点击 「Test」 → 选择 「Push events」,如果返回 HTTP 200 即成功
9.3 验证自动触发
bash
# 在你的本地项目里随便改点东西
echo "# test trigger" >> README.md
git add README.md
git commit -m "test: trigger CI pipeline"
git push origin main
回到 Jenkins,应该看到一个自动触发的构建任务开始运行。
10. 附:Python Demo 项目文件清单
项目目录:/home/yl/ci-demo-project/
ci-demo-project/
├── app.py # Flask 计算器 API(/add /subtract /multiply /divide /health)
├── test_app.py # pytest 测试用例(8 个测试,覆盖正常/异常场景)
├── requirements.txt # Python 依赖(Flask, pytest)
├── Dockerfile # 多阶段构建镜像
├── docker-compose.yml # 一键启动
├── Jenkinsfile # CI/CD Pipeline 定义(Build → Test → Deploy)
├── .dockerignore # Docker 构建忽略文件
├── README.md # 项目说明
└── CI-CD-Guide.md # 本文档
快速本地验证(在 WSL 中)
bash
cd /home/yl/ci-demo-project
# 安装依赖
pip install -r requirements.txt
# 运行测试
python3 -m pytest test_app.py -v
# 启动服务
python3 app.py
# 然后访问 http://localhost:5000/health
# 测试计算: http://localhost:5000/add?a=3&b=4
所有 8 个测试已验证通过 ✅
视频演示
jenkins、CI/CD效果演示
常见问题排查
Q1: Jenkins 页面打不开
- 检查 CVM 安全组是否放行 8080 端口
- 检查 Jenkins 容器是否运行:
docker ps | grep jenkins - 检查 CVM 防火墙:
sudo ufw status
Q2: Jenkins Pipeline 报 docker: command not found
Jenkins 容器内部没有 Docker。确认启动时有没有挂载 docker.sock:
bash
# 检查挂载
docker inspect jenkins | grep docker.sock
# 如果没有,重新创建容器(数据在 ~/jenkins_home 中不会丢)
docker rm -f jenkins
docker run -d \
--name jenkins \
--restart unless-stopped \
-p 8080:8080 -p 50000:50000 \
-v ~/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
Q3: git push 到 GitLab.cn 失败
- 确认使用的是 Personal Access Token 而不是密码
- 确认 Token 权限包含
write_repository
Q4: Webhook 不生效
- GitLab.cn 到 CVM 公网 IP 可能不通(国内网络环境),建议先用手动触发验证
- 如果公网 IP 是动态的,Webhook 不可靠,手动触发一样体验流程
清理资源(重要!)
体验完成后,及时释放资源避免持续扣费:
bash
# 1. 在腾讯云控制台销毁 CVM 实例(或关机)
# 2. 删除不再需要的安全组规则
# 3. 如果使用了弹性公网 IP,记得释放(按量计费 IP 闲置也扣费)