Сборка PHP-проекта в Gitlab CI с приватными зависимостями
Иногда бывает необходимо вынести часть функций в отдельную библиотеку для совместного использования с другими приватными проектами. Если она не должна быть доступна публично, то ее репозиторий так же должен быть приватным. Для того, чтобы менеджер пакетов php composer во время сборки проекта в CI мог добавить ее, он должен быть авторизован и иметь доступ в этот приватный репозиторий. Оптимальным вариантом авторизации в данной ситуации является токен, который передается из настроек гитлаба во время сборки контенейра проекта.
Создание токена
Если вам неоходимо, чтобы composer имел доступ ко всем вашим приватным репозиториями (что может быть удобно в некоторых случаях), то необходимо сгенерировать токен в настройках вашего пользователя по адресу:
https://gitlab.com/-/profile/personal_access_tokens
Если вам необходимо предоставить доступ к одному приватному репозиторию, то можно сгенерировать токен только для него. Делается это в разделе его проекта:
https://gitlab.com/user/project/-/settings/access_tokens
Работа с токеном CI
Полученный токен, необходимо сохранить в переменных окружения, в настройках СI проекта на странице:
https://gitlab.com/user/project/-/settings/ci_cd
Я сохраняю токен под именем COMPOSER_TOKEN
в настройках CI проекта в gitlab.
В файле .gitlab-ci.yml, в том месте, где происходит вызов команды сборки контейнера docker build
необходимо добавить нашу переменную в виде аргумента: --build-arg COMPOSER_TOKEN=${COMPOSER_TOKEN}
В результате команда сборки выглядит у меня как-то так:
script:
- >
docker build
--pull
--build-arg VCS_REF=$CI_COMMIT_SHA
--build-arg VCS_URL=$CI_PROJECT_URL
--file=docker/dockerfile
--tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --build-arg COMPOSER_TOKEN=${COMPOSER_TOKEN}
.
А внутри dockerfile
необходимо теперь авторизовать composer с нашим токеном, предварительно указав, что его надо принять из аргументов команды сборки. Фрагмент моего файла выглядит так:
FROM registry.gitlab.com/floor12/images:basic81
ARG COMPOSER_TOKEN
WORKDIR /app
COPY ./composer.lock ./composer.lock
COPY ./composer.json ./composer.json
RUN composer config gitlab-token.gitlab.com $COMPOSER_TOKEN
RUN composer install --prefer-dist --no-progress --no-scripts --optimize-autoloader
Таким образом, composer сначала авторизуется и уже потом сможет получить доступ к необходимому приватному репозиторию. Кроме того, надо не забыть добавить адрес репозитория в composer.json
вашего проекта, так как packagist ничего не может знать о ваших приватных проетах.
{
"name": "floor12/test",
"minimum-stability": "stable",
"require": {
"php": ">=8.0.0",
"floor12/some-private-package"
},
"repositories": [
{
"type": "composer",
"url": "https://asset-packagist.org"
},
{
"type": "git",
"url": "https://gitlab.com/floor12/some-private-package"
}
}
Если вам необходимо получить доступ к репозиотрию, который находится не на gitlab, а каком либо другом месте, то для этого можно выбрать один из встроенных в composer модулей, описанных в официальной документации composer,
Более развернутую информацию информацию по авторизации можно также найти в документации gitalb.
Надеюсь, эта информация была вам полезна.