Jenkins Pipeline 中 composer clear-cache 并发失败是因为多个 Job 共享同一 COMPOSER_HOME 缓存目录,导致 clear-cache 的非原子文件操作(遍历删除 repo/、http/ 等子目录)引发 IO 冲突、文件锁定或缓存损坏;根本解法是为每个 Job 隔离缓存路径,如通过设置 COMPOSER_CACHE_DIR="${WORKSPACE}/.composer-cache" 实现独享缓存,彻底规避竞态条件。

Jenkins Pipeline 中 composer clear-cache 为什么会并发失败
多个 Pipeline Job 共享同一工作空间(比如挂载了相同的 /workspace 或 COMPOSER_HOME),而 composer clear-cache 默认操作的是全局缓存目录(~/.composer/cache 或 %APPDATA%ComposerCache)。一旦两个 Job 同时执行该命令,就会出现文件被另一个进程锁定、删除中又被写入、或 Corrupted cache file 报错——这不是 Composer bug,是共享缓存目录天然的竞态条件。
共享缓存目录下 clear-cache 的实际行为
composer clear-cache 并非原子操作:它先遍历 repo/、files/、vcs/、http/ 四个子目录,逐个 unlink 或 rmdir。若 A Job 刚删完 repo/,B Job 正在读 http/ 下的缓存并尝试写入新响应,就会触发 IO 冲突或残留锁文件。
- Linux/macOS 下常见报错:
Permission denied、Directory not empty、Failed to remove directory - Windows 下更频繁:
Access is denied(因 cmd 进程未释放句柄)或The process cannot access the file because it is being used by another process - 即使命令返回
All caches cleared.,也可能只清了一半——vcs/目录常因大体积 Git 裸仓库卡住,后续 Job 仍会复用损坏的 clone
真正安全的并发清理方案
根本解法不是“让 clear-cache 更可靠”,而是**避免共享缓存目录**。Jenkins Pipeline 必须为每个 Job 隔离 Composer 缓存路径:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
pipeline的environment块中设置:COMPOSER_CACHE_DIR = "${WORKSPACE}/.composer-cache"(Linux/macOS)或COMPOSER_CACHE_DIR = "%WORKSPACE%\.composer-cache"(Windows) - 确保所有
composer命令都基于该路径运行,例如:composer clear-cache --no-interaction就只会删当前 Job 自己的缓存 - 配合
rm -rf vendor(Linux/macOS)或rmdir /s /q vendor(Windows),彻底切断跨 Job 的缓存复用链 - 不要依赖
post-install-cmd脚本——Jenkins 默认用--no-scripts,这些钩子根本不会触发
为什么不能靠 --no-interaction 解决并发问题
--no-interaction 只解决交互阻塞(比如确认提示),不解决文件系统级竞争。即使加了这个参数,两个 Job 依然会同时打开、遍历、删除同一组缓存文件。实测表明,在高并发构建中,仅加 --no-interaction 的 composer clear-cache 失败率仍超 40%,尤其当 vcs/ 目录存在多个 >500MB 的裸仓库时。
真正起作用的是路径隔离——每个 Job 拥有独立缓存目录后,clear-cache 就退化为一个普通目录清理操作,不再涉及跨进程资源争抢。这点容易被忽略,但恰恰是 Jenkins 场景下最硬性的前提。

















