Рубрики
Uncategorized

Компакт -диск с Docker и функциями филиала

Автор: Бен Мартин Если вы следили за моей серией Docker (вы можете найти мою последнюю статью … Tagged с DevOps, Docker, AWS, JavaScript.

По: Бен Мартин

Если вы следили за моей серией Docker (вы можете найти моя последняя статья о непрерывной интеграции (CI) здесь ), то вы должны быть очень рады, что ваше решение CI Pipelining все Проблемы мира. Ваши разработчики довольно довольны, но мы знаем, что мы могли бы сделать больше. И я имею в виду, не разработчик счастье Реал Причина, по которой вы читаете статью DevOps?

В этой статье я расскажу о том, как вы можете сделать трубопровод CI на шаг вперед, чтобы рассмотреть аспект CICD непрерывного развертывания (CD). Более конкретно, мы рассмотрим, как можно настроить Особенность филиала специфично Развертывание нашего приложения, чтобы быстро и легко проверить свои функции, даже на мобильных устройствах, прежде чем объединить их филиал PR в филиал.

Предварительные знания

Если вы не следили за Мои предыдущие статьи Чтобы получить максимальную отдачу от этой статьи, вы должны сначала получить приложение. Если у вас также настроен конвейер Circleci, это огромный старт! Мы будем строить это. В нашей гипотетической ситуации мы используем экземпляр AWS EC2 из свободного уровня в AWS. Если вы новичок в AWS, это можно легко заменить другими технологиями. Потребуется только сервер для развертывания. В прошлом я использовал цифровой каплей в океане за 5 долларов для достижения того же эффекта, но вы должны определить, где вы хотите развернуть.

Вот что вам нужно:

  • Аккаунт AWS с экземпляром EC2, настроенным для разоблачения портов 22, 80 и 443 и ключа SSH для Circleci для использования
  • Исходный код приложения Dockerized, размещенного на GitHub
  • Docker Hub (или какой -то другой репозиторий изображения Docker, в который вы можете опубликовать)
  • Circleci подключено к репо вашему приложению и вашему Docker Hub Repo
  • Доменное имя, указывающее на ваш сервер
  • Сертификат Wildcard TLS для вышеуказанного доменного имени

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

Цель: быстрая обратная связь

Как огромный сторонник методологий гибкой разработки, быстрая обратная связь имеет решающее значение для успеха, и чем более высокая точность обратная связь, тем лучше! Модульные тесты и сквозные тесты имеют свое место. Но, когда человеческие глаза обзорные изменения пользовательского интерфейса, работающие в производственной среде в браузере, помогают нам определить ошибки, прежде чем они станут проблемой, которая может повлиять на другие команды.

Почему я должен беспокоиться?

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

Звучит достаточно просто, мне просто нужно было развернуть свой код где -то, где я мог бы получить доступ с моего устройства. Но этот процесс должен был быть автоматизирован.

Я решил использовать свой существующий трубопровод CI и расширить его для выполнения непрерывных развертываний (CD). Мой конвейер CI уже был настроен для запуска моих модульных тестов и сквозных тестов, но я хотел также развернуть свой код на сервере, к которому я мог бы получить доступ с моего телефона для ручного тестирования.

Вот несколько ключевых соображений для расширения этого конвейера CI/CD.

Особенности филиала

Если вы работали над предприятием WebApp, вы можете быть знакомы с такими терминами девчонка , int (egration) и Постановка Анкет Как правило, это среды, где находятся разные состояния нашего приложения. Каждая из этих среда предназначена для размещения различных состояний вашего приложения, будь то филиал, активно разрабатывая, ваш следующий релиз или последний выпуск, который вы все еще поддерживаете с помощью исправлений ошибок.

Что часто теряется в миксе, так это наш функция ветви. Когда наши разработчики заберут билет, они могут активно проверить свой код на наборе устройств, чтобы обеспечить совместимость с перекрестным устройством и браузером. Кроме того, наличие этого требования для наших разработчиков выступает в качестве дополнительной гарантии для предотвращения попадания ошибок в Разработать филиал нашего кода.

Если вы когда -нибудь просили своего босса о Среда специфики от филиала , вы вполне могли быть издевались на претензии «В бюджете нет места» Анкет Что ж, что, если я скажу вам, что благодаря мощности Docker и свободного уровня на AWS (или существующий сервер, который у вас может иметь), вы можете иметь специфические для филиала среды за пределами девчонка , int и Постановка Анкет

Docker на помощь!

Docker — идеальный инструмент для решения этой проблемы по нескольким причинам. Чтобы понять почему, подумайте, что будет сложно для запуска нескольких копий нашего приложения в одной и той же среде. Ну, даже если мы представляем статический сайт, есть много, чтобы покрыть. Когда мы развертываем наше приложение, в какую папку мы его развернете? Как мы справляемся с столкновениями портов? Загрузка активов с относительными URL? Как мы уведомим Nginx о новом маршруте/сайте? Существует много конфигурации и беспорядков, которые вступают в то, чтобы делать это непосредственно на хост -машине, которую мы можем делегировать в Docker, чтобы справиться с нами.

В конце концов, у нас будет длинный прокси -прокси -сервер, работающий в контейнере на нашей хост -машине. Этот контейнер будет слушать Docker для других контейнеров, которые мы запускаем. Использование переменных среды в Docker Run Команда, мы сможем сообщить этому прокси Nginx обновить конфигурацию в отношении динамических субдоменов точек в наших контейнерах, специфичных для ветвей функций.

Docker с Nginx

Большая часть тяжелой работы осуществляется с прокси -контейнером Nginx. Я нашел Отличный прокси -сервер NGINX на GitHub Чтобы помочь в этом процессе. Что полезно в этом изображении Docker, так это то, что, как только вы его запустите, оно прослушает ваш другой Docker Команды, которые запускаются на хост -машине, в частности, на вашем Docker Run командование В частности, он будет искать переменные среды, прикрепленные к вашему Docker Run Команда интерпретировать, как обновить внутреннюю конфигурацию и указать ее на контейнер вашего приложения, который запускается.

Это обратное прокси -изображение должно работать в контейнере на вашем сервере. Роль этого контейнера состоит в том, чтобы прослушать другие команды Docker, которые вы запускаете, и автоматически обновлять конфигурацию NGINX в этом контейнере с обратным прокси.

Передача входов в ваш Docker Run

После того, как в контейнере Docker вы получите прокси Nginx, вы можете использовать свой конвейер CI (например, Circleci), чтобы получить переменные среды, необходимые для передачи на ваш сервер в Docker Run командование Просто убедитесь, что Circleci разрешено получить доступ к вашему серверу через SSH. Безопасный способ сделать это — использование клавиш SSH. Генерировать ключ и Предоставьте личный ключ для Circleci Анкет

Затем добавьте открытый ключ в ~/.ssh/adured_keys вашего сервера. Оттуда сделайте сценарий Bash для управления вашими контейнерами для конкретных филиалов.

Circleci раскрывает ряд переменных среды К вашему трубопроводу, который вы можете использовать в своей работе, чтобы перейти к своему сценарию.

В моем случае я использовал Circleci для запуска SCP Чтобы скопировать сценарий развертывания на сервер тестирования. Как только файл Bash будет, он будет выполнен с аргументами, чтобы сказать ему, какой поддомен использовать для этого контейнера. Я использовал дезинфицированную версию названия ветви. Например, Функция/ABC-42-MY FACTURE становится feature_abc-42-my-feature.myexampledomain.com Этот субдомен также будет псевдонимом для контейнера, что позволит моему скрипту остановить бегущий контейнер с устаревшим кодом, когда появляются новые коммиты в эту конкретную ветку.

Вот пример команды Run из моего скрипта развертывания, которая предоставляет переменные среды ( virtual_host , virtual_proto и Virtual_port ) ожидается обратным прокси -контейнером Nginx. Контейнер Nginx прослушивает процесс Docker на вашем хост -машине. Когда он видит Docker Run Команда, он также ищет эти три переменные среды. Если он увидит их в команде, это обновит конфигурацию Nginx, чтобы указать виртуальный хост на контейнер, который запускается. Это команда, которая будет выполнена на хост -машине для развертывания. Эти переменные среды определены в трубопроводе CI.

docker run --expose 443 -e VIRTUAL_HOST=${URL_SUBDOMAIN}.myexampledomain.com -e VIRTUAL_PROTO=https -e VIRTUAL_PORT=443 -d --rm=true --name ${CONTAINER_NAME} ${DOCKER_IMAGE}

Переменные среды, которые я использую здесь, устанавливаются внутри моего скрипта Bash, чтобы убедиться, что я вытаскиваю правильное изображение, примените правильное имя в контейнер и назначаю URL, порт и протокол. Собрав его вместе, мы можем добавить «задание» в нашу конфигурацию Circleci, подселенную как развернуть Анкет Это развертывание будет выглядеть примерно так.

scp deploy-${IMAGE_NAME}.sh ${PROD_SERVER_USER}@${PROD_SERVER_HOST}:/root/
ssh -o StrictHostKeyChecking=no ${PROD_SERVER_USER}@${PROD_SERVER_HOST} "/bin/bash /root/deploy-${IMAGE_NAME}.sh $IMAGE_NAME:$TAG ${URL_SUBDOMAIN}"

Примечание: Prod_server_user и Prod_server_host установлены в .circleci/config.yml файл

Примечание: $ Image_name: $ Tag и $ {Url_subdomain} передаются в качестве аргументов для сценария развертывания и используются в нашем Docker Run команда выше.

В файле BASH важно убедиться, что нет контейнера, работающего с тем же именем. Сначала его следует остановить и удалить.

Примечание: В моем случае, поскольку я использовал HTTPS, чтобы получить доступ к камере мобильного устройства, мне нужно было настроить TLS с доменом подстановочного знака, чтобы я мог добавить субдомены на лету и при этом иметь поддержку TLS.

Полученные результаты

Теперь, в любое время, когда этот репозиторий получает обновления в одну из филиалов функций, этот код (при условии, что он передает все шаги, определенные в нашем конвейере CICD до развертывания) будет развернут на нашем сервере тестирования на пользовательском субдомене.

В своем проекте я взял название филиала, продезинфицировал его, удалив любых специальных символов и использовал его в качестве своего поддомена. Итак, когда я подталкиваю к своей ветви под названием Функция/Мобильный вид , Я мог видеть свои изменения, посетив этот субдомен: https://feature_mobile-view.myexampledomain.com Анкет

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

Дальнейшие улучшения

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

Https

Хотя мы здесь не копались, удобно добавить сертификат TLS с подстановочным знаком на сервер, который вы запускаете. Вы также можете посмотреть на https://github.com/jrcs/docker-letsencrypt-nginx-proxy-companion Чтобы увидеть, как люди объединили отдельный контейнер, чтобы автоматически генерировать сертификаты для контейнеров Docker. Подобно изображению, которое мы использовали для прокси, этот также будет слушать ваш Docker Run Команды для переменных среды для автоматизации этого процесса.

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

Другая альтернатива — поставить это решение за балансировщиком нагрузки (ALB) при приложении через AWS. Обратите внимание на то, какие услуги совместимы с бесплатным уровнем новых счетов AWS. В противном случае будьте предупреждены, что будут затраты на то, чтобы выяснить решение.

nginx Перезапуск

В случае разбиваемого контейнера Nginx Proxy вы захотите определить, какова ваша политика перезапуска. Простое дополнение — добавить --переоборудовать, если не остановилось к Docker Run Команда для вашего обратного прокси Nginx. Но вам также нужно подумать, перезагружается ли сервер. Есть много инструментов, которые можно использовать для управления начальными контейнерами на загрузке. Даже просто Systemd, чтобы превратить его в услугу, будет соответствовать этим требованиям.

Сценарий развертывания

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

Конфигурация AWS EC2

Есть много, что можно сказать здесь от безопасности до управления ресурсами и автоматизации конфигурации. Некоторые вещи, которые вы хотите запомнить, всегда начинаются с наименьшего количества разрешений и добавлять больше по мере необходимости. Если вы используете EC2, используйте пользовательский скрипт для вашего экземпляра AWS, чтобы убедиться, что ваш сервер полностью настроен и имеет все услуги, работающие, чтобы гарантировать, что Nginx-Proxy остается в сети. Напишите сценарии Cron, чтобы автоматически удалить контейнеры, которые были в сети дольше, чем дни «X». Если появится новый коммит в конкретной ветви, этот контейнер будет обновлен. Старые контейнеры, вероятно, будут представлять филиалы функций, которые были объединены.

Говоря о которых…

Github Webhooks

Настройка Webhooks для пинга вашего сервера, когда филиал объединяется или удаляется, будет еще одним способом, чтобы у вас не было слишком много неактивных контейнеров на вашем сервере.

Вывод

Надеемся, что это дает вам представление о том, что необходимо учитывать при обновлении вашего CICD -конвейера для поддержки конкретных средств филиалов и насколько он может быть. Просто запомните цель: быстрая обратная связь.

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

Оригинал: «https://dev.to/rangle/cd-with-docker-and-feature-branch-testing-110h»