DevOps

DevOps #

DevOps - размытый термин. Его “эталонное” значение - набор практик по разработке ПО, направленных на повышение качества, сокращения длительности циклов разработки между релизами. Основная идея - объединить разработку, тестирование и эксплуатацию в единый цикл. Проблема, которую решает DevOps, происходит из времён, когда разработкой и эксплуатацией продуктов занимались независимые друг от друга люди и отделы, что создавало излишнее трение и задержки.

Степень и глубина применения DevOps практик варьируются от проекта к проекту. Общими элементами, как правило, являются:

  • Методология разработки и управления проектами - Agile/Scrum/Kanban
  • CI/CD - инструменты автоматизации сборки, деплоя, тестирования проекта
  • Git flow, pull request - модель ветвления git репозитория для эффективной командной работы и максимально безболезненных частых релизов
  • Покрытие кода тестами, автоматическое тестирование - исполнитель задачи ответственен за покрытие её автоматизированными тестами. При каждом пуше в репозиторий тесты прогоняются, таким образом, если очередное изменение сломает какой-то функционал, мы узнаем об этом автоматически
  • Работа с инфраструктурой - создание (ручное или автоматическое), деплой туда проекта

В данном документе я опишу то, что относится к DevOps в контексте бэкенд разработки, и что полезно знать на уровне Junior.

Методология разработки и управления проектами #

В мире разработки существует 3 основных методологии управления проектами - Agile, Scrum, Kanban. Зачастую, строго методологии не следуют, каждая компания и тимлид имеют свои представления о том, как управлять разработкой.

Постараюсь описать наиболее часто встречающиеся практики:

  • Система постановки и формализации задач - Jira, Trello. Тимлид ставит задачи, делегирует их членам команды, принимает работу
  • Коммуникация внутри команды и между ними - ежедневные daily созвоны, подведение итогов каждые 1-2 недели
  • Ревью кода в pull request’ах тимлидом и другими опытными членами команды

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

Git #

Git - система контроля версий. Здравая разработка немыслима без системы контроля версий, и Git стал доминирующим инструментом в этой области, поэтому есть смысл учить именно его. Что касается сервисов хранения репозиториев, тут конкуренции больше, для проектов курса предлагаю пользоваться GitHub.

Что нужно знать и уметь Junior’у:

Избранные курсы и учебные ресурсы #

Деплой #

Деплой - процесс развёртывания и запуска приложения. Самый простой способ деплоя, который можно представить - ручное копирование файлов сайта, написанного на PHP, с помощью FTP клиента на удалённый сервер.

Практики деплоя со временем эволюционировали. Я считаю, что для понимания современных практик полезно знать, как деплой делался в прошлом, поэтому на примере проектов со 2 по 7 мы будем начинать со старых подходов к деплою и постепенно переходить к более новым.

Подробности о деплое каждого проекта описаны в ТЗ, ниже приведу примерные шаги эволюции деплоя бэкенд Python приложений:

  • Вручную - установка Python на удалённый сервер, установка необходимых инструментов (например, базы данных), веб-сервера (Tomcat, Jetty), собранного приложения в веб-сервер
  • Автоматизированное развёртывание веб-серверов, где уже предустановлено всё необходимое, установка веб-приложения в развёрнутые сервера
  • Docker и микросервисы - упаковка сервисов приложения в Docker образы, ручной или автоматический деплой стека сервисов на удалённый сервер
  • Облака - ручное или автоматическое развёртывание приложение из микросервисов в облаке, ручное или автоматическое создание инфраструктуры (сервера, базы данных, и всё остальное), на которой разворачивается приложение

На практике необходимо уметь:

  • Работать с хостингами - создавать и управлять виртуальными машинами (в основном на Linux)
  • Работа с терминалом Linux на языке bash - базовые команды, установка пакетов
  • SSH ключи, подключения
  • Docker

CI/CD #

CI/CD - непрерывная интеграция и деплой. Основная идея в автоматизации и быстрой реакции на возникающие проблемы, примеры:

  • Разработчик делает push в свою ветку. Инструмент автоматизации прогоняет тесты и проверки на качество кода, если что-то не пройдено - разработчик (и другие заинтересованные лица) уведомляются об этом
  • Ответственный за релиз делает слияние в релизную ветку. Инструмент автоматизации проводит деплой и оповещает о результате

Существует множество CI/CD инструментов. В седьмом проекте воспользуемся GitHub Actions для автоматизации сборки Docker образов и деплоя.

Что дальше #

DevOps технология для уровня Middle и выше:

  • Деплой приложений в Kubernetes
  • Деплой в облака - AWS, Azure, другие
  • Infrastructure as Code (Terraform, AWS CDK)