Для кого: PHP-команды на удалённом Mac с GitLab Runner и Composer через границу сети. Здесь: матрица Packagist/зеркала/приватный registry, composer config, GitLab (parallel, прокси, backoff), COMPOSER_CACHE_DIR, FAQ. Ссылки: главная, блог, Gradle/Maven CI, стабильность pull, зеркала Git/npm.

Сценарии и узкие места: трансграничный pull, аутентификация и целостность lock

На раннере в другом регионе узкое место — RTT к Packagist и CDN: много параллельных HTTPS, один обрыв запускает лавину повторов.

  • Прокси: HTTPS_PROXY без NO_PROXY для GitLab Registry ломает приватный …/packages/composer/, кажется «медленным Packagist».
  • Auth: просроченный token или неверный хост в COMPOSER_AUTH401 после успешных публичных пакетов.
  • Lock: update на зеркале A и CI на Packagist B меняет content-hash; общий кеш без сброса после смены зеркала даёт битые zip.

Решение: один утверждённый источник метаданных, изолированный кеш на pipeline, лимит параллельных HTTP и матрицы.

Packagist, региональное зеркало и корпоративный simple: цепочка и исполняемые composer config

Примеры для глобального config раннера; в Docker job лучше project-local config или переменные в .gitlab-ci.yml.

Роль в цепочке Типовой endpoint Команда (пример) Заметка для CI на Mac
Канонический Packagist https://repo.packagist.org composer config -g repos.packagist composer https://repo.packagist.org Базовая линия; следите за rate limit при многих воркерах.
Региональное зеркало (пример КНР) https://mirrors.aliyun.com/composer/ composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/ Комплаенс; после смены URL — новый подкаталог кеша.
Satis / Nexus Composer https://composer.corp.example composer config repositories.corp composer https://composer.corp.example Приватные репозитории выше публичного в composer.json.
GitLab Registry https://gitlab.com/api/v4/group/ID/-/packages/composer/ composer config repositories.gitlab composer "https://gitlab.com/api/v4/group/ID/-/packages/composer/" Self-managed хост, group id; токен в COMPOSER_AUTH.
export COMPOSER_NO_INTERACTION=1
export COMPOSER_ALLOW_SUPERUSER=1
composer config -g process-timeout 2000
composer config -g github-protocols https ssh
# Пример аутентификации GitLab (токен из CI Variables, маскированный):
# export COMPOSER_AUTH='{"gitlab-token":{"gitlab.com":"'"$CI_JOB_TOKEN"'"}}'

Зафиксируйте порядок repositories в репо; случайные локальные override ломают согласованность lock.

Параллель с GitLab CI: воркфлоу, HTTP-прокси и чеклист повторов с backoff

Параметр / механизм Назначение Стартовое значение на общем Mac
parallel:matrix / несколько job Несколько версий PHP или наборов флагов Лимит concurrent на runner, иначе зеркало получит шторм запросов.
resource_group Серия записи в общий том Например composer-$CI_PROJECT_ID.
HTTPS_PROXY / NO_PROXY Прокси и прямой GitLab NO_PROXY для хоста registry обязателен.
COMPOSER_MAX_PARALLEL_HTTP Потолок загрузок Старт 612 на слабом канале.
Повторы 502 / обрыв До 3× composer install, паузы 2 / 4 / 8 с.
variables:
  COMPOSER_CACHE_DIR: "$CI_PROJECT_DIR/.composer-cache"
  COMPOSER_NO_INTERACTION: "1"

cache:
  key:
    files:
      - composer.lock
    prefix: "${CI_JOB_NAME}"
  paths:
    - .composer-cache/

php-install:
  script:
    - for delay in 2 4 8; do composer install --prefer-dist --no-progress && break; sleep $delay; done

См. FAQ пула Mac при общем диске с Git/Docker.

Удалённый Mac: каталог кеша, COMPOSER_CACHE_DIR и ключи кеша GitLab

Каталог / переменная Пример Рекомендация
COMPOSER_HOME export COMPOSER_HOME="$HOME/.composer-ci" Отдельно от интерактивного home раннера.
COMPOSER_CACHE_DIR $CI_PROJECT_DIR/.composer-cache Предпочтительно NVMe, не сетевой том без политики блокировок.
cache:key composer.lock + CI_JOB_NAME При смене зеркала добавьте суффикс источника.
Очистка composer clear-cache После сбоя — каталог job, не весь глобальный кеш.

Пять шагов: от политики зеркал до зелёного pipeline

1
Источник метаданных. Один Packagist endpoint для основной ветки, composer.lock в VCS.
2
Приватные репо. URL GitLab в composer.json; токены только из CI Variables.
3
Прокси. HTTPS_PROXY, NO_PROXY, process-timeout для больших dist.
4
Кеш. COMPOSER_CACHE_DIR в workspace, GitLab cache с ключом от lock.
5
Параллелизм и повторы. Лимит COMPOSER_MAX_PARALLEL_HTTP и матрицы; backoff 2/4/8 с.

Три опорных факта для дизайн-дока

2000 с для process-timeout — разумный потолок для крупных dist на трансокеанском канале до оптимизации зеркала.

6–12 одновременных HTTP от Composer на общем раннере часто стабильнее максимума по умолчанию при пиках нескольких проектов.

Ключ кеша от composer.lock обязателен: иначе job переиспользует файлы от другой ветки и получает скрытые расхождения версий.

FAQ: 401, rate limit и ошибки проверки хеша

401. Токен, хост в COMPOSER_AUTH, scope; для fork — доступ к registry группы.

429. Меньше COMPOSER_MAX_PARALLEL_HTTP и одновременных pipeline; Satis/прокси; Retry-After.

Хеш / content-hash. Сброс кеша job, lock на том же зеркале, избегать лишнего --prefer-source.

Итог

Итог для 2026: один маршрут к Packagist, отдельный GitLab registry для приватных пакетов, изолированный кеш, лимит параллельных HTTP и повторы с backoff — стабильнее lock и меньше хвостов задержек.

Дальше без входа: главная MacPull, тарифы, покупка удалённого Mac, центр помощи.

Нужен выделенный узел Apple Silicon под GitLab Runner и стабильный диск под кеш Composer — выберите конфигурацию на сайте и продолжите чтение смежных материалов в блоге.

Удалённый Mac для PHP и Composer CI

Узлы под GitLab Runner, SSH и предсказуемый NVMe для кеша. Главная, покупка и помощь доступны без обязательного логина.