本文档详细介绍 C++ 项目的企业级标准部署流程,包含古法手动部署(适合快速验证)和 Jenkins 自动化部署(适合生产环境持续集成)。


标准生产环境架构说明

这是所有企业通用的部署模式,核心是编译和部署分离

本地虚拟机(编译机,vm-linux)→ 编译代码 → 打包产物 → 传输到云服务器(部署机)→ 解压启动

核心优势

  1. 云服务器只需要运行时依赖,不需要装编译环境,更轻量、更安全、启动更快
  2. 编译环境统一,避免 "我本地能跑,服务器跑不了" 的问题
  3. 编译压力不占用云服务器资源,不影响线上服务运行

一、古法手动部署(先搞懂原理)

前置准备

  1. 本地编译机(vm-linux):已安装完整编译环境(gcc-c++、cmake、make、openssl-devel 等)
  2. 云端部署机:已安装运行时依赖,开放了服务端口(如 8090)和 SSH 端口(22)
  3. 能通过 SSH 从本地编译机连接到云服务器

完整手动部署流程

【第一步:在本地编译机(vm-linux)上执行】
# 1. 拉取最新代码
git clone https://codeup.aliyun.com/zero-one-star/zero-awei/zero-one-eams2603.git
cd zero-one-eams2603
# 切换到生产环境分支
git checkout arch-cpp-sample

# 2. 编译代码(生成可执行文件和依赖库)
cd eams-cpp
rm -rf out  # 清理旧编译产物
sh build.sh # 执行编译脚本

# 3. 打包编译产物(只打包需要部署的文件)
cd out/install/zero-one-eams
# 打包lib依赖库和arch-demo服务
tar -zcvf deploy-package.tar.gz lib/ arch-demo/

【第二步:在本地编译机上执行,上传到云服务器】
# 将打包好的文件上传到云服务器的部署目录
# 替换为你的云服务器公网IP和部署目录
scp deploy-package.tar.gz root@你的云服务器公网IP:/home/app/cpp-end/
【第三步:在云端部署机上执行】
# 1. 停止正在运行的旧服务
pkill -f arch-demo || true

