Upload
positive-hack-days
View
4.332
Download
1
Embed Size (px)
Citation preview
Инструментарий для создания дистрибутива продукта
Владимир Селинотдел разработки инфраструктуры
старший программист[email protected]
https://www.linkedin.com/in/vselin
Проблема:Поддержка и сопровождение инсталляторабольшого продукта
Немного истории
Начало (осень 2013):• 1 компонент продукта• 1 проект инсталлятора• 6 сервисов и конфигурационных файлов• 4 артефакта-источника файлов для дистрибутива• 1 человек из команды компонента
Развитие (2014-2015):• 4 компонента продукта• 18 проектов инсталлятора• 20+ сервисов и конфигурационных файлов• 50+ артефактов• ~10 Feature Branches (FB)• 4 человека в [новом] отделе инфраструктуры продукта
Тенденции
Рост сложности проекта:• Увеличивается количество компонентов продукта• Увеличивается сложность каждого компонента: больше сервисов, конфигурационных файлов, настраиваемых параметров
• Растет команда продукта: больше FB в одновременной разработке
Рост трудозатрат команды инфраструктуры (КИ):
• Растет среднее время ожидания внесения изменений• Изменения высокоприоритетны и вытесняют задачи развития инфраструктурных проектов
Эффекты проблемы
• Временные издержки при формулировке изменений заказчиком
• Издержки при разборе проблем с развертыванием
• Потери на переключение контекста
• Разработчики лишены возможности быстрого получения экспериментального или FB-инсталлятора
• Усложняется и замедляется цикл разработки и поддержки инсталлятора и продукта в целом
Решение: Разделение зон ответственности
Анализ
• Изменения состава инсталлятора компонента:• Какие файлы из каких артефактов должны попасть в инсталлятор?
• Изменения требуемого состояния целевой операционной системы:• Какие сервисы, сайты, правила файрвола, задачи в планировщике создать?
• Какие директории и с какими правами нужно создать?
• Изменения настройки компонента:• Какие параметры должны настраиваться?
• В какие конфигурационные файлы и как должны прописываться параметры?
Цель: разделить знания и права на внесение изменений
Командаинфраструктуры
Состав
Настройки продукта
Настройки системы
Алгоритмы и последовательности
настройки
Инструменты сборки
Инструменты развертывания
Было Стало
Командаразработки
Описания
Параметров настройки
Состояния ОС
Состава инсталлятораШаблоны конфигурационных файлов
Команда инфраструктуры
Шаблоны сценариев развертывания
Инструменты
Сборки инсталлятора
Развертывания и настройки
DSL как решение проблем
DSL для описания инсталлятора
Зачем?
• Быстро и понятно
DSL (Domain-specific language) – язык, специализированный для своей области применения
• Расширяемость и гибкость без потери контроля
Технологии
• Python (Jinja2, PyYaml, jsonschema): генерация сценариев и
конфигурационных файлов, валидация DSL-описаний и
генерация документации по схеме
• PowerShell: сценарии развертывания для Windows
• C#: самописная библиотека функций для настройки Windows-
окружения
• WiX, MSI: создание инсталляционных пакетов для Windows
Генерация сценария
DSL Шаблон сценария Сценарий
Генерация сценария: DSL (YAML)
...
services:
- Name: ScannerManagement.Host
DisplayName: Scan Management Host
Description: Scan Management Host
BinaryPath: '{{params.InstallDir}}\ScanManagement.Host.exe'
Dependencies: [MongoDB, RabbitMQ]
AccountName: NT AUTHORITY\NETWORK SERVICE
...
Генерация сценария: Шаблон сценария развертывания (Jinja2)
...
{% for service in services %}
$serviceAccount = New-Object
System.Management.Automation.PSCredential("{{service.AccountName}}“)
Install-Service `
-Name "{{service.Name}}" `
-DisplayName "{{service.DisplayName}}" `
-Description "{{service.Description}}" `
-BinaryPathName "{{service.BinaryPath}}" `
{% if service.Dependencies %}-DependsOn{%- for item in service.Dependencies %}
'{{item}}'{% if not loop.last %},{% endif %} {%- endfor %} `{% endif %}
-Credential $serviceAccount
{% endfor %}
...
Генерация сценария: сценарий развертывания (PowerShell)
...$serviceAccount = New-Object System.Management.Automation.PSCredential("NT AUTHORITY\NETWORK SERVICE")Install-Service -Name "ScannerManagement.Host" ` -DisplayName "Scan Management Host" ` -Description "Scan Management Host" ` -BinaryPathName "$($params.InstallDir)\ScanManagement.Host.exe" ` -DependsOn 'MongoDB', 'RabbitMQ' -Credential $serviceAccount...
Генерация конфигурационных файлов
Значения параметров
Шаблон конф. файла
Конф. файл
Генерация документации
Схема DSL HTML-шаблон документации
Документация в HTML
Результаты:Эффекты от внедрения
Знания и ответственность распределились по компетенциям
Разработчики Инфраструктура
Приведение ОС к требуемому состоянию
Установка и настройка пререквизитов
Инструменты для создания
инсталл. пакета
Инструменты настройки компонента
Описание состояния ОС
Описание параметров компонента
Описание состава пакета
Шаблоны конфигурационных
файлов
Заказчик изменений и исполнитель объединились
• У разработчиков появились знания об процессе развертывания• Описания инсталлятора и шаблоны конфигураций находятся в проектах разработчиков
Было: Стало:
Устранили узкое место, увеличили производительность
Было:
Заказчики изменений(разработчики)
Исполнитель(инфраструктура)
Продукт(инсталлятор)
Устранили узкое место, увеличили производительность
Стало:
Заказчики и исполнители изменений
(разработчики)
Продукт(инсталлятор)
[Среднее время ожиданиявнесенияизменений ]=𝐶𝑜𝑛𝑠𝑡
Планы развития
• Linux как еще одна целевая платформа:
• Расширение DSL для описания Linux-specific сущностей ОС
• Сборка .deb на основе описания состава пакета
• Интеграция с Salt:
• Скрипты развертывания → Salt States
• Публикация инструментов на GitHub в сообщество DevOpsHQ
Спасибо!Вопросы?
Владимир СелинОтдел разработки инфраструктуры
Старший программист[email protected]
https://www.linkedin.com/in/vselin