вторник, 1 сентября 2020 г.

Чем занимается DevOps-инженер в команде современных разработчиков

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

Ключевая мысль статьи:

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

Говоря о DevOps-инженерах, важно охватить весь спектр решаемых ими задач. Вообще сам термин «DevOps-инженер» следует использовать только с привязкой к конкретной предметной области, иначе получится как с программистами: говорят «он работает программистом», а подразумевают под этим и веб-дизaйнера, и специалиста по базам данных, и программиста C++. Для меня DevOps — это набор методологий, лучших практик, технологий и инструментов разработки ПО. Инженер, работающий по принципам DevOps, может обладать широким кругозором в различных направлениях: continuous integration, continuous delivery, build, deploy, test, SCM, infrastructure, monitoring, но может быть и узкоспециализированным специалистом, например только в области мониторинга или сбора телеметрии от продуктов.

О роли DevOps-инженера

Роль DevOps-инженера сильно зависит от специфики задач, решаемых конкретной командой. Если команда занимается разработкой веб-приложений, то скорее всего, ей потребуется инженер по деплою продуктов на staging- и production-серверы. Если команда — это специалисты по тестированию ПО, то DevOps-инженер может заниматься у них инфраструктурными задачами, например помогать с развертыванием виртуальных стендов для тестирования и доставкой тестируемого приложения и тестов на эти стенды. Если это SCM-команда, занимающаяся развертыванием ПО в инфраструктуре конечного заказчика, DevOps-инженеры могут взять на себя задачи, связанные с доставкой компонентов продукта до серверов заказчика, а также заняться разработкой сценариев развертывания ПО, мониторингом продукта и сбором телеметрии.

Для примера, специфика работы нашей компании, вендора в области инновационных решений информационной безопасности, накладывает на наш отдел автоматизации (неформально называемый DevOps-отделом) обязанность поддерживать работу всего конвейера производства ПО и сопутствующую инфраструктуру, начиная от сборки отдельных компонентов и инсталляторов продуктов до их отправки на тестирование и доставки на серверы обновлений и затем в инфраструктуру заказчиков. Несмотря на огромный объем технических задач, с ними справляются полтора десятка человек, при этом количество разработчиков в R&D, с которыми мы работаем, — несколько сотен.

DevOps в современном IT уже давно выделился в самостоятельную инженерную дисциплину — очень динамичную и технологичную. Ключевым принципом для DevOps-инженеров является принцип DevOps as a service. Мы должны оперативно приносить новые технологии нашим разработчикам и тестировщикам и поддерживать работу старых, проверенных временем сервисов. Кроме того, мы делаем труд разработчиков более комфортным, эффективным и продуктивным. Также мы разрабатываем внутренние вспомогательные инструменты, регламентируем и автоматизируем процессы разработки, сохраняем и распространяем технологические знания внутри компании, проводим технические воркшопы, митапы и делаем еще много всего полезного.

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

Чего мы добились, используя принципы DevOps

Основное, чего мы добились для бизнеса, работая по принципам DevOps, — это тиражируемость технологических решений. Все решения, которые мы предоставляем, типовые, масштабируемые и построены на шаблонах. Для всех проектов общая концепция процесса CI/CD остается неизменной: выполняются коммит в git и автоматическая сборка (building) — деплой на тестовые серверы (deploying) — функциональное и прочие виды автотестирования (testing) — продвижение сборки в стабильные (promoting) — публикация на GUS (publishing) — распространение через FUS на инфраструктуре заказчика (delivering) — установка или обновление продукта на серверах (installing & updating).

IDEF0-схема типового процесса CI/CD

IDEF0-схема типового процесса CI/CD

На каждом из этапов наш отдел помогает разработчикам и тестировщикам решить конкретные технические задачи:

  • обеспечить хранение кода в системе GitLab (выделить им проект);
  • разработать сборочную конфигурацию на базе одного из типовых шаблонов и обеспечить хранение собранных артефактов в системе Artifactory;
  • реализовать конфигурации для деплоя артефактов на серверах тестировщиков и помочь им с подготовкой тестовых конфигураций;
  • в случае успешного тестирования — продвинуть сборку, то есть переместить ее в хранилище протестированных артефактов в Artifactory, для чего также создается специальная конфигурация;
  • при необходимости опубликовать сборку на корпоративном сервере Global Update, откуда она будет автоматически распространена на FUS-серверы для заказчиков;
  • при помощи скриптов на базе SaltStack развернуть сборку на конкретном сервере.

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

О первых шагах нашей команды в DevOps, о том, с какими проблемами мы столкнулись, как выстраивали процесс CI/CD и к чему пришли в итоге, можно почитать в статьях на Хабре:

·        Миссия выполнима: как развить DevOps в компании со множеством проектов,

·        Личный опыт: как выглядит наша система Continuous Integration,

·        Автоматизация процессов разработки: как мы в Positive Technologies внедряли идеи DevOps.

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

Какие инструменты DevOps-инженеры используют в работе

Применяемый DevOps-инженерами инструментарий должен подбираться в зависимости от решаемых задач, не стоит жестко их ограничивать. Кроме того, любой набор инструментов автоматизации сейчас устаревает слишком быстро и за пару лет может полностью измениться. В этом плане мне нравятся гибкие roadmaps развития в профессии, которые предлагаются opensource-сообществом, в том числе с перечислением актуальных на данный момент инструментов. Например, есть roadmap для DevOps-инженеров и roadmap для разработчиков.

Если сказать чуть более абстрактно, без привязки к решаемым задачам, то DevOps-инженер должен владеть как минимум одним высокоуровневым языком программирования (Python, Java, Go, C++, C# или любым другим), понимать основы разработки и тестирования ПО. Понимать, как работают операционные системы Windows и Linux и их основные концепции: треды и процессы, разграничение доступа, сокеты, модель OSI, устройства ввода-вывода, память и устройства хранения данных; понимать, как работает виртуализация. Также потребуются навыки работы с терминалом ОС, умение писать batch- и bash-скрипты. Будет совсем не лишним знакомство с направлением infrastructure as code (инфраструктура как код): контейнеризацией (например, с помощью Docker и Docker Compose), написанием сценариев развертывания окружения (например, посредством Salt или Ansible), оркестрацией (Kubernetes), а также со всем, что касается мониторинга инфраструктуры (например, Zabbix, Grafana или Prometheus). Для продуктовой разработки также очень важны навыки работы с системами CI/CD, например TeamCity, Gitlab CI, Travis CI, Jenkins и Azure DevOps. Кроме того, важно умение работать с виртуальной инфраструктурой и облаками, например с vSphere, Azure, AWS или Google Cloud.

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

 

Автор: Тимур Гильмуллин, заместитель руководителя отдела технологий и процессов разработки Positive Technologies

Оригинал статьи в журнале TProger: https://tproger.ru/articles/devops-among-developers/