Docker, Jenkins and Rails - настройка для запуска спецификаций в типичном стеке Rails

Я бы хотел, чтобы мастер и подчиненная установка Jenkins запускали спецификации в стандартных приложениях Rails (PostgreSQL, sidekiq/redis, RSPec, capybara-webkit, общий Rails-стек), используя докер, чтобы его можно было надеть и на другие машины, У меня есть несколько хороших стационарных машин, собирающих пыль.

  • Может ли кто-нибудь поделиться примером исполняемого файла docker jenkins rails stack?

  • Что мешает этому сделать?

Предпочтительно также установить мастер-ведомый.

Введение: После нескольких дней онлайн, следуя нескольким учебным пособиям без успеха, я собираюсь отказаться от проекта. Я получил базовое представление о докере, докер-машине, сборке докеров и томах, я получил реестр докеров для нескольких простых приложений.

Ответы

Ответ 1

Я почти ничего не знаю о Дженкинсе, но я широко использовал Docker на других платформах CI. Поэтому я просто напишу об этом. Уровень сложности будет варьироваться в зависимости от ваших зависимостей и причуд. Я попытаюсь дать схему, которая в целом полезна, и оставлять квитанции приложений для вас.

Я не думаю, что проблема, которую вы описываете, должна требовать, чтобы вы столкнулись с docker-machine. docker build и docker-compose должно быть достаточно.

Сначала вам нужно будет создать образ для своего приложения. Если ваше приложение имеет всеобъемлющий Gemfile и не слишком много зависимостей, связанных с инфраструктурой и т.д. (Например, файлы, живущие в определенных местах, которые приложение не настроено для себя), тогда у вас будет довольно простое время. Если нет, то настройка этих зависимостей будет сложной. Здесь руководство от пользователей Docker для простого приложения Rails, которое поможет вам начать.

Как только изображение будет построено, нажмите его в репозиторий, например, Docker Hub. Войдите в Docker Hub и создайте репо, затем используйте docker login и docker push <image-name>, чтобы сделать изображение доступным для других машин. Это будет важно, если вы хотите создать изображение на одной машине и проверить его на других.

Вероятно, стоит отработать задание, чтобы запускать тесты модулей приложения внутри изображения после того, как изображение построено и нажато. Это позволит вам выйти из строя раньше и не тратить драгоценное время выполнения на исправленную ошибку:)

Далее вам нужно будет удовлетворять внешним зависимостям приложения, таким как Redis и postgres. Вот где находится файл Docker Compose. Используйте его, чтобы указать все службы, которые требуются вашим приложениям, и переменные среды и т.д., Которые вы установите для запуска приложения для тестирования (например, RAILS_ENV).

Вам может показаться полезным обеспечить фальшивки некоторых несущественных сервисов, таких как кэши в памяти, или просто оставить их полностью. Это уменьшит сложность вашей настройки и будет менее требовательным к вашей системе CI.

В руководстве по приведенной выше ссылке также есть пример создания файла, но вам нужно его расширить. Самое главное отметить, что имя, которое вы даете службе (например, db в примере из руководства), используется в качестве имени хоста на изображении. Как предположил @tomwj, вы можете искать в Docker Hub для обычных изображений, таких как postgres и Redis, и находить их довольно легко. Вероятно, вам нужно настроить новую среду Rails с новыми именами хостов и так далее, чтобы правильно настроить все имена хостов службы.

Здесь вы начинаете все свои услуги с нуля, включая вашу базу данных, поэтому вам нужно будет перенести и засеять его (и любые другие хранилища данных) при каждом запуске. Поскольку вы начинаете с пустого экземпляра postgres, ожидайте, что потребуется некоторое время. В качестве ярлыка вы можете восстановить резервную копию из предыдущей версии перед ее переносом. В любом случае вам нужно будет сделать некоторую работу, чтобы ваши хранилища данных были в форме, так что ваши результаты теста предоставят вам полезную информацию.

Один из сложнейших битов будет получать Capybara для запуска внутри вашего приложения Docker изображение, которое по умолчанию не будет иметь X-дисплеев. xvfb (X Virtual Frame Buffer) может помочь в этом. Я не пробовал это, но создание поверх образа, такого как этот, может оказать некоторую помощь.

Удачи вам в этом. Если у вас есть время, чтобы продолжить работу с ним, это действительно поможет вам узнать, на что ваше приложение действительно зависит, чтобы работать. Это, безусловно, для меня и моей команды!

Ответ 2

В этом вопросе довольно много распаковывать, это руководство по началу работы и поиск помощи.

Короче там ничего не мешает, хотя он достаточно сложный и навязанный настройке. Поэтому, следовательно, нет готового решения.

Предполагая, что ваша цель состоит в создании Jenkins, развертывании в Docker, затем тестируйте приложение Rails в среде Dockerised.

  • Предоставляя стационарные машины, я бы предложил использовать роли Ansible Galaxy.
  • Настройка среды Docker, способ создания нескольких контейнеров - использовать докеры, это позволит вам открыть БД, redis, Rails и т.д., используя общедоступные изображения концентратора докеров.
  • Создайте трубопровод Дженкинс
    • Создайте изображение докеры приложений rails, это будет содержать приложение rails.
    • Развертывание приложения, это обновление приложения в рое Docker из локального реестра Docker.
    • Протестируйте, запустите тесты с запущенным сейчас приложением.

Я упустил конфигурацию master/slave Jenkins, потому что, если вы работаете только на одной машине, вы можете увеличить количество исполнителей. Например. мастер может выполнять больше заданий за счет скорости.