Инструментарий для создания дистрибутива
продукта
Владимир Селин
отдел разработки инфраструктуры
старший программист
vselin@ptsecurity.com
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 AUTHORITYNETWORK 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
AUTHORITYNETWORK 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
Спасибо!
Вопросы?
Владимир Селин
Отдел разработки инфраструктуры
Старший программист
vselin@ptsecurity.com
https://www.linkedin.com/in/vselin

Инструментарий для создания дистрибутивов продуктов | Владимир Селин

  • 1.
    Инструментарий для созданиядистрибутива продукта Владимир Селин отдел разработки инфраструктуры старший программист vselin@ptsecurity.com https://www.linkedin.com/in/vselin
  • 2.
    Проблема: Поддержка и сопровождениеинсталлятора большого продукта
  • 3.
    Немного истории Начало (осень2013): • 1 компонент продукта • 1 проект инсталлятора • 6 сервисов и конфигурационных файлов • 4 артефакта-источника файлов для дистрибутива • 1 человек из команды компонента Развитие (2014-2015): • 4 компонента продукта • 18 проектов инсталлятора • 20+ сервисов и конфигурационных файлов • 50+ артефактов • ~10 Feature Branches (FB) • 4 человека в [новом] отделе инфраструктуры продукта
  • 4.
    Тенденции Рост сложности проекта: •Увеличивается количество компонентов продукта • Увеличивается сложность каждого компонента: больше сервисов, конфигурационных файлов, настраиваемых параметров • Растет команда продукта: больше FB в одновременной разработке Рост трудозатрат команды инфраструктуры (КИ): • Растет среднее время ожидания внесения изменений • Изменения высокоприоритетны и вытесняют задачи развития инфраструктурных проектов
  • 5.
    Эффекты проблемы • Временныеиздержки при формулировке изменений заказчиком • Издержки при разборе проблем с развертыванием • Потери на переключение контекста • Разработчики лишены возможности быстрого получения экспериментального или FB-инсталлятора • Усложняется и замедляется цикл разработки и поддержки инсталлятора и продукта в целом
  • 6.
  • 7.
    Анализ • Изменения составаинсталлятора компонента: • Какие файлы из каких артефактов должны попасть в инсталлятор? • Изменения требуемого состояния целевой операционной системы: • Какие сервисы, сайты, правила файрвола, задачи в планировщике создать? • Какие директории и с какими правами нужно создать? • Изменения настройки компонента: • Какие параметры должны настраиваться? • В какие конфигурационные файлы и как должны прописываться параметры?
  • 8.
    Цель: разделить знанияи права на внесение изменений Команда инфраструктуры Состав Настройки продукта Настройки системы Алгоритмы и последовательности настройки Инструменты сборки Инструменты развертывания Было Стало Команда разработки Описания Параметров настройки Состояния ОС Состава инсталлятора Шаблоны конфигурационных файлов Команда инфраструктуры Шаблоны сценариев развертывания Инструменты Сборки инсталлятора Развертывания и настройки
  • 9.
  • 10.
    DSL для описанияинсталлятора Зачем? • Быстро и понятно DSL (Domain-specific language) – язык, специализированный для своей области применения • Расширяемость и гибкость без потери контроля
  • 11.
    Технологии • Python (Jinja2,PyYaml, jsonschema): генерация сценариев и конфигурационных файлов, валидация DSL-описаний и генерация документации по схеме • PowerShell: сценарии развертывания для Windows • C#: самописная библиотека функций для настройки Windows- окружения • WiX, MSI: создание инсталляционных пакетов для Windows
  • 12.
  • 13.
    Генерация сценария: 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 AUTHORITYNETWORK SERVICE ...
  • 14.
    Генерация сценария: Шаблонсценария развертывания (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 %} ...
  • 15.
    Генерация сценария: сценарийразвертывания (PowerShell) ... $serviceAccount = New-Object System.Management.Automation.PSCredential("NT AUTHORITYNETWORK 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 ...
  • 16.
  • 17.
    Генерация документации Схема DSLHTML-шаблон документации Документация в HTML
  • 18.
  • 19.
    Знания и ответственностьраспределились по компетенциям Разработчики Инфраструктура Приведение ОС к требуемому состоянию Установка и настройка пререквизитов Инструменты для создания инсталл. пакета Инструменты настройки компонента Описание состояния ОС Описание параметров компонента Описание состава пакета Шаблоны конфигурационных файлов
  • 20.
    Заказчик изменений иисполнитель объединились • У разработчиков появились знания об процессе развертывания • Описания инсталлятора и шаблоны конфигураций находятся в проектах разработчиков Было: Стало:
  • 21.
    Устранили узкое место,увеличили производительность Было: Заказчики изменений (разработчики) Исполнитель (инфраструктура) Продукт (инсталлятор) Среднее время ожидания внесения изменений = Объем работы [Производительность] = = 𝐶𝑜𝑛𝑠𝑡 × Кол−во изменений Кол−во исполнителей
  • 22.
    Устранили узкое место,увеличили производительность Стало: Заказчики и исполнители изменений (разработчики) Продукт (инсталлятор) Среднее время ожидания внесения изменений = 𝐶𝑜𝑛𝑠𝑡
  • 23.
    Планы развития • Linuxкак еще одна целевая платформа: • Расширение DSL для описания Linux-specific сущностей ОС • Сборка .deb на основе описания состава пакета • Интеграция с Salt: • Скрипты развертывания → Salt States • Публикация инструментов на GitHub в сообщество DevOpsHQ
  • 24.
    Спасибо! Вопросы? Владимир Селин Отдел разработкиинфраструктуры Старший программист vselin@ptsecurity.com https://www.linkedin.com/in/vselin

Editor's Notes

  • #5 Растет среднее время внесения изменений (больше анализа, дольше переключение контекста)