ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Deployer 已知问题与排查指南:从 `ln --relative` 到 Rsync 断流的环境兼容性清单

Deployer 已知问题与排查指南:从 `ln --relative` 到 Rsync 断流的环境兼容性清单 DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载本篇指南以 docs/KNOWN_BUGS.md 为骨架系统梳理 DeployerPHP 部署工具在特定系统工具版本下遇到的四类已知问题——相对符号链接失效、OpenSSH ControlPersist 残留、cURL 多 HTTPS 证书校验失败、Rsync 上传中途断流并逐一给出可落地的配置修复与绕过方案。读完本文你将掌握如何在deploy.php中通过use_relative_symlink、ssh_multiplexing、upload()的options等参数规避这些环境陷阱并理解这些配置在源码中的实际生效链路。问题总览与适用前提Deployer 底层依赖远程主机上的系统命令ln、ssh、rsync、curl等来完成符号链接切换、文件上传等核心操作。由于各发行版打包的 GNU/Linux 工具版本存在差异某些版本的实现缺陷会直接导致部署任务失败。KNOWN_BUGS 文档记录的并非 Deployer 自身的代码缺陷而是上游系统工具在特定版本下的行为问题因此每个条目的修复方式都聚焦于「在 Deployer 配置层绕过或调整」。适用前提以下问题均针对对应工具的特定版本Coreutils 8.21、OpenSSH 7.2p2、cURL 7.29.0、Rsync 3.1.3。如果你在生产环境的同一类系统上遇到类似报错可按对应章节定位。一、Ubuntu 14.04 / Coreutils 8.21相对符号链接导致 rollback 失败1.1 问题现象Ubuntu 14.04 自带的 Coreutils 8.21 中ln --relativeln -r存在已知缺陷当使用相对路径创建符号链接时生成的链接目标可能不正确。由于 Deployer 的回滚rollback和发布流程高度依赖current目录的符号链接切换这一缺陷会直接导致rollback命令失败。1.2 根因use_relative_symlink的自动探测Deployer 默认会自动探测远程主机的ln是否支持--relative选项见 recipe/common.php// Should {{bin/symlink}} use --relative option or not. Will detect // automatically. set(use_relative_symlink, function () { return commandSupportsOption(ln, --relative); }); // Path to the ln bin. With predefined options -nfs. set(bin/symlink, function () { return get(use_relative_symlink) ? ln -nfs --relative : ln -nfs; });其中commandSupportsOption()的实现位于 src/functions.php它通过执行(man ln 21 || ln -h 21 || ln --help 21) | grep -- --relative来检测选项是否存在于帮助/手册文本中。问题在于Coreutils 8.21 的ln --help已经输出了--relative的说明但该选项的实际实现存在缺陷。也就是说自动探测会返回trueDeployer 便启用了ln -nfs --relative从而触发了上游缺陷。该探测结果最终被deploy:symlink任务使用见 recipe/deploy/symlink.php当use_atomic_symlink依赖mv --no-target-directory不可用时回退到两步切换run(cd {{deploy_path}} {{bin/symlink}} {{release_path}} {{current_path}}); // Atomic override symlink. run(cd {{deploy_path}} rm release); // Remove release link.1.3 修复方式强制关闭相对符号链接在deploy.php中显式关闭该选项set(use_relative_symlink, false);这样bin/symlink将退化为ln -nfs使用绝对路径创建符号链接绕开 Coreutils 8.21 的缺陷。该修复同样适用于任何ln --relative行为异常的远端环境。二、OpenSSH 7.2p2ControlPersist 导致 stderr 句柄残留2.1 问题现象在 OpenSSH 7.2p2 下启用 SSH 连接复用multiplexing后ControlPersist会使 stderr 保持打开状态直到主连接master connection超时。这会导致 Deployer 执行远程命令后进程的 stderr 管道迟迟不关闭从而让调用方误以为命令仍在运行或出现挂起。2.2 根因Deployer 的ssh_multiplexing默认选项Deployer 在主机配置了ssh_multiplexing时会为 SSH 连接附加如下参数见 src/Host/Host.phpif ($this-has(ssh_multiplexing) $this-getSshMultiplexing()) { $options array_merge($options, [ -o, ControlMasterauto, -o, ControlPersist60, -o, ControlPath . $this-getSshControlPath(), ]); }即默认使用ControlMasterautoControlPersist60。在 OpenSSH 7.2p2 中ControlPersist的行为缺陷对应上游 Debian bug 714526 与 OpenSSH bug 1988会导致上述 stderr 残留。2.3 规避方式若部署主机为 OpenSSH 7.2p2可考虑在主机配置中关闭 multiplexing或升级 OpenSSHhost(production) -set(ssh_multiplexing, false);若仍需连接复用可结合上游 bug 报告确认当前版本是否包含修复后再启用KNOWN_BUGS 文档仅记录了问题存在未给出内置修复开关因此升级 OpenSSH 是根治手段。三、cURL 7.29.0多 HTTPS 地址证书校验失败3.1 问题现象cURL 7.29.0 在同时面对多个 https URL进行证书校验时存在缺陷对应 Red Hat bugzilla 1241172表现为其中一个或多个 https 请求的证书校验失败即便证书本身有效。3.2 影响面与处理建议Deployer 的Httpie工具见 src/Utility/Httpie.php基于 cURL 发起 HTTP 请求用于 Slack、Telegram、Discord 等通知渠道的 webhook 推送以及各类 HTTP 探测。若你的deploy.php中配置了多个 HTTPS 通知端点或部署流程需要向多个 HTTPS 服务发起请求在 cURL 7.29.0 环境下即可能触发该校验失败。KNOWN_BUGS 文档未给出 Deployer 侧的配置开关处理方式为升级系统 cURL 至修复版本该缺陷属上游实现问题或确保每次部署中发往的 HTTPS 端点证书链路完整避免触发校验竞争条件在无法升级的受限环境下可评估是否需要暂时减少单次部署中的 HTTPS 通知数量。四、Rsync 3.1.3制品上传首块数据后断流Broken pipe4.1 问题现象与报错特征当使用 Deployer 的upload()上传制品artifact到远程主机时Rsync 3.1.3 会在传输第一个数据块之后中断。典型的失败输出如下The command rsync -azP -e ssh -A -p *** -o UserKnownHostsFile/dev/null -o StrictHostKeyCheckingno artifacts/artifact.tar.gz deployssh.XXX.io:/srv/releases/2009076181 failed. Exit Code: 255(Unknown error) Output: sending incremental file list artifact.tar.gz 32,768 0% 0.00kB/s 0:00:00 Error Output: client_loop: send disconnect: Broken pipe rsync: [sender] write error: Broken pipe (32)特征非常明显sending incremental file list之后仅出现32,768字节即第一个 chunk就抛出Broken pipe退出码 255。4.2 根因Rsync 3.1.3 的上游缺陷该问题源于 Rsync 3.1.3 的传输实现缺陷也与远端 SSH 通道交互相关并非 Deployer 自身逻辑错误。从 Deployer 的upload()实现src/functions.php可以看到上传最终委托给Deployer\Utility\Rsync执行默认使用-azP标志见 src/Utility/Rsync.php$defaults [ timeout null, options [], flags -azP, progress_bar true, display_stats false, ];4.3 绕过方案限制带宽--bwlimit4096KNOWN_BUGS 文档给出的经实践验证的绕过方式是给 rsync 增加--bwlimit4096限制传输带宽以规避该缺陷。在自定义任务中这样使用task(artifact:upload, function () { upload(get(artifact_path), {{release_path}}, [options [--bwlimit4096]]); });注artifact:upload是 Magento 2 配方recipe中已内置的任务默认实现见 recipe/magento2.php其源码为upload(get(artifact_path), {{release_path}});。因此在使用 Magento 2 制品部署时你需要像上文一样重新定义该任务并传入options才能应用此绕过方案。4.4 扩展upload()的完整配置项结合 src/functions.php 与 src/Utility/Rsync.php 的实现upload($source, $destination, $config)支持以下配置键配置键类型默认值说明flagsstring-azP替换默认的 rsync 标志optionsarray[]追加到 rsync 命令的额外参数如--bwlimit4096、--exclude-fromfiletimeoutint|nullnull进程超时秒数null表示不限时progress_barbooltrue显示传输进度条解析to-chk/to-check输出display_statsboolfalse显示 rsync 统计信息options中含--stats时自动开启此外需要注意两点实现细节src/Utility/Rsync.php若主机配置了连接选项Deployer 会自动附加-e与对应的ssh参数若配置了become用户会附加--rsync-path sudo -H -u user rsync。文档与注释明确提示PHP 的 shell 转义会破坏 rsync 的--exclude{a,b}花括号列表语法应改为逐个传入--exclude...或使用--exclude-fromfile。五、通用排查思路把「探测」与「真实行为」区分开从上述四个案例可以归纳出一条 Deployer 兼容性排障的核心经验自动探测可能误判commandSupportsOption()src/functions.php通过 man/help 文本判断能力但「文档声称支持」不等于「实现正确」。Coreutils 8.21 的ln --relative正是此类误判的典型。优先显式固定关键开关对于use_relative_symlink、use_atomic_symlink、ssh_multiplexing这类影响发布核心链路的行为开关在已知问题环境Ubuntu 14.04、OpenSSH 7.2p2中建议显式声明取值而不是依赖自动探测。系统工具缺陷优先升级cURL 7.29.0 与 Rsync 3.1.3 的缺陷属于上游实现问题Deployer 只能提供参数层面的绕过如--bwlimit4096根治仍是升级系统工具。保留部署日志以便复现失败输出中的完整 rsync/ssh 命令行如rsync -azP -e ssh -A -p ...是定位版本缺陷的第一手证据建议在排障时与本文所列报错特征逐条比对。六、延伸阅读部署核心配方与参数默认值recipe/common.php符号链接发布任务实现recipe/deploy/symlink.phpupload()/download()函数定义与配置说明src/functions.phpRsync 上传底层实现与进度解析src/Utility/Rsync.phpMagento 2 制品打包/上传/解包任务链recipe/magento2.phpSSH 连接复用参数生成src/Host/Host.php赞分享DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载相关推荐实战指南如何在PyTorch/XLA中使用SPMD进行模型并行训练实战指南如何在PyTorch/XLA中使用SPMD进行模型并行训练 PyTorch/XLA是一个强大的工具它允许开发者在XLA设备如Google TPUFrankenPHP 已知问题排查指南不兼容扩展、musl 兼容性、Docker TLS 与 Composer 集成实战FrankenPHP 已知问题排查指南不兼容扩展、musl 兼容性、Docker TLS 与 Composer 集成实战 本指南基于 FrankenPHP 官后端FoundationDB 平台兼容性指南CentOS/GCE、Ubuntu 与 VirtualBox 上的已知问题排查与解决FoundationDB 平台兼容性指南CentOS/GCE、Ubuntu 与 VirtualBox 上的已知问题排查与解决 FoundationDB 作为跨分布式数据库KV存储数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表