直接缓存vendor/目录易导致跨环境不一致、权限冲突(如root与jenkins用户切换)、composer.lock变更后行为错误;应优先缓存$home/.composer/cache,复用下载包并确保构建一致性。

为什么 vendor 目录不能直接缓存
直接缓存 vendor/ 目录看似省事,但 Jenkins 多次构建时容易因权限、用户切换或 composer.lock 变更导致解压失败或行为不一致。比如上一次构建由 root 生成的 vendor,这次 Jenkins 以 jenkins 用户运行,就会卡在 Permission denied;又或者 composer.lock 被提交了新版本,但旧缓存没清理,composer install 会跳过更新,实际依赖还是旧的。
真正稳定复用的是 Composer 下载的包本身——它们存在 $HOME/.composer/cache 里,格式统一、无权限耦合、与工作区无关。
-
$HOME/.composer/cache存的是压缩包(.zip/.tar.gz)和 dist 包 hash,每次install --prefer-dist都会优先查这里 - 该目录可跨项目、跨构建复用,只要 Jenkins agent 启动时环境变量
COMPOSER_CACHE_DIR指向同一路径 - 不需要每次构建都重下 packagist.org 的几十 MB 包,实测能减少 40–70% 安装耗时
如何在 Pipeline 中安全挂载全局 cache 目录
关键不是“缓存 vendor”,而是让所有构建共享同一个 Composer 下载缓存。最稳的方式是提前在 Jenkins agent 启动脚本中固化 COMPOSER_CACHE_DIR,再在 Pipeline 中显式引用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在 agent 机器上(如 systemd service 或 Docker entrypoint)加一行:
export COMPOSER_CACHE_DIR=/var/lib/jenkins/composer-cache - 确保该路径存在且
jenkins用户有读写权限:sudo mkdir -p /var/lib/jenkins/composer-cache && sudo chown jenkins:jenkins /var/lib/jenkins/composer-cache - Pipeline 中无需额外命令,只要调用
php composer.phar install或绝对路径的/opt/composer/bin/composer install,它就会自动用这个缓存 - 如果用 Docker agent,可在
agent { docker { args '-v /var/lib/jenkins/composer-cache:/home/jenkins/.composer/cache' } }映射进去
vendor 目录要不要缓存?什么情况下可以
极少数场景下可缓存 vendor/,但必须满足三个硬条件:lock 文件未变、PHP 版本和扩展一致、构建用户不变。否则不如不缓。
- 只建议在「快速迭代的 dev CI」中尝试,例如用
cache指令配合 lock 文件哈希做 key:cache(key: "vendor-${sh(script: 'sha256sum composer.lock | cut -d\" \" -f1', returnStdout: true).trim()}", paths: ['vendor']) - 必须前置清理:
sh 'rm -rf vendor',否则composer install可能跳过部分包 - 不能和
--no-dev混用后又在另一轮用--dev,vendor 结构会冲突 - 一旦出现
Class not found或autoload.php not found,第一反应就是清掉这个缓存,别纠结
最容易被忽略的权限和校验点
缓存本身不报错,但一跑就失败,八成是这两个地方没对齐:
- Jenkins agent 启动时用的是非交互式 shell,
~/.bashrc或/etc/profile里的export COMPOSER_CACHE_DIR=...不生效——必须写进/etc/default/jenkins或 agent 的 systemd service 文件里 - 没在 Pipeline 开头加锁文件校验:
sh 'if [ ! -f composer.lock ]; then echo "ERROR: composer.lock missing"; exit 1; fi',缺 lock 就会退化成update,缓存再快也装错版本 - 私有仓库认证没注入:
composer config --auth http-basic.your-packagist.com $USERNAME $TOKEN必须在install前执行,否则缓存里存的是 401 失败包,下次还复用失败
缓存只是加速手段,不是兜底方案。真正决定构建是否可重现的,永远是 composer.lock + 确定性 PHP 环境 + 显式路径调用。










