ݺߣ

ݺߣShare a Scribd company logo
Как мы делаем
раскладку Календаря
     Владимир Рудных
Обо мне


• тимлид Календаря Mail.Ru
• pythonista
• бывший перловик
• ленивый программист



                         Moscow Django MeetUp №7
Календарь Mail.Ru
• calendar.mail.ru
• написан на Python
• Django framework
• PostgreSQL
• Rich Internet Application
• RESTful API
• шаблонизация на клиенте (Fest)

                              Moscow Django MeetUp №7
calendar.mail.ru




             Moscow Django MeetUp №7
Разработка в Mail.Ru

 Тестовое
                             Production
окружение




             Офисная сеть
            (разработчики)




                               Moscow Django MeetUp №7
Раскладка проекта



репозиторий            много
     git              серверы
                       серверы
                     серверов


              как?



                     Moscow Django MeetUp №7
Раскладка проекта



репозиторий   "rsync"     много
     git                 серверы
                          серверы
                        серверов
                 ?

   Ахаха, мы же не перловики!


                        Moscow Django MeetUp №7
Раскладка проекта




             Moscow Django MeetUp №7
Раскладка проекта



  Вся мощь Python
      с нами!



                Moscow Django MeetUp №7
Раскладка проекта


• setuptools
• distribute
• easy_install
• pip



                     Moscow Django MeetUp №7
Раскладка проекта


• python setup.py install
• pip install package
• pip install -r requirements.txt




                               Moscow Django MeetUp №7
Раскладка проекта



     NO WAY!




               Moscow Django MeetUp №7
Раскладка проекта


Загаживать систему пакетами?

Что делать с зависимостями?

 Как отслеживать их версии?



                     Moscow Django MeetUp №7
Раскладка проекта

А если нужна другая версия Python?

        А что делать, если
        нужно откатиться?

   Что делать с зависимостями
          при откате?


                         Moscow Django MeetUp №7
Раскладка проекта



       АД




             Moscow Django MeetUp №7
Раскладка проекта



 Вспоминаем про
    virtualenv



                 Moscow Django MeetUp №7
Vitrualenv


• весь проект в одном месте
• со всеми зависимостями
• любые версии Python и модулей
• не засоряет систему



                           Moscow Django MeetUp №7
Раскладка проекта


        Но как раскладывать?
             Makefile? Fabric?
                    RPM*!

* RPM, DEB или любой другой формат пакетов
                                  Moscow Django MeetUp №7
RPM
• весь проект со всеми зависимостями
• в одном пакете
• накатить/откатить - без проблем
• версионность пакетов
• версионность отдельных модулей
• не засоряет систему
• админы умеют (привет, CPAN!)

                          Moscow Django MeetUp №7
RPM



Как собирать?
 Jenkins CI



              Moscow Django MeetUp №7
сборка RPM
• пишем fabfile для запуска сборки
• пишем SPEC-файл для RPM
• заводим задачу в Jenkins CI
• ...
• пушим ветку в git, получаем RPM:
  - git master -> RPM stable
  - git prerelease -> RPM testing

                               Moscow Django MeetUp №7
Jenkins CI


 Задачи в Jenkins:
• development - все ветки
• prerelease - ветка prerelease
• release - ветка master



                            Moscow Django MeetUp №7
плюшки Jenkins
• автоматическая сборка RPM
• continuous integration
• тесты
• lint
• coverage
• change log
• мгновенная обратная связь

                           Moscow Django MeetUp №7
Jenkins CI




             Moscow Django MeetUp №7
Jenkins CI: report




               Moscow Django MeetUp №7
Jenkins jobs
            dev   prerelease       release

 pylint     ✔
 flake8     ✔        ✔
coverage    ✔        ✔
  tests     ✔        ✔               ✔
  RPM                ✔               ✔
                          Moscow Django MeetUp №7
Раскладка проекта


 Разложили, что дальше?
Как узнать, что всё хорошо?
   Нужен мониторинг!


                   Moscow Django MeetUp №7
Мониторинг

• метрики в Graphite (+Statsd)
• ошибки в Sentry
• дежурные администраторы
• обращения пользователей
 в службу поддержки


                          Moscow Django MeetUp №7
Graphite



 Что будем мониторить?
Да всё будем мониторить!



                  Moscow Django MeetUp №7
Graphite
• количество запросов
• тип запросов
• время выполнения
• время ожидания
• таймауты
• количество ошибок
• выкладки и рестарты

                        Moscow Django MeetUp №7
Graphite



  Где будем мониторить?
Да везде будем мониторить!



                   Moscow Django MeetUp №7
Graphite
• клиент (браузер)
• сервер (cpu, memory, hardware)
• nginx
• uwsgi
• приложение
• БД
• обвязка (очереди, рассыльщики)

                          Moscow Django MeetUp №7
Раскладка проекта


   Разложились.
   Есть ошибки.
   Что делать?


                 Moscow Django MeetUp №7
Раскладка проекта



 Просить админов
  погрепать логи?



               Moscow Django MeetUp №7
Раскладка проекта




             Moscow Django MeetUp №7
Раскладка проекта



     Sentry!




               Moscow Django MeetUp №7
Sentry

Получаем все ошибки
Frontend + Backend
  в удобном виде.
     Realtime!

                 Moscow Django MeetUp №7
Sentry
• url ошибки
• данные запроса (request)
• полный stacktrace ошибки
• версии модулей
• информация о пользователе
 (email, браузер, ОС)
     Для каждой ошибки!
                             Moscow Django MeetUp №7
Sentry

    За исключением
    приватных данных
     пользователя =)


“password”: “***”


                       Moscow Django MeetUp №7
Sentry




         Moscow Django MeetUp №7
Sentry




         Moscow Django MeetUp №7
Раскладка проекта



      Но как
 избежать ошибок?



               Moscow Django MeetUp №7
Раскладка проекта


  Тестирование
        +
   Code review


             Moscow Django MeetUp №7
Тестирование

• nose
• factory_boy
• mock


• Selenium (coming soon...)


                              Moscow Django MeetUp №7
Тестирование

• модульное
• функциональное
• регрессионное
• альфа (тестировщики)
• бета (пользователи)


                         Moscow Django MeetUp №7
Code review



Phabricator



          Moscow Django MeetUp №7
Code review


• подписка на коммиты (с фильтрами)
• аудит и рецензирование коммитов
• просмотр кода и diff’ов




                            Moscow Django MeetUp №7
Подведём итоги




            Moscow Django MeetUp №7
Best practice
• пишем на Python
• используем virtualenv
• менеджеры пакетов ОС (RPM)
• автоматизируем процесс (Jenkins)
• мониторим всё и вся
• тесты, тесты, тесты!
• обратная совместимость кода
• code review, code style + lint
                              Moscow Django MeetUp №7
Ссылки

• Virtualenv: virtualenv.org
• Jenkins: jenkins-ci.org
• Graphite: graphite.wikidot.com
• Statsd: github.com/etsy/statsd
• Sentry: getsentry.com
• Phabricator: phabricator.org


                               Moscow Django MeetUp №7
Контакты


• Владимир Рудных
• rudnyh@corp.mail.ru
• github.com/dreadatour
• dreadatour.habrahabr.ru



                            Moscow Django MeetUp №7

More Related Content

Как мы делаем раскладку Календаря@Mail.Ru