Евгений Горяев
Разработка, поддержка и развитие сайтов

Сборка PHP-проекта в Gitlab CI с приватными зависимостями

Обложка для статьи Сборка 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.

Надеюсь, эта информация была вам полезна.