腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南(python、flask实现简单计算器)
腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南
适用场景:个人学习 / 体验 CI/CD 流程
总耗时:约 2~3 小时(含 CVM 创建等待时间)
预算:腾讯云 CVM 按量计费约 0.4~0.5 元/小时
文章目录
- 腾讯云 CVM + Docker + Jenkins + GitLab CI/CD 全流程指南
- 1. 架构概览
- 2. 第一步:创建腾讯云 CVM 实例
- 2.1 登录腾讯云控制台
- 2.2 推荐配置
- 2.3 安全组配置
- 3. 第二步:连接 CVM 并安装 Docker
- 3.1 SSH 登录
- 3.2 安装 Docker(官方脚本,最快最稳)
- 4. 第三步:Docker 部署 Jenkins
- 4.1 创建 Jenkins 数据目录
- 4.2 启动 Jenkins 容器
- 4.3 确认 Jenkins 正在运行
- 5. 第四步:Jenkins 初始化配置
- 5.1 访问 Jenkins Web UI
- 5.2 获取初始管理员密码
- 5.3 安装推荐插件
- 5.4 创建管理员账户
- 5.5 实例配置
- 6. 第五步:GitLab.cn 创建项目并推送代码
- 6.1 注册/登录 GitLab.cn
- 6.2 创建新项目
- 6.3 获取项目地址
- 6.4 生成 GitLab Personal Access Token
- 6.5 从本地推送 Demo 项目
- 6.6 验证
- 7. 第六步:Jenkins 配置 GitLab 集成
- 7.1 安装必要插件
- 7.2 添加 GitLab 凭据
- 7.3 配置 GitLab 服务器连接
- 8. 第七步:创建 Jenkins Pipeline 任务
- 8.1 新建 Pipeline 任务
- 8.2 配置 Pipeline
- General 部分
- Build Triggers 部分
- 8.3 Pipeline 定义
- 9. 第八步:触发 CI/CD 并验证
- 9.1 方式一:手动触发(先试这个)
- 9.2 方式二:Git Push 自动触发(配置 Webhook)
- 9.3 验证自动触发
- 10. 附:Python Demo 项目文件清单
- 快速本地验证(在 WSL 中)
- 视频演示
- 常见问题排查
- Q1: Jenkins 页面打不开
- Q2: Jenkins Pipeline 报 `docker: command not found`
- Q3: `git push` 到 GitLab.cn 失败
- Q4: Webhook 不生效
- 清理资源(重要!)
- 源码下载
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 登录
# 从你的本地机器执行(替换 YOUR_IP 和 YOUR_KEY.pem)sshubuntu@公网IP3.2 安装 Docker(官方脚本,最快最稳)
Ubuntu / Debian
sudoaptupdatesudoaptinstall-yca-certificatescurlgnupg添加 Docker 官方 GPG key:
sudoinstall-m0755-d/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudogpg--dearmor-o/etc/apt/keyrings/docker.gpgsudochmoda+r /etc/apt/keyrings/docker.gpg添加源:
./etc/os-releaseecho\"deb [arch=$(dpkg --print-architecture)signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \${VERSION_CODENAME}stable"|\sudotee/etc/apt/sources.list.d/docker.list>/dev/null安装 Docker:
sudoaptupdatesudoaptinstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin启动并设置开机自启:
sudosystemctlenable--nowdocker验证:
sudodockerrun hello-world# 如果失败,先编辑下面的仓库如果不想每次都写sudo:sudo usermod -aG docker $USER
然后执行:newgrp docker
查看:docker ps
仓库配置:
编辑/etc/docker/daemon.json:
{"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"}}# 重启服务sudosystemctl daemon-reloadsudosystemctl restartdocker# 阿里云的镜像自行获取4. 第三步:Docker 部署 Jenkins
4.1 创建 Jenkins 数据目录
# Jenkins 数据持久化到宿主机,容器删了数据还在mkdir-p~/jenkins_homesudochown1000:1000 ~/jenkins_home# Jenkins 容器内用 uid=10004.2 启动 Jenkins 容器
dockerrun-d\--namejenkins\--restartunless-stopped\-p8080:8080\-p50000: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 正在运行
dockerps|grepjenkins# 应该看到 jenkins 容器状态为 Up5. 第四步:Jenkins 初始化配置
5.1 访问 Jenkins Web UI
浏览器打开:http://YOUR_CVM_IP:8080
如果打不开,检查安全组是否放行了 8080 端口
5.2 获取初始管理员密码
回到 SSH 终端执行:
dockerexecjenkinscat/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.git6.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/目录中。
cd/home/yl/ci-demo-project# 初始化 Gitgitinitgitadd.gitcommit-m"feat: init calculator API project"# 关联远程仓库(替换为你的地址)gitremoteaddorigin https://gitlab.cn/YOUR_USERNAME/calculator-api.git# 推送到 GitLab(会提示输入用户名和 Access Token)gitpush-uorigin 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」,你应该看到:
[Pipeline]stage(Build)Building Docker image...dockerbuild-tcalculator-api.[Pipeline]stage(Test)Running testsincontainer...dockerrun--rmcalculator-api pytest test_app.py-vtest_health PASSED test_add PASSED...8passed[Pipeline]stage(Deploy)Deploying calculator-api...[Pipeline]End of Pipeline Finished: SUCCESS!!!注意:这里很有可能会Failure,这是因为容器内没有docker环境
可以下载一个最小的二进制Docker环境:
dockerexec-uroot jenkinssh-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 "随后给权限:
dockerexec-uroot jenkinssh-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 验证自动触发
# 在你的本地项目里随便改点东西echo"# test trigger">>README.mdgitaddREADME.mdgitcommit-m"test: trigger CI pipeline"gitpush 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 中)
cd/home/yl/ci-demo-project# 安装依赖pipinstall-rrequirements.txt# 运行测试python3-mpytest 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:
# 检查挂载dockerinspect jenkins|grepdocker.sock# 如果没有,重新创建容器(数据在 ~/jenkins_home 中不会丢)dockerrm-fjenkinsdockerrun-d\--namejenkins\--restartunless-stopped\-p8080:8080-p50000:50000\-v~/jenkins_home:/var/jenkins_home\-v/var/run/docker.sock:/var/run/docker.sock\jenkins/jenkins:ltsQ3:git push到 GitLab.cn 失败
- 确认使用的是 Personal Access Token 而不是密码
- 确认 Token 权限包含
write_repository
Q4: Webhook 不生效
- GitLab.cn 到 CVM 公网 IP 可能不通(国内网络环境),建议先用手动触发验证
- 如果公网 IP 是动态的,Webhook 不可靠,手动触发一样体验流程
清理资源(重要!)
体验完成后,及时释放资源避免持续扣费:
# 1. 在腾讯云控制台销毁 CVM 实例(或关机)# 2. 删除不再需要的安全组规则# 3. 如果使用了弹性公网 IP,记得释放(按量计费 IP 闲置也扣费)源码下载
gitlab仓库地址