# 2. 进入部署目录,清空旧文件
cd /home/app/cpp-end
rm -rf ./*

# 3. 解压新的部署包
tar -zxvf deploy-package.tar.gz

# 4. 给可执行文件加运行权限
cd arch-demo
chmod +x arch-demo

# 5. 启动服务(替换为你的云服务器公网IP)
sh run-back.sh arch-demo na=你的云服务器公网IP ns=eams-cpp-prod ip=0.0.0.0 sn=arch-demo

二、Jenkins 自动化部署(一劳永逸)

核心逻辑

Jenkins 自动执行上面手动部署的所有步骤:

  1. 从代码仓库拉最新代码 → 2. 在本地编译机编译 → 3. 停止云端旧服务 → 4. 把编译产物传到云端 → 5. 启动云端新服务

(一)环境准备

1. 本地编译机(vm-linux)依赖
# 完整编译环境
yum -y install gcc-c++ cmake make
yum -y install openssl-devel libcurl-devel libuuid-devel
2. 云端部署机依赖(只需要运行时,不需要编译环境)
# 仅运行时依赖,比编译环境小很多
yum -y install openssl libcurl libuuid
3. Jenkins 基础环境

一般Jenkins装在云服务器上

# 创建工作目录
mkdir -p /home/jenkins/jenkins_home
mkdir -p /home/jenkins/maven/m2

# 关键:给 Jenkins 容器用户(UID 1000)赋权
chown -R 1000 /home/jenkins/jenkins_home

# 开放端口(云服务器需在控制台配置安全组)
firewall-cmd --add-port 8380/tcp --permanent
firewall-cmd --reload

为了防止Jenkins容器没法读写文件,因为Jenkins容器里的默认用户是jenkins,这个用户在容器里的ID是1000。

创建maven/m2目录是为了把宿主机的/home/jenkins/maven/m2挂在到容器的/root/.m2,Maven时Java项目的打包工具,构建项目会自动下载依赖包。依赖包就会存到宿主机上,容器重启多少次都不用重新下载,节省时间。如果不这样弄,把容器删了重启,下载过的依赖包都会消失,需要重新从网上下载。

如果你只做 C++ 项目,不搞 Java,那个 Maven 目录完全可以跳过。

使用docker来安装Jenkins,为了方便,使用docker-compose.yml

version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    user: root
    privileged: true
    environment:
      TZ: Asia/Shanghai
    ports:
      - "8380:8080"
      - "50000:50000"
    volumes:
      - /home/jenkins/jenkins_home:/var/jenkins_home
      - /home/jenkins/maven/m2:/root/.m2
      - /var/run/docker.sock:/var/run/docker.sock

使用docker compose up 启动,首次启动会拉取镜像,需要你的镜像站可以正常拉取(可以魔法上网解决)。

如果有下面结果就是服务器正常启动

按ctrl+c 结束前台启动,然后切换到后台模式启动,使用docker compose up -d 

如果忘了密码可以用 docker logs jenkins查看日志

在浏览器中登陆,进入插件安装界面

注意:安装插件前一定要保证你的服务器时间是对的,可以通过date命令查看,如果不同步时间,安装插件就会出错。

插件安装完后,会进入创建管理员账号页面

在实例配置里,检查URL是否正确,完成后进入系统。

在右上角的齿轮,可以找到全局工具配置

在可用插件中搜索关键词

等待下载完后重启

关闭后,服务器如果没有自动重启(docker安装都需要手动重启一下),执行通过命令行手动启动一下服务。

使用docker compose start重启。然后登陆之前注册的admin账号


(二)新增云端服务器 SSH 配置和凭据

 SSH配制:
  1. 点击「系统管理」→「系统配置」→ 拉到最下面「Publish over SSH」
  2. 点击「新增」,添加云端部署机的 SSH 配置:
    配置项 填写内容
    Name cloud-server(自定义,区分本地编译机)
    Hostname 你的云服务器公网 IP
    Username 云服务器登录用户名(如 root
    Remote Directory /home/app/cpp-end(云端部署目录)
  3. 点击「高级」,勾选「Use password authentication」,输入云服务器密码
  4. 点击「Test Configuration」,显示「Success」表示配置成功
  5. 点击「保存」

分别输入名称,服务器Ip地址,登陆服务器使用用户,登陆后默认进入到服务器的目录

输入完成后,此时点击测试是不通的,点击下方的高级

输入密码

注意:你需要分别配制本地和云端的SSH Server

 现在你有两个 SSH Server 了:

  • vm-linux:本地编译机,负责编译代码
  • cloud-server:云端部署机,负责运行服务
凭据配制:

     在Jenkins的系统管理中找到凭据管理,添加一个全局凭证;使用Username with password,选择用户名密码类型的凭据。

 

输入托管平台(比如gitee)的用户名和密码,勾选上Treat

创建成功如图所示


(三)C++ 项目自动化部署任务配置

1. 新建任务
  1. Jenkins 首页 → 点击左侧「新建任务」
  2. 输入任务名称(如 cpp-prod-deploy
  3. 选择「构建一个自由风格的软件项目」
  4. 点击「确定」

2. 配置源码管理

和单节点模式完全一致:

  1. 找到「源码管理」,勾选「Git」
  2. Repository URL:输入你的代码仓库地址
  3. Credentials:选择你的代码仓库凭据
  4. Branches to build:指定生产环境分支(如 */arch-cpp-sample

如果出现无法连接仓库,说明凭据不对,需要重新设置


3. 配置构建步骤(共 4 步,分两台机器执行)

找到「构建步骤」,依次添加 4 个「Send files or execute commands over SSH」步骤。


构建步骤 1:在本地编译机编译代码

执行机器:本地虚拟机(vm-linux)

  1. Name:选择 vm-linux
  2. 点击「高级」,勾选「Verbose output in console」(输出详细编译日志)
  3. Source files、Remove prefix、Remote directory:全部留空
  4. Exec command
    # 进入Jenkins工作区(固定路径,不用改)
    cd /home/jenkins/jenkins_home/workspace/cpp-prod-deploy/
    # 进入项目源码目录
    cd eams-cpp
    # 清理旧编译产物
    rm -rf out
    # 执行编译
    sh build.sh
    


