webman项目在jenkins中正确构建需三步:拉代码→执行composer install --no-dev(排除dev依赖)→用systemd封装服务并scp部署后systemctl restart,同时校验php版本、配置监听地址为127.0.0.1、确保runtime目录权限适配运行用户。

Webman 项目本身不自带 CI/CD 能力,Jenkins 也默认不理解 Webman 的启动/重启逻辑。要让 Jenkins 真正自动完成「提交 → 构建 → 部署 → 上线」闭环,必须显式定义三件事:怎么拉代码、怎么安装依赖并构建、怎么替换线上服务且不中断访问。漏掉任何一环,都会出现 build 成功但页面没更新、或 502 报错的情况。
Webman 项目怎么在 Jenkins 里正确构建
Webman 基于 PHP + Swoole,没有传统 mvn package 或 npm run build 那样的标准产出物,它的“构建”本质是:拉取代码 → 安装扩展(如 swoole)→ 运行 composer install --no-dev → 检查 config/ 和 env 是否适配目标环境。
- 不要用自由风格项目默认的“构建触发器 + 执行 shell”,容易忽略 PHP 环境一致性;建议统一用 Pipeline,显式指定
agent { label 'php-8.1' }(需提前在节点上装好 PHP 8.1、Composer、Swoole 扩展) -
composer install必须加--no-dev,否则会装一堆测试类库,增大部署包体积,还可能因 dev 包冲突导致vendor/autoload.php加载失败 - 如果项目用了
.env,Jenkins 里不能直接 commit 到 Git,得用withCredentials注入,再通过sh 'cp .env.jenkins .env'替换,避免敏感信息泄露
Jenkins 怎么安全地重启 Webman 服务
Webman 默认用 php start.php start -d 启动,但 Jenkins 远程执行 ssh user@host "php start.php restart" 很可能失败——因为进程不是由当前用户启动的,或者 systemd 没接管,restart 命令根本不起作用。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 推荐改用 systemd 管理:把 Webman 封装成 service,例如
/etc/systemd/system/webman.service,内容包含ExecStart=/usr/bin/php /var/www/myapp/start.php start -d和Restart=always - Jenkins 部署阶段执行
sh 'scp -r ./* user@prod:/var/www/myapp/ && ssh user@prod "systemctl restart webman"',注意scp要排除runtime/和storage/目录(这些是运行时数据,不能覆盖) - 千万别写
kill -9 $(pgrep -f start.php)—— 这会杀掉所有匹配进程,包括其他项目的 Swoole 实例,极易引发连锁故障
为什么 Webman 部署后常出现 502 或白屏
这不是 Jenkins 的错,而是 Webman 的生命周期和部署方式没对齐。典型现象:Jenkins 控制台显示 “Deploy success”,但浏览器打不开,Nginx 日志里全是 connect() failed (111: Connection refused)。
- 原因一:
start.php stop没真正退出进程,旧 worker 还占着端口,新实例 bind 失败;解决方案是加sleep 2再 start,或用systemctl reload触发平滑重启 - 原因二:Webman 的
config/server.php里'listen' => '0.0.0.0:8080'写死了,但生产环境实际走 Nginx 反代,该配置应改为'listen' => '127.0.0.1:8080',否则暴露端口有风险 - 原因三:Jenkins 构建机和生产机 PHP 版本不一致(比如构建机是 8.2,生产机是 8.1),导致
composer install生成的autoload_static.php兼容性出错,页面空白但无报错;务必在 Jenkinsfile 开头加sh 'php -v'校验版本
最易被忽略的是 Webman 的 runtime/ 目录权限和用户归属——Jenkins 用 jenkins 用户部署,但 Webman 服务由 www-data 运行,runtime/log 目录若没设成 775 且属组为 www-data,就会日志写不进去、报错也不显示,排查时只能干瞪眼。










