jenkins 中硬写 composer config -g 无效,因 agent 环境不持久且项目级 repositories 会完全屏蔽全局配置;正确做法是每次构建前检查镜像可用性,动态写入项目级 composer.json 的 repositories 数组首项,并保留私有源、清理 lock 文件与 vendor、确保缓存路径和权限正确。

为什么硬写 composer config -g 在 Jenkins 里根本没用
因为 Jenkins agent(尤其是 Docker 或临时节点)每次构建都是全新环境,~/.composer/config.json 写进去就丢了;更关键的是,只要项目根目录的 composer.json 里有 "repositories" 字段,全局配置就会被完全忽略——连 fallback 都不触发,直接走你项目里写的源。
- agent 容器没挂载
$HOME/.composer→ 配置不持久 -
composer.json含"repositories": [...]→ 全局镜像被静默屏蔽 - 命令漏
composertype 参数或 URL 少末尾/→ 配置写入但无效,composer install还是连packagist.org
必须在 Pipeline 里动态探测并写入项目级镜像
核心逻辑不是“配一次”,而是“每次构建前检查镜像是否可用,再写进项目级配置”。所有操作都在项目根目录下进行,绕过全局配置失效问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
curl -I -s -o /dev/null -w "%{http_code}" https://mirrors.aliyun.com/composer/packages.json检查阿里源是否返回200 - 失败则 fallback 到
https://packagist.org,并确保"packagist.org": true(不是false) - 执行
composer config repo.packagist composer $MIRROR_URL/—— 注意不加-g,且 URL 必须带结尾/ - 删掉
vendor/和composer.lock(否则 Composer 会沿用旧 lock 文件里的 dist URL)
保留私有源时千万别用 composer config repo.packagist
这条命令会清空整个 repositories 数组,导致你原本定义的私有 Git 包(比如 "my-vcs": {"type": "vcs", "url": "https://git.internal/pkg"})彻底无法解析。
- 手动编辑
composer.json,把镜像源作为repositories数组第一个元素 - 私有源跟在后面,顺序不能错
- 显式加
{"packagist.org": false}作为独立对象,和镜像对象并列,不要嵌套 - 示例结构:
[{"type":"composer","url":"https://mirrors.aliyun.com/composer/"},{"type":"vcs","url":"https://git.internal/pkg"},{"packagist.org":false}]
路径、权限、缓存三者不对齐,镜像再快也白搭
即使镜像配置全对,Jenkins 构建仍可能卡在 Resolving dependencies 或报 Allowed memory size exhausted——问题往往出在环境层面。
- 别裸写
composer install:显式调用绝对路径,如/opt/composer/bin/composer install - 设
HOME=/var/lib/jenkins,否则auth.json找不到、~/.composer/cache不生效 - 私有包认证用项目级
./auth.json并chmod 600,配合--auth-file=./auth.json - 缓存
$HOME/.composer/cache目录(不是vendor),避免重复下载
repositories 数组结构、composer.lock 清理这三点,任何一个出错都会让镜像配置变成摆设——它不会报错,只是悄悄失效。










