Работа с Composer (PHP)
CodeScoring.Save работает как Composer-репозиторий (тип composer) и совместим с Composer 2.x. Можно создать:
- proxy-репозиторий — кэширующий прокси к Packagist или к другому Composer-репозиторию (Private Packagist, Satis, Nexus, Artifactory, GitLab, другой Save);
- hosted-репозиторий — хранилище для внутренних пакетов компании.
Composer 1 не поддерживается.
Создание репозитория в веб-интерфейсе
-
В боковом меню выберите Projects и откройте проект.
-
Нажмите Create repository.
-
Заполните общие поля Name, Key, Description и Color — так же, как для других форматов (см. Управление репозиториями).
-
В поле Format выберите PHP / Composer.
-
В поле Type выберите Proxy или Hosted.
-
Для Proxy заполните дополнительные поля:
-
Proxy URL — адрес Composer-репозитория, по которому доступен его
packages.json: -
Cache TTL, seconds — обязательное поле: сколько секунд Save хранит полученные от upstream данные, прежде чем перепроверить их. Для Packagist подойдёт
86400(сутки). -
Authentication — как Save авторизуется в upstream. Для Packagist оставьте
none.Пароль и токен после сохранения не показываются ни в интерфейсе, ни в API: на форме редактирования сохранённое значение отображается как
********— оставьте его, чтобы не менять. Учётные данные Save отправляет только на хост из Proxy URL (подробнее — Доступ proxy-репозиториев к upstream).
-
-
Нажмите Create repository.
На странице созданного репозитория кнопка со значком «звено цепи» показывает готовые команды для подключения Composer именно к этому репозиторию.
То же самое можно сделать запросом к API. В format указывается php, учётные данные upstream передаются в блоке auth:
Для hosted-репозитория достаточно "repository_type": "hosted" без remote_url и auth.
- Архивы пакетов кэшируются при первой загрузке, следующие установки берут их из Save.
- Метаданные пакетов Save пока не кэширует и при каждом запросе спрашивает у upstream. Если upstream недоступен, Composer сможет поставить только то, что есть в его собственном кэше.
- Архивы пакетов Packagist хранятся на GitHub, поэтому Save нужен исходящий доступ к
api.github.comиcodeload.github.com. - Версии, для которых в upstream нет zip-архива (только исходный код в git), через proxy установить нельзя.
URL-схема
Все пути ниже указаны относительно адреса репозитория https://save.example.com/cs-save/php/<project>/<repository>:
Все ссылки внутри packages.json и p2/... абсолютные: Save строит их по адресу, с которым к нему пришёл клиент (с учётом заголовков X-Forwarded-Host и X-Forwarded-Proto).
Подключение Composer
Адрес репозитория имеет вид https://save.example.com/cs-save/php/<project>/<repository>. Подключите его к проекту как репозиторий типа composer и отключите packagist.org, чтобы все пакеты шли через Save:
То же самое в composer.json:
Save принимает http-basic — логин и пароль пользователя Save:
Дальше Composer работает как обычно: composer require, composer install, composer update.
Для CI/CD можно использовать robot-аккаунт: composer config http-basic.save.example.com 'sa$<robot-login>' '<api-key>'. В CI логин и пароль удобно передавать переменной окружения COMPOSER_AUTH, не сохраняя auth.json в репозитории.
Подробнее о robot-аккаунтах — в разделе Аутентификация.
По умолчанию Composer работает только по https. Для стенда без TLS выполните composer config secure-http false.
Публикация пакетов в hosted-репозиторий
В Composer нет встроенной команды публикации: обычно пакеты попадают в Packagist или Satis из git-репозитория. Приватные хранилища (Nexus, Artifactory, GitLab) вместо этого принимают zip-архив пакета по HTTP. Save принимает архив так же, как Nexus, поэтому подходят инструменты, которые умеют публиковать в Nexus.
Командой composer push
Плагин elendev/composer-push добавляет в Composer команду composer push: она собирает zip-архив из текущего проекта (без vendor/, каталогов VCS и скрытых файлов) и загружает его.
-
Установите плагин в проект пакета:
-
Укажите адрес hosted-репозитория в
composer.json: -
Логин и пароль плагин берёт из
auth.jsonдля хоста Save — тех же, что вы задали командойcomposer config http-basic...выше. -
Опубликуйте версию:
Если версия указана в
composer.json, её можно не передавать.
--src-type, --src-url и --src-ref
С этими параметрами плагин отправляет архив в другом формате, и Save ответит 400. Ссылка на исходный код в git для пакетов из Save не нужна: Composer скачивает их архивом.
Из CI без PHP
Если в CI нет PHP, загрузите архив через curl. Параметр --upload-file отправляет файл запросом PUT. Имя пакета и версия указываются в адресе:
Можно загрузить архив и на адрес самого репозитория — тогда имя и версия берутся из composer.json в архиве. Если версии в composer.json нет, передайте её параметром ?version=:
Как собрать архив
Удобнее всего — командой composer archive. Она учитывает archive.exclude и export-ignore из .gitattributes:
Подойдёт и git archive --format=zip -o acme-demo-1.0.0.zip v1.0.0. При публикации через composer push архив собирать не нужно.
Требования к пакету
Save проверяет архив до сохранения, поэтому при ошибке ничего не записывается:
- архив — zip, а
composer.jsonлежит в его корне или в одной папке верхнего уровня (как в архивах GitHub и GitLab); nameвcomposer.jsonзадан в форматеvendor/package. Если имя указано и в адресе загрузки, оно должно совпадать сcomposer.json;- версия — по правилам Composer. Её можно указать в
versionвcomposer.jsonили передать при загрузке. Если она есть в обоих местах, значения должны совпадать (v1.0.0и1.0.0считаются одной версией). Ветку со слешем в имени (dev-feature/x) загрузить нельзя; - размер архива — не больше
HOST_PHP_MAX_FILE_SIZE(по умолчанию 256 МБ), иначе Save ответит413.
Опубликованную версию нельзя перезаписать: повторная загрузка вернёт 409. Чтобы заменить версию, сначала удалите её.
Удаление версии (hosted)
Версию можно удалить в веб-интерфейсе, как любой артефакт. Есть два способа:
- отметьте артефакт флажком слева в дереве репозитория и нажмите Delete на панели, которая появится над деревом. Так можно удалить сразу несколько версий;
- нажмите на артефакт в дереве репозитория и в правой панели выберите Delete artifact в меню с тремя точками (рядом с Download).
Или через API:
Изменения сразу видны в метаданных.
Миграция URL репозитория
Сценарий использования: миграция Composer-репозитория с Nexus / Artifactory на CodeScoring.Save.
Адрес загрузки packages/upload/<vendor>/<package>/<version> совпадает с Nexus, поэтому в composer push и в скриптах публикации достаточно поменять адрес. После смены адреса выполните composer update, чтобы в composer.lock записались новые ссылки на архивы.
Устранение неполадок
Какие запросы делает Composer
Запустите Composer с ключом -vvv — он покажет каждый адрес, к которому обращается:
Все запросы должны идти на адрес Save. Если ссылки начинаются с http://, хотя Save открыт по https, проверьте, что ingress передаёт заголовки X-Forwarded-Proto и X-Forwarded-Host.
Проверка метаданных пакета
404 означает, что такого пакета нет ни в Save, ни в upstream.
