Кросс-проектные компоненты

Артём Мезин / @iketari / Почта Mail.Ru

Задачи, которым никто не удивится

  1. Сокращение времени разработки
  2. Структурирование и упрощение кода
  3. Уменьшение порога вхождения в проект

Задачи, характерные для больших компаний

  1. Унификация дизайна продуктов компании
  2. Синхронизация работы нескольких команд
  3. Многократное реиспользование кода

Проблема: разработка интерфейса ведется независимыми командами, котырые зачастую работают над схожими задачами.

Только в Почте сущетсвует 4 группы, которые выполняют задачи нескольких продуктовых менеджеров.

Почта

Облако

Задача: научиться разрабатывать интерфейс с единой кодовой базой.

Варианты решения

Отдельная библиотека UI компонент и команда разработчиков

Варианты решения

Одинаковый дизайн. Графические гайдлайны.

Что будет

b-thumb b-thumb
vs
b-thumb b-thumb2

Наш выбор

Отдельная библиотека, которую разрабатывают все команды, в процессе работы над своими задачами

Что нужно, чтобы такую библиотеку было удобно использовать?

Просто...

  1. Подключить к новому проекту
  2. Разрабатывать
  3. Отдать в тестирование
  4. Протестировать самим
  5. Вписать в штатный релиз-цикл
  6. Вписать в экстренный релиз-цикл
  7. Включиться в работу

Как сложно подключить библиотеку к проекту?

git

git submodule

  1. Очень сложно контролировать версию
  2. А как мержить?
  3. Нельзя построить дерево зависимостей

git subtree

  1. Испорченный git log
  2. Очень медленно
  3. Нельзя построить дерево зависимостей

А как просто?

Пакеты

toolkit@0.15.2

И что?

  1. Удобный контроль версий
  2. Независимая разработка
  3. Слабая связь с проектом
  4. Обилие пакетных менеджеров

Просто...

  • Подключить к новому проекту
  • Разрабатывать
  • Отдать в тестирование
  • Протестировать самим
  • Вписать в штатный релиз-цикл
  • Вписать в экстренный релиз-цикл
  • Включиться в работу

Как просто разрабатывать с пакетами?

Нужна фича из версии 0.14.0


//package.json

"jam": {
	"dependencies": {



	}
}


//package.json

"jam": {
	"dependencies": {
		"toolkit": "0.14.0",
		"callstackjs": "0.4.2",
		"features": "0.1.0"
	}
}

						

Нужны доработки

						
ll data/packages
...
5 18:27 callstackjs
9 11:20 toolkit -> ../../../packages/toolkit/
5 18:27 features
...
						
						

Доработали! Что потом?

git commit

git push

Выкатываем!


"dependencies": {
  "toolkit": "git+ssh://git@gitmrg.ru:toolkit.git#mail-367"
}

						

Радуемся результату на тестовом стенде

mail

Мерж-реквест в основную ветку пакета

mail

Просто...

  • Подключить к новому проекту
  • Разрабатывать
  • Отдать в тестирование
  • Протестировать самим
  • Вписать в штатный релиз-цикл
  • Вписать в экстренный релиз-цикл
  • Включиться в работу

Распространение библиотеки

Пакетные менеджеры

Ключевые требования

  • Плоское дерево зависимостей
  • Установка пакета из GIT
  • Поддержка package.json
  • Интеграция с Require.js
  • Отсутствие "тяжелого" бекенда

Выбрали jam, как переходное решение к npm

Просто...

  • Подключить к новому проекту
  • Разрабатывать
  • Отдать в тестирование
  • Протестировать самим
  • Вписать в штатный релиз-цикл
  • Вписать в экстренный релиз-цикл
  • Включиться в работу

Как договориться
с релиз-инженером?

gitlab

Наиболее простой способ

Изменения осуществялются в рамках библиотеки

Немного усложним

Изменения осуществялются в рамках задачи проекта

Важно согласовать версию и ревизию

Nightmare

Хотфиксим проект

Просто...

  • Подключить к новому проекту
  • Разрабатывать
  • Отдать в тестирование
  • Протестировать самим
  • Вписать в штатный релиз-цикл
  • Вписать в экстренный релиз-цикл
  • Включиться в работу

Немного о версионировании

Мы используем semver

(semver.org)

МАЖОРНАЯ. МИНОРНАЯ. ПАТЧ

0.14.17

Публикация пакетов

Backend

(CouchDB)

couchdb

Действия владельца пакета

							
~/packages/toolkit  $ jam publish
							
						

И это все?

На самом деле нет

							
~/packages/toolkit  $ git commit -am '0.14.17'
~/packages/toolkit  $ git tag 0.14.17
							
						

Автоматизация рутины

Тестирование

Karma + Jasmine

Непрерывная интеграция

Bamboo

bamboo

Публикация

grunt-contrib-bump

grunt-jam-publisher

grunt

Просто...

  • Подключить к новому проекту
  • Разрабатывать
  • Отдать в тестирование
  • Протестировать самим
  • Вписать в штатный релиз-цикл
  • Вписать в экстренный релиз-цикл
  • Включиться в работу

Преимущества такого подхода к разработке

Размер не имеет значения

Пакеты позволили сделать общими как большие библиотеки, так и некоторые частные решения

Слабая связанность и переносимость кода

Независимая разработка и использование в разных проектах обязывает к строгому разграничеию зон ответственности

Личная ответственность разработчика

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

Благодарности


Илья Бурлак
i.burlak@corp.mail.ru

Антон Гальцев
a.galtsev@corp.mail.ru

Сергей Камардин
s.kamardin@corp.mail.ru

Спасибо за внимание!