应复用 $HOME/.composer/cache 而非 vendor/ 目录,因其稳定、跨项目且无权限与环境耦合问题;需挂载共享缓存路径并动态配置项目级镜像源。

直接缓存 vendor/ 目录是错的,它会因权限、用户切换或 composer.lock 变更导致构建失败;真正该复用的是 $HOME/.composer/cache 里的压缩包和 dist hash,这才是稳定、跨项目、无副作用的缓存方式。
为什么 vendor/ 不能当缓存用
每次构建都保留 vendor/ 看似省事,但 Jenkins agent 用户(如 jenkins)和上一次构建者(比如 root)不一致时,Permission denied 就卡住;composer.lock 提交了新版本,旧 vendor/ 却没清理,composer install 会跳过更新,实际依赖还是旧的。
-
vendor/是构建产物,含 PHP 扩展兼容性、autoloader 生成路径等环境强耦合信息 - 不同 PHP 版本或
opcache.enable=1等配置下,vendor/不可直接复用 - 哪怕只改一行
composer.json,vendor/也必须重建,缓存失效率极高
怎么让 $HOME/.composer/cache 真正生效
关键不是“加 cache 指令”,而是确保所有构建共享同一物理路径,并由 Jenkins 用户可读写。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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 - 手动创建并授权:
sudo mkdir -p /var/lib/jenkins/composer-cache && sudo chown jenkins:jenkins /var/lib/jenkins/composer-cache - 若用 Docker agent,在
agent { docker { args '-v /var/lib/jenkins/composer-cache:/home/jenkins/.composer/cache' } }中挂载 - Pipeline 中无需额外命令,只要调用
/opt/composer/bin/composer install或php composer.phar install就自动命中缓存
镜像配置和缓存必须配合才有效
镜像源再快,如果缓存路径不对或没挂载,Composer 还是会重下包——而且默认缓存位置是 ~/.composer/cache,不是项目目录下的临时路径。
- 别信
composer config -g repo.packagist:Docker agent 每次重启,~/.composer/config.json就丢,且会被项目级repositories字段静默屏蔽 - 正确做法是在 Pipeline 开头动态探测镜像可用性:
curl -I -s -o /dev/null -w "%{http_code}" https://mirrors.aliyun.com/composer/packages.json - 探测成功后,用
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(注意不加-g,URL 必须带结尾/)写入项目级配置 - 务必删掉
composer.lock和vendor/再执行install,否则 Composer 会沿用 lock 文件里旧源的 dist URL,绕过你刚设的镜像
最易被忽略的点:缓存路径和镜像配置不在同一作用域。挂载了 /var/lib/jenkins/composer-cache,却还在用 composer config -g 往容器内 /home/jenkins/.composer/config.json 写——而这个路径根本没挂载,配置白写,缓存也白挂。

















