C++ 项目部署教程(标准生产环境架构:本地编译 + Jenkins云端部署)
本文档详细介绍 C 项目的企业级标准部署流程包含古法手动部署适合快速验证和Jenkins 自动化部署适合生产环境持续集成。标准生产环境架构说明这是所有企业通用的部署模式核心是编译和部署分离本地虚拟机编译机vm-linux→ 编译代码 → 打包产物 → 传输到云服务器部署机→ 解压启动核心优势云服务器只需要运行时依赖不需要装编译环境更轻量、更安全、启动更快编译环境统一避免 我本地能跑服务器跑不了 的问题编译压力不占用云服务器资源不影响线上服务运行一、古法手动部署先搞懂原理前置准备本地编译机vm-linux已安装完整编译环境gcc-c、cmake、make、openssl-devel 等云端部署机已安装运行时依赖开放了服务端口如 8090和 SSH 端口22能通过 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 nseams-cpp-prod ip0.0.0.0 snarch-demo二、Jenkins 自动化部署一劳永逸核心逻辑Jenkins 自动执行上面手动部署的所有步骤从代码仓库拉最新代码 → 2. 在本地编译机编译 → 3. 停止云端旧服务 → 4. 把编译产物传到云端 → 5. 启动云端新服务一环境准备1. 本地编译机vm-linux依赖# 完整编译环境 yum -y install gcc-c cmake make yum -y install openssl-devel libcurl-devel libuuid-devel2. 云端部署机依赖只需要运行时不需要编译环境# 仅运行时依赖比编译环境小很多 yum -y install openssl libcurl libuuid3. 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/.m2Maven时Java项目的打包工具构建项目会自动下载依赖包。依赖包就会存到宿主机上容器重启多少次都不用重新下载节省时间。如果不这样弄把容器删了重启下载过的依赖包都会消失需要重新从网上下载。如果你只做 C 项目不搞 Java那个 Maven 目录完全可以跳过。使用docker来安装Jenkins为了方便使用docker-compose.ymlversion: 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 启动首次启动会拉取镜像需要你的镜像站可以正常拉取可以魔法上网解决。如果有下面结果就是服务器正常启动按ctrlc 结束前台启动然后切换到后台模式启动使用docker compose up -d如果忘了密码可以用 docker logs jenkins查看日志在浏览器中登陆进入插件安装界面注意安装插件前一定要保证你的服务器时间是对的可以通过date命令查看如果不同步时间安装插件就会出错。插件安装完后会进入创建管理员账号页面在实例配置里检查URL是否正确完成后进入系统。在右上角的齿轮可以找到全局工具配置在可用插件中搜索关键词等待下载完后重启关闭后服务器如果没有自动重启docker安装都需要手动重启一下执行通过命令行手动启动一下服务。使用docker compose start重启。然后登陆之前注册的admin账号二新增云端服务器 SSH 配置和凭据SSH配制点击「系统管理」→「系统配置」→ 拉到最下面「Publish over SSH」点击「新增」添加云端部署机的 SSH 配置配置项填写内容Namecloud-server自定义区分本地编译机Hostname你的云服务器公网 IPUsername云服务器登录用户名如rootRemote Directory/home/app/cpp-end云端部署目录点击「高级」勾选「Use password authentication」输入云服务器密码点击「Test Configuration」显示「Success」表示配置成功点击「保存」分别输入名称服务器Ip地址登陆服务器使用用户登陆后默认进入到服务器的目录输入完成后此时点击测试是不通的点击下方的高级输入密码注意你需要分别配制本地和云端的SSH Server现在你有两个 SSH Server 了vm-linux本地编译机负责编译代码cloud-server云端部署机负责运行服务凭据配制在Jenkins的系统管理中找到凭据管理,添加一个全局凭证使用Username with password选择用户名密码类型的凭据。输入托管平台(比如gitee)的用户名和密码勾选上Treat创建成功如图所示三C 项目自动化部署任务配置1. 新建任务Jenkins 首页 → 点击左侧「新建任务」输入任务名称如cpp-prod-deploy选择「构建一个自由风格的软件项目」点击「确定」2. 配置源码管理和单节点模式完全一致找到「源码管理」勾选「Git」Repository URL输入你的代码仓库地址Credentials选择你的代码仓库凭据Branches to build指定生产环境分支如*/arch-cpp-sample如果出现无法连接仓库说明凭据不对需要重新设置3. 配置构建步骤共 4 步分两台机器执行找到「构建步骤」依次添加 4 个「Send files or execute commands over SSH」步骤。构建步骤 1在本地编译机编译代码执行机器本地虚拟机vm-linuxName选择vm-linux点击「高级」勾选「Verbose output in console」输出详细编译日志Source files、Remove prefix、Remote directory全部留空Exec command# 进入Jenkins工作区固定路径不用改 cd /home/jenkins/jenkins_home/workspace/cpp-prod-deploy/ # 进入项目源码目录 cd eams-cpp # 清理旧编译产物 rm -rf out # 执行编译 sh build.sh构建步骤 2停止云端旧服务执行机器云服务器cloud-serverName选择cloud-server其他框全部留空只填Exec command# 停止正在运行的旧服务 curl http://127.0.0.1:8090/system-kill/01star # 清空云端部署目录 cd /home/app/cpp-end rm -rf ./*注意我这里用的本地演示所以地址是127。但这里实际关停的是云服务器的服务构建步骤 3将编译产物从本地传到云端执行机器本地虚拟机vm-linux→ 传输到云服务器cloud-serverName选择cloud-server注意这里选云端服务器Transfer Set配置核心从本地编译机拉文件传到云端表格配置项填写内容Source fileseams-cpp/out/install/zero-one-eams/lib/**,eams-cpp/out/install/zero-one-eams/arch-demo/**Remove prefixeams-cpp/out/install/zero-one-eams/Remote directory/home/app/cpp-end云端部署目录Exec command留空这一步只传文件不执行命令 原理说明Jenkins 会先从本地编译机vm-linux的指定路径拉取文件然后通过 SSH 传输到云服务器cloud-server的指定目录同时移除前面的路径前缀。构建步骤 4在云端启动新服务执行机器云服务器cloud-serverName选择cloud-server其他框全部留空只填Exec command# 进入云端可执行文件目录 cd /home/app/cpp-end/arch-demo # 给可执行文件加运行权限 chmod x arch-demo # 启动服务替换为你的云服务器公网IP sh run-back.sh arch-demo na你的云服务器公网IP nseams-cpp-prod ip0.0.0.0 snarch-demo4. 保存配置所有步骤配置完成后拉到页面最下面点击「保存」建议每配置完一步就点击一次「应用」。四构建与验证回到任务页面点击左侧「立即构建」点击构建记录 →「控制台输出」查看每一步的执行日志构建完成后日志最后显示Finished: SUCCESS表示部署成功验证服务在浏览器访问http://你的云服务器公网IP:8090能看到接口文档表示服务正常运行三、关键配置对照表1. 两台机器角色与配置对比角色机器需要安装的软件Jenkins SSH Server 名称编译机本地虚拟机vm-linux完整编译环境gcc、cmake 等vm-linux部署机云服务器仅运行时依赖openssl、libcurl 等cloud-server2. 路径对照表配置项填写内容本地编译机工作区/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四、生产环境注意事项安全组配置云服务器必须开放 SSH 端口22和服务端口如 8090的入方向规则启动参数生产环境ip要填0.0.0.0监听所有网卡不要填127.0.0.1日志管理建议将服务日志输出到文件方便排查问题进程守护生产环境建议使用systemd或supervisor管理服务进程防止服务意外退出版本回滚每次部署前备份旧版本方便出现问题时快速回滚五、常见问题文件传输失败检查本地编译机的编译产物路径是否正确确认云服务器的部署目录存在且有写入权限云端服务启动失败手动在云服务器上执行启动命令查看具体报错信息一般是缺少依赖库无法访问云端服务检查云服务器安全组是否开放了服务端口确认服务是否正常监听0.0.0.0地址SSH 连接失败检查云服务器的公网 IP、用户名、密码是否正确确认云服务器 SSH 服务已启动