DevOps #
DevOps - размытый термин. Его “эталонное” значение - набор практик по разработке ПО, направленных на повышение качества, сокращения длительности циклов разработки между релизами. Основная идея - объединить разработку, тестирование и эксплуатацию в единый цикл. Проблема, которую решает DevOps, происходит из времён, когда разработкой и эксплуатацией продуктов занимались независимые друг от друга люди и отделы, что создавало излишнее трение и задержки.
Степень и глубина применения DevOps практик варьируются от проекта к проекту. Общими элементами, как правило, являются:
- Методология разработки и управления проектами - Agile/Scrum/Kanban
- CI/CD - инструменты автоматизации сборки, деплоя, тестирования проекта
- Git flow, pull request - модель ветвления git репозитория для эффективной командной работы и максимально безболезненных частых релизов
- Покрытие кода тестами, автоматическое тестирование - исполнитель задачи ответственен за покрытие её автоматизированными тестами. При каждом пуше в репозиторий тесты прогоняются, таким образом, если очередное изменение сломает какой-то функционал, мы узнаем об этом автоматически
- Работа с инфраструктурой - создание (ручное или автоматическое), деплой туда проекта
В данном документе я опишу то, что относится к DevOps в контексте бэкенд Java разработки, и что полезно знать на уровне Junior.
Методология разработки и управления проектами #
В мире разработки существует 3 основных методологии управления проектами - Agile, Scrum, Kanban. Зачастую, строго методологии не следуют, каждая компания и тимлид имеют свои представления о том, как управлять разработкой.
Постараюсь описать наиболее часто встречающиеся практики:
- Система постановки и формализации задач - Jira, Trello. Тимлид ставит задачи, делегирует их членам команды, принимает работу
- Коммуникация внутри команды и между ними - ежедневные daily созвоны, подведение итогов каждые 1-2 недели
- Ревью кода в pull request’ах тимлидом и другими опытными членами команды
Учить заранее здесь особо нечего. При попадании в команду постарайтесь понять, какими практиками она пользуется, и начать делать так же.
Git #
Git - система контроля версий. Здравая разработка немыслима без системы контроля версий, и Git стал доминирующим инструментом в этой области, поэтому есть смысл учить именно его. Что касается сервисов хранения репозиториев, тут конкуренции больше, для проектов курса предлагаю пользоваться GitHub.
Что нужно знать и уметь Junior’у:
- Основы Git - add, commit, push, pull, clone
- GitHub - создание репозиторев, работа с доступом (токены, SSH ключи) - https://docs.github.com/ru
- Pull requests, умение решать конфликты слияния - https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests
- GitFlow - https://habr.com/ru/post/106912/. Достаточно понять основные идеи, чтобы быть готовым пользоваться этими практиками в командной работе
Избранные курсы и учебные ресурсы #
- Курс по Git - https://githowto.com/ru
- Интерактивный учебник по ветвлению в git - https://learngitbranching.js.org/?locale=ru_RU
Деплой #
Деплой - процесс развёртывания и запуска приложения. Самый простой способ деплоя, который можно представить - ручное копирование файлов сайта, написанного на PHP, с помощью FTP клиента на удалённый сервер.
Практики деплоя со временем эволюционировали. Я считаю, что для понимания современных практик полезно знать, как деплой делался в прошлом, поэтому на примере проектов со 2 по 7 мы будем начинать со старых подходов к деплою и постепенно переходить к более новым.
Подробности о деплое каждого проекта описаны в ТЗ, ниже приведу примерные шаги эволюции деплоя бэкенд Java приложений:
- Вручную - установка JDK на удалённый сервер, установка необходимых инструментов (например, базы данных), веб-сервера (Tomcat, Jetty), собранного приложения в веб-сервер
- Автоматизированное развёртывание веб-серверов, где уже предустановлено всё необходимое, установка веб-приложения в развёрнутые сервера
- Docker и микросервисы - упаковка сервисов приложения в Docker образы, ручной или автоматический деплой стека сервисов на удалённый сервер
- Облака - ручное или автоматическое развёртывание приложение из микросервисов в облаке, ручное или автоматическое создание инфраструктуры (сервера, базы данных, и всё остальное), на которой разворачивается приложение
На практике необходимо уметь:
- Работать с хостингами - создавать и управлять виртуальными машинами (в основном на Linux)
- Работа с терминалом Linux на языке bash - базовые команды, установка пакетов
- SSH ключи, подключения
- Веб-сервера для развёртывания Java приложений - Tomcat
- Docker
CI/CD #
CI/CD - непрерывная интеграция и деплой. Основная идея в автоматизации и быстрой реакции на возникающие проблемы, примеры:
- Разработчик делает push в свою ветку. Инструмент автоматизации прогоняет тесты и проверки на качество кода, если что-то не пройдено - разработчик (и другие заинтересованные лица) уведомляются об этом
- Ответственный за релиз делает слияние в релизную ветку. Инструмент автоматизации проводит деплой и оповещает о результате
Существует множество CI/CD инструментов. В седьмом проекте воспользуемся GitHub Actions для автоматизации сборки Docker образов и деплоя.
Что дальше #
DevOps технология для уровня Middle и выше:
- Деплой приложений в Kubernetes
- Деплой в облака - AWS, Azure, другие
- Infrastructure as Code (Terraform, AWS CDK)