构建步骤 2:停止云端旧服务

执行机器:云服务器(cloud-server)

  1. Name:选择 cloud-server
  2. 其他框全部留空,只填 Exec command
    # 停止正在运行的旧服务
    curl http://127.0.0.1:8090/system-kill/01star
    # 清空云端部署目录
    cd /home/app/cpp-end && rm -rf ./*
    

注意:我这里用的本地演示,所以地址是127。但这里实际关停的是云服务器的服务


构建步骤 3:将编译产物从本地传到云端

执行机器:本地虚拟机(vm-linux)→ 传输到云服务器(cloud-server)

  1. Name:选择 cloud-server(注意:这里选云端服务器!)
  2. Transfer Set 配置(核心!从本地编译机拉文件传到云端):

    表格

    配置项 填写内容
    Source files eams-cpp/out/install/zero-one-eams/lib/**,eams-cpp/out/install/zero-one-eams/arch-demo/**
    Remove prefix eams-cpp/out/install/zero-one-eams/
    Remote directory /home/app/cpp-end(云端部署目录)
  3. Exec command:留空(这一步只传文件,不执行命令)

💡 原理说明:Jenkins 会先从本地编译机(vm-linux)的指定路径拉取文件,然后通过 SSH 传输到云服务器(cloud-server)的指定目录,同时移除前面的路径前缀。


构建步骤 4:在云端启动新服务

执行机器:云服务器(cloud-server)

  1. Name:选择 cloud-server
  2. 其他框全部留空,只填 Exec command
    # 进入云端可执行文件目录
    cd /home/app/cpp-end/arch-demo
    # 给可执行文件加运行权限
    chmod +x arch-demo
    # 启动服务(替换为你的云服务器公网IP)
    sh run-back.sh arch-demo na=你的云服务器公网IP ns=eams-cpp-prod ip=0.0.0.0 sn=arch-demo
    


4. 保存配置

所有步骤配置完成后,拉到页面最下面,点击「保存」(建议每配置完一步就点击一次「应用」)。


(四)构建与验证

  1. 回到任务页面,点击左侧「立即构建」
  2. 点击构建记录 →「控制台输出」,查看每一步的执行日志
  3. 构建完成后,日志最后显示 Finished: SUCCESS 表示部署成功
  4. 验证服务:在浏览器访问 http://你的云服务器公网IP:8090,能看到接口文档表示服务正常运行

三、关键配置对照表

1. 两台机器角色与配置对比

角色 机器 需要安装的软件 Jenkins SSH Server 名称
编译机 本地虚拟机(vm-linux) 完整编译环境(gcc、cmake 等) vm-linux
部署机 云服务器 仅运行时依赖(openssl、libcurl 等) cloud-server

2. 路径对照表

配置项 填写内容
本地编译机工作区 /home/jenkins/jenkins_home/workspace/cpp-prod-deploy/
本地编译产物路径 eams-cpp/out/install/zero-one-eams/
云端部署根目录 /home/app/cpp-end
云端可执行文件目录 /home/app/cpp-end/arch-demo

四、生产环境注意事项

  1. 安全组配置:云服务器必须开放 SSH 端口(22)和服务端口(如 8090)的入方向规则
  2. 启动参数:生产环境 ip 要填 0.0.0.0(监听所有网卡),不要填 127.0.0.1
  3. 日志管理:建议将服务日志输出到文件,方便排查问题
  4. 进程守护:生产环境建议使用 systemdsupervisor 管理服务进程,防止服务意外退出
  5. 版本回滚:每次部署前备份旧版本,方便出现问题时快速回滚

五、常见问题

  1. 文件传输失败:检查本地编译机的编译产物路径是否正确,确认云服务器的部署目录存在且有写入权限
  2. 云端服务启动失败:手动在云服务器上执行启动命令,查看具体报错信息,一般是缺少依赖库
  3. 无法访问云端服务:检查云服务器安全组是否开放了服务端口,确认服务是否正常监听 0.0.0.0 地址
  4. SSH 连接失败:检查云服务器的公网 IP、用户名、密码是否正确,确认云服务器 SSH 服务已启动
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