Рубрики
Uncategorized

Web Development С царапин: Инфраструктура и процесс разработки CI / CD

Руководящие принципы для недавно сформированной команды по созданию инфраструктуры и разработки CI / CD … Помечено DevOps, WebDev, Management, Automation.

Руководящие принципы для недавно сформированной команды по созданию инфраструктуры и разработки CI/CD

Это английская версия Статья Отказ Благодаря Аккарин Действительно

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

  • Каждая ветка была проверена локально. Нам пришлось откатить изменения с предыдущей проверки в базе данных, построить передний конец. Когда несколько разработчиков собирались завершить свою работу, которая должна быть проверена на небольшие детали, она превратилась в живой аду;
  • Среда Production And Dev (Development) были разными, что привело к этому типу ошибок: «Работает на моей машине».

Мой внутренний перфекционист был отчаянным, чтобы все организовать все правильно. Здесь я делюсь результатами моего поиска ответа на вопрос: «Что на самом деле является правильным способом»?

Наши достижения:

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

Эта статья будет полезна, если:

  • Вы молодая компания IT, или это ваша первая командная работа в большом проекте;
  • Вы хотите принести свой старый рабочий процесс разработки в курсе;
  • Вы ищете лучшие практики и хотите посмотреть, как делают другие;
  • Вы часто встречаетесь со статьями о DEVOPS, CI/CD, облака; Хотите создать тестовые среды на прикосновении кнопки и убедитесь, что каждое следующее обновление производства не русская рулетка.

Ты найдешь:

  • Типичный рабочий процесс от задачи для выпуска;
  • Решение инфраструктуры для создания любого современного процесса разработки с использованием минимального количества инструментов;
  • Пример для общего случая: разработка веб-приложений.

Статья состоит из трех частей:

  • мое видение типичного процесса развития;
  • инфраструктура для реализации любого современного рабочего процесса;
  • случай для веб-разработки.

При поиске лучших практик я наткнулся на много теории по методологиям, различным инструментам, но информация была разбросана. Не было ничего, что показало один процесс с точки зрения менеджера, разработчика и системного администратора (à la devops). Например, эти статьи с Аннотация Обсуждения На процесс разработки оставьте без ответа вопросов: «Ну, хорошо. И какие инструменты я должен использовать для этого?

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

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

И хотя я получил этот опыт уже год назад, Google показывает, что руководство, что я искал один раз, еще не появился.

Итак, давайте начнем.

Тебе понадобится:

  • Некоторые вычислительные возможности в вашем распоряжении. Возможно ваш собственный сервер или облачная инфраструктура;
  • Понимание вашего приложения: как это работает, как он развернут на данный момент;
  • Базовые знания сетей, Git, Linux, Docker, Gitlab, Traefik.

Обязательные компоненты

1. Работа с классической моделью в Git

Успешная модель ветвления GIT от Vincent Driessen

Требуемый минимум — иметь следующие ветви: Мастер, Dev и характерная черта .

Особенность Каждый особенность Филиал создан для работы над индивидуальной функцией/Begfix, он отделен от dev ветвь. Они удаляются после того, как изменения будут объединены в дев .

Dev В dev , окончательное совместное отладку и тестирование всех новых изменений происходит, после чего выпуск развернут на Мастер Отказ

Мастер Выпуск на производственный сервер развернут из этой ветви. Кроме того, если вам нужно применить срочные исправления, Исправление Ветви разветвляются от мастера, затем объединились в него и удалили. Мастер и dev защищены от прямых толкателей, они являются постоянными ветвями.

2. Сотрудничество в трекере задач. Сохранение записей всех принятых решений

Это очень важно. При переключении между несколькими функциональными ветвями программисты теряют контекст буквально на следующий день. Создание с низкой приоритетной задачей, такую как «Проверьте, что не так с XXX», не достаточно, чтобы вспомнить, о чем это происходит. Все комментарии должны быть записаны в обсуждениях запроса слияния потока. Необходимо поддерживать проект Wiki для ускорения адаптации новых членов команды и утверждает принятые решения.

Вы всегда должны помнить, что если что-то не записано, он не существует.

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

3. Автоматизация инфраструктуры для тестирования и релизов

Это просто — тем быстрее вы можете принести свои решения в производство, тем более надежными они есть и более конкурентное преимущество. Можно часто встречаться с статьями, где измеряется количество выпусков в месяц/неделю/день.

Я считаю, что это образный дежопт и был катализатором для развития всех современных ИТ-гигантов. Во-первых, они автоматизировали процесс тестирования и выкатывают их монолит. Но проблема ожидания и невозможности развертывания окружающей среды для развития локально появилась. Решением было введение архитектуры микросервиса, которая принесла новые задачи. Где-то на данный момент, контейнеризация (LXC) появилась, затем пришел докер, оркестраторы, и он подпирался от этого …

Функциональные роли

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

Руководитель проекта

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

Владелец продукта

Человек с этой ролью имеет общее видение продукта и знает, что он должен стать, то, что он приносит клиенту. Он является сопровождением отставания продукта (список задач), приоритеты к задачам, знают обо всех функциях продукта, включая техническую сторону в определенную степень. Должен иметь опыт развития. Это человек, который должен сказать, что «команда нужна больше людей» и защищает команду от управления давлением.

Аналитик/Технический писатель

Этот член команды всегда рядом с конечным пользователем продукта, изучает бизнес-процессы клиента, собирает обратную связь после реализации каждой функции. Аналитик/Технический писатель можно назвать «поставщиком информации владельца продукта», они помогают сформировать технические требования. Они также должны знать обо всех функциях продукта. Этот человек участвует в клиентской подготовке и письменной документации для клиента.

Designer UI/UX

Дизайнер несет ответственность за удобство продукта. Это критический элемент успеха (если, конечно, вы Microsoft)

Архитектор

Этот член команды, вероятно, работает более чем на один проект. Архитектор — самый опытный разработчик в компании. Архитектор консультируйтесь с руководством команды.

Руководитель группы

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

Разработчик

Этот человек пишет и документирует код; Выполняет коду отзывы коллег.

Разработчики специализируются на своих областях: Backend, Frontend, Mobile Development и т. Д., В зависимости от проекта.

Тестер (Qa/qc)

Контроль качества (QC) тестирует продукт. Как вручную, так и путем кодирования. Тестер по обеспечению качества (QA) также принимает участие в разработке архитектуры и инфраструктуры проекта, чтобы обеспечить, чтобы фокус на качественного результата встроен в производственный процесс ( Toyota Way — Например, тестируйте ровно изображение докера, которое будет выпущено на производство, вместо того, чтобы восстановить его после испытаний.

Системный администратор (DEVOPS)

Как и архитектор, член команды, вероятно, работает над несколькими проектами. Они создают инфраструктуру в начале проекта, вносит изменения, поскольку она развивается.

Информационная безопасность

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

Процесс развития

Этапы рабочего процесса

  1. Любая задача начинается с необходимости какого-либо улучшения (функции) или отчета об ошибках, который отправляется владельцу продукта. Он записан в трекере.
  2. Владелец продукта самостоятельно или с помощью аналитика обнаруживает все детали. Все написано в задачу. Проведена начальная оценка времени работы. Приоритеты установлены, и задача, вероятно, добавляется в график управления проектами.
  3. Когда пришло время реализации, задача разлагается (разделен на подзадаки) вместе с руководством команды, исполнители определяются вместе, которые они прогуляются по заданию, а описания внедрения, достаточные для исполнителей. Если вам нужны разъяснения к задаче, поговорите с владельцем продукта.
  4. Функциональная ветвь создана из разработки, и код написан. Если задача большая и состоит из многих подзадач, то выбрана основная функциональная ветвь, в которую объединены ветви подзадаки. Тесты написаны, если такое решение было принято для этой задачи.

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

  5. Создан слияние запроса на DEV-филиал , функциональная ветвь построена, протестирована и развернута.

  6. Другие разработчики просмотрите код, выполняется ручное тестирование. Если есть какие-либо дефекты, автоматические тесты снова запущены, ветвь развернута и перезаписана.

  7. Уведомление команды делает окончательную проверку и занимает готовую функцию ветви для разработки.

  8. Когда пришло время для следующего выпуска, запрос слияния создан из DEV-филиала со всеми последними изменениями в мастере и одинаковых действиях, что и в точках 5, 6.

  9. Как и в пункте 7, владелец продукта может быть задействован.

  10. Очень полезно, чтобы пользователи знали, какие изменения были введены (создание изменений), а также для обновления помощи продукта. Обновите документацию и принимайте изменения в Master.

  11. Изменения автоматически развернуты для производства или вручную.

  12. Приложение контролируется. Это не покрыто в этой статье.

При выборе инструментов использовались следующие критерии:

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

В конце концов, были выбраны следующие технологии: Трафик , Gitlab и Докер Отказ

  • Используются три сервера: [Производство] , [Постановка] и [Услуги] Отказ Они могут быть либо физическими или виртуальными машинами, их количество может быть выше или ниже, или все может быть сохранено в облаке. Здесь наиболее эффективная конфигурация приведена в терминах соотношения цен/цен. Главное, что [Производство] должен быть отдельный и самый надежный. Gitlab , а также минорные услуги (мониторинг, реестр Docker: Портанник, лось, гавань и т. Д.), Что мы будем звонить в услуги, установлены на [Услуги] сервер. Их конфигурация не покрыта в этом примере. Все приложения работают в докеренных контейнерах. Лучше установить Gitlab Отдельно, но это зависит от имеющихся емкостей.

  • Traefik собирает информацию о разных средах с уникальными динамическими DNS для .dev.company.ru, подключив к * [Постановка] ** Docker Over TCP и предоставление доступа к ним. Он также автоматически получает SSL-сертификаты для приложения на [Производство] Отказ Сертификат подстановки (WC) .dev.company.ru получается с помощью отдельного контейнера * Letsencrypt-DNS Если Трафик не поддерживает ваш поставщик DNS. Трафик Использует этот или самозанятый сертификат, усейте SSL от клиентов и перенаправляют HTTP-запросы к соответствующим сервисам доменными именами. Он работает на [Производство] Наряду с основным приложением Приложение Отказ

  • Gitlab Запускает команды на [Услуги] Использование Gitlab-runners , установленный на других виртуальных машинах. По запросу Merge (MR) на дев и Мастер Филиалы управляют бегущими изображениями на [Постановка] и [Производство] Согласно проекту .gitlab-ci.yml файлы.

  • Строительство, тестирование и постановка проходят на [Постановка] Отказ

  • В этом решении Gitlab также действует как Docker Registry , где хранятся изображения встроенные приложения.

  • Gitlab , Трафик и Gitlab-runners Также запустите в контейнерах Docker, что позволяет легко обновлять и переносить инфраструктуру.

Вот ссылка на репозиторий GitHub с пошаговым описанием процесса создания этой инфраструктуры. Не делать этого Longread еще дольше, прошу вас, пожалуйста, прочитайте его там:

https://github.com/Akkarine/demo_cicd

Предупреждение

  • Эта инфраструктурная раствор — скорее пусковой площадкой для понимания основных принципов; Тесты нагрузки не были выполнены. Многое зависит от оборудования и архитектуры приложения. Для тяжелых нагрузок, повышенной надежности и работы в облаке рекомендуется рассмотреть вопрос о предприятии Traefik и Gitlab и получить совет экспертов.
  • Репозиторий содержит части конфигурации, которую вы, очевидно, должны настраивать. Например, часовой пояс, почтовые адреса, домены и т. Д.
  • Поскольку работа проводилась год назад, Traefik и Gitlab значительно развивались в то время, и многие вещи уже могут быть оптимизированы. Например, Traefik теперь поддерживает DNS Яндекс (не без моего скромного вклада ) и больше не нуждается в Промежуточное обслуживание Отказ А Gitlab имеет более гибкие варианты конфигурации. Например, правила Отказ
  • Также обратите внимание на раздел «Что может быть улучшено сразу».

Чехол для веб-разработки:

https://github.com/Akkarine/demo_cicd_project

Пример предусмотрен для небольшого веб-приложения для понимания основных принципов, поскольку предполагается:

  • Приложение недоступность во время обновлений. Чтобы организовать развертывание без простоя, вам понадобится поддержка из кода приложений (версию BackeNG API, монтажные миграции базы данных), более сложные настроители нагрузки и алгоритм выворачивания, а в идеале, другой уровень инфраструктуры — Kubernetes. Так что это далеко от «новичка».
  • Запуск базы данных в докере (влияет на производительность)
  • Копирование производственной базы данных для постановки (конфиденциальность данных, проблематичная с большой базой данных)
  • Запуск команд как root в контейнерах (вообще не лучшая практика)

Самое главное в репозитории — это .gitlab-ci.yml файл. Рассмотрим этап трубопровода и задачи в нем в соответствии с шагами в рабочем процессе:

  • База-IMG-восстановление

    • Rebuild-Base-Backend: процесс здания разделен на два этапа, чтобы сделать его быстрее. На текущем — первый, построен базовое изображение, которое будет запущено только тогда, когда файлы с описанием зависимостей изменяются. На втором (этап сборки) приложение построено.
  • Rebuild-dev-db

    • rebuild-dev-db: В этой задаче общее изображение базы данных подготовлено для тестируемых ветвей с резервным копированием базы данных, развернутой непосредственно внутри изображения.
  • строить

    • Rebuild-Proxy-IMG: Поскольку изображение прокси-сервера Nginx будет обновляться чрезвычайно редко, это изображение может быть сразу же, созданное с «последним» тегом
    • постройка: Приложение построено с текущими изменениями, и в настоящее время помечено номером выпуска (уникальным для всего GitLab)
  • тестовое задание

    • Тестирование: Запуск автоматизированных тестов
  • развертывать — обзор

    • Deploy_Review: развернут тестовый сервер, он практически идентичен производству, только с конфигурациями сервера менее агрессивна для ресурсов.
  • Skip_Review: Используется для пропустить создание тестового сервера, если он не нужен на этом этапе развития.

  • рассмотрение

    • Одобрить-dev: Он активируется вручную. Когда запрос слияния отправляется в dev (то есть нынешний ветвь — это функция), то вам не нужно нажать. Эта задача предназначена только для зеленой галочки на конвейере.
    • Утверждение постановки: он активируется вручную. Когда запрос слияния отправляется на MASTER (I.E. Текущая ветвь — это исправление или DEV, а выпуск выполняется), то изображение, которое было тестировано на этапе сборки, помечено «последним» и заменяет предыдущую версию в репозитории. Чтобы убедиться, что он не стирается следующей последней версией, она также загружается с тегом «Номер задачи».
    • Отклонить: он активируется вручную. Это просто показывает красный цвет на трубопроводе. Таким образом, из списка запросов слияния будет ясно, что что-то не так с этой веткой.
    • stop_review: можно активировать как автоматически, так и вручную. Останавливает поднятый тестовый сервер
  • Rebuild-apered-db-img

    • rebuild-appted-db-img: если обзор был успешным, и файлы были обновлены в контексте создания изображения базы данных, то новое изображение создается с «последним» тегом и загружена в репозиторий.
  • развертывать

    • Развертывание-производство: в производстве база данных резервна, а контейнеры обновляются до последней версии. Если резервное копирование было неудачно, развертывание не происходит.
    • Развертывание-производство-WO-контейнеры: В случае, если база данных не развернута для резервной копии, это действие пропускается.
  • Чисто: Серверы постановки и производства очищены от мусора

    • очистка
    • чистый прод
  • восстановление-дБ

    • Restore-DB: Для первого развертывания или чрезвычайно неудачного обновления он восстанавливает базу данных из резервной копии.

ТРАФИК

Альтернативный обратный прокси + SSL на Nginx

Gitlab.

Gitlab ssl config.

Реестр GitLab

Гитлаб-бегун

Докер

Другие полезные ссылки

Команда для анализа докеровских изображений (утилита работает в Docker) Sudo Docker Run --rm -it -v/var/run/docker.sock:/var/run/docker.sock wagoooodman/ныряющий: последний gitlab/gitlab-runner: последний

Оригинал: «https://dev.to/hostman_com/web-development-from-scratch-ci-cd-infrastructure-development-process-3hpl»