Конфигурация Gitlab CI с неправильным хостом или портом Laravel Docker Redis

Я работаю над конфигурацией Gitlab CI в файле .gitlab-ci.yml для проекта Laravel, который использует redis в качестве драйвера кэша. В этом файле конфигурации я использую образ, содержащий все пакеты linux и расширение php, которые используются в нашей производственной среде. Это включает расширение redis, установленное pecl, поэтому phpredis можно использовать в Laravel.

Потратив немало времени на изучение процесса непрерывной интеграции и настройки файла gitlab ci, я обнаружил следующую ошибку при развертывании образа:


In PhpRedisConnector.php line 126:

   Redis::connect() expects parameter 2 to be int, string given  

параметр должен быть только порт как int, но каким-то образом преобразован в tcp: //111.111.11.11: 6379

Как указано в документации https://docs.gitlab.com/ee/ci/services/redis.html хост в вашем .env должен быть redis, так что я. Сброс конфигурации во время развертывания привел к тому, что в порту была некоторая строка подключения tcp: //111.111.11.11: 6379, а хост был пуст. Это невозможно изменить ни в нашем приложении, ни в любом используемом нами расширении.

Я использую https://hub.docker.com/_/redis/ в качестве сервис в .gitlab-ci.yml.

...
services:
  - name: redis:4
...

person MmynameStackflow    schedule 12.03.2020    source источник


Ответы (2)


Решение найдено здесь: https://laracasts.com/discuss/channels/testing/gitlab-ci-weird-redis-host

Эта переменная нигде не задокументирована, но каким-то образом решает проблему. Добавьте в файл .gitlab-ci.yml следующее:

variables:
  REDIS_PORT: 6379

Если кто-нибудь найдет документацию по этой переменной и, возможно, другие параметры, дайте мне знать!

person MmynameStackflow    schedule 12.03.2020

Это ожидаемое поведение от Docker.

В Gitlab CI все services, которые вы определяете, будут связаны с вашим контейнером, в котором выполняется ваше задание, с использованием Система связывания Docker.

Как описано здесь, когда мы связываем контейнеры, Docker автоматически создает ENV в формате :

  • <_Псевдоним
  • ‹_Alias› _PORT
  • и некоторые другие ENVS

И эти ENV из Docker переопределят ваши.

alias здесь будет имя хоста вашего контейнера, который вы определили в services. Например, вы определяете эти службы в своем .gitlab-ci.yml:

services:
 - redis:5-alpine
 - name: mongo
   alias: db

Таким образом, Docker создаст следующие ENV соответственно:

  • REDIS_PORT = что-то выглядит так: tcp: //172.17.0.3: 6379
  • REDIS_NAME = выглядит так: / runner-72989761-project-19846207-concurrent-0-62507216079cf651-build-3 / redis
  • DB_PORT = то же, что и Redis
  • DB_NAME = то же, что и Redis

Обратите внимание, что, как описано здесь, по умолчанию следующие ENV также автоматически создаются на основе имени образа службы:

  • MONGO_PORT = ...
  • MONGO_NAME = ...

Поэтому в вашем коде, если у вас есть какая-либо переменная, имя которой совпадает с именем, создаваемым Docker, вам может потребоваться изменить имя переменной, иначе Docker переопределит ее. Или вы можете использовать решение из @MmynameStackflow выше, передать variables в файл конфигурации Gitlab CI, чтобы переопределить действия Docker.

person Duc Trung Mai    schedule 11.11.2020