CodeFest 2019. Сергей Быстрых (Plesk) — Как ускорить тесты в 10 раз и вернуть к ним доверие

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 06, 2019

CodeFest 2019. Сергей Быстрых (Plesk) — Как ускорить тесты в 10 раз и вернуть к ним доверие

Практически в каждой IT-команде бизнес рано или поздно начинает хотеть быстрой доставки фичей. И хорошо, если это рано, и вы строите свои воркфлоу с нуля, сразу внедряя такие полезные практики как continuous integration и continuous delivery. А если вы уже прошли многолетний путь создания успешного коробочного продукта? Если у вас уже есть устоявшиеся процессы, которые, да, могут надежно, но не могут быстрее? А бизнес требует!

В докладе я расскажу как мы перестраивали свои процессы, какие решения, подходы и технологии для этого применяли, как и на чём смогли ускориться, а главное — стали больше доверять результатам тестов и прекратили тратить драгоценный ресурс команды на постоянные разборы упавших тестов.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 06, 2019
Tweet

Transcript

  1. Как ускорить тесты в 10 раз и вернуть к ним

    доверие? Основано на личном опыте, все имена и события реальны Сергей Быстрых Руководитель отдела Tools & Infrastructure Plesk
  2. Кто мы? 2 • 380 000 серверов • 11 000

    000 сайтов 6% интернета* по web-серверам и активным сайтам * по данным NetCraft, февраль 2019
  3. Кто мы? 3 Коробочный продукт • 20 лет на рынке

    • 3 поддерживаемых версии • 20 операционных систем • ~ 1М строк кода на PHP C/C++, Python, Go, JavaScript
  4. Кто мы? 4 Команда: • 24 Dev • 9 QA

    • 6 Tools
  5. Релиз цикл 5 ~ 1 год Preview Preview Preview Preview

    RTM 10-15 итераций по 4 недели
  6. Релиз цикл 6 - Хотим релиз каждый месяц! - А

    можем?
  7. Размеры бедствия 7 • Сборка билдов 3 раза в день

    по расписанию
  8. Размеры бедствия 8 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию
  9. Размеры бедствия 9 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов
  10. Размеры бедствия 10 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций
  11. Размеры бедствия 11 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций • Большинство тестов E2E
  12. Размеры бедствия 12 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций • Большинство тестов E2E • 16 часов на все тесты
  13. Размеры бедствия 13 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций • Большинство тестов E2E • 16 часов на все тесты • 2-6% упавшие тесты
  14. Размеры бедствия 14 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций • Большинство тестов E2E • 16 часов на все тесты • 2-6% упавшие тесты • 40 часов в неделю на разбор
  15. Размеры бедствия 15 • Сборка билдов 3 раза в день

    по расписанию • Запуск тестов ежедневно и еженедельно по расписанию • 60 000 тестов • 80 конфигураций • Большинство тестов E2E • 16 часов на все тесты • 2-6% упавшие тесты • 40 часов в неделю на разбор НЕ МОЖЕМ!
  16. Что нужно? 16

  17. Что нужно? 17 БЫСТРО

  18. Что нужно? 18 БЫСТРО НАДЕЖНО

  19. Что нужно? 19 БЫСТРО НАДЕЖНО МНОГО* * все тесты на

    каждый коммит
  20. Первая мысль 20 Переписать!

  21. Первая мысль 21 Переписать!

  22. Закидай проблему деньгами 22

  23. Закидай проблему деньгами 23 Получили: 1. Надежно Тесты продолжают падать

  24. Закидай проблему деньгами 24 Получили: 1. Надежно Тесты продолжают падать

    2. Много По-прежнему не можем прогнать всё на коммит
  25. Закидай проблему деньгами 25 Получили: 1. Надежно Тесты продолжают падать

    2. Много По-прежнему не можем прогнать всё на коммит 3. Быстрее и независимей
  26. В поисках вечнозелёного 26 Что делать с flaky тестами?

  27. В поисках вечнозелёного 27 Что делать с flaky тестами? ПЛАН:

    1. Взять стабильную версию
  28. В поисках вечнозелёного 28 Что делать с flaky тестами? ПЛАН:

    1. Взять стабильную версию 2. Прогнать тесты
  29. В поисках вечнозелёного 29 Что делать с flaky тестами? ПЛАН:

    1. Взять стабильную версию 2. Прогнать тесты 3. Удалить упавшие тесты
  30. В поисках вечнозелёного 30 Что делать с flaky тестами? ПЛАН:

    1. Взять стабильную версию 2. Прогнать тесты 3. Удалить упавшие тесты 4. Повторить
  31. В поисках вечнозелёного 31 Шла 2038 итерация…

  32. В поисках вечнозелёного 32 Шла 2038 итерация… Мы продолжали удалять

    тесты!
  33. В поисках вечнозелёного 33 План не сработал! Причины: 1. Флакуют

    не только тесты, но и общие компоненты
  34. В поисках вечнозелёного 34 План не сработал! Причины: 1. Флакуют

    не только тесты, но и общие компоненты 2. Нестабильная инфраструктура
  35. В поисках вечнозелёного 35 План не сработал! Причины: 1. Флакуют

    не только тесты, но и общие компоненты 2. Нестабильная инфраструктура 3. Успешные тесты могут порождать упавшие тесты
  36. В поисках вечнозелёного 36 Получили: 1. Надежно Тесты продолжают падать

  37. В поисках вечнозелёного 37 Получили: 1. Надежно Тесты продолжают падать

    2. Достаточно быстро (1 час)
  38. В поисках вечнозелёного 38 Получили: 1. Надежно Тесты продолжают падать

    2. Достаточно быстро (1 час) 3. Меньше, но на каждый коммит
  39. Ошибки прошлого 39 Сергей Быстрых Plesk Карантинная зона для автотестов:

    повышение стабильности и уменьшение трудозатрат
  40. Ошибки прошлого 40 Сергей Быстрых Plesk Карантинная зона для автотестов:

    повышение стабильности и уменьшение трудозатрат Перезапуск ведет к накоплению технического долга!
  41. Делаем выбор 41 Быстро? Надежно? Много?

  42. Делаем выбор 42 Быстро? Надежно? Много? • Время на прогон

    всех тестов – 1 час
  43. Делаем выбор 43 Быстро? Надежно? Много? • Время на прогон

    всех тестов – 1 час • Фиксируем небольшой набор конфигураций и тестов
  44. Делаем выбор 44 Быстро? Надежно? Много? • Время на прогон

    всех тестов – 1 час • Фиксируем небольшой набор конфигураций и тестов • Сосредотачиваемся на стабильности
  45. Делаем выбор 45 Цель: упавший тест = баг в продукте

    Быстро? Надежно! Много? • Время на прогон всех тестов – 1 час • Фиксируем небольшой набор конфигураций и тестов • Сосредотачиваемся на стабильности
  46. Вовлекаем команду 46 Обязательно нужны: • Ментор • Евангелист •

    Перформер
  47. Вовлекаем команду 47

  48. Вовлекаем команду 48 Мы поручили разработчикам разбирать результаты тестов!

  49. Вовлекаем команду 49 Мы поручили разработчикам разбирать результаты тестов! Получили:

    • Первую инструкцию «Как разбирать тесты»
  50. Вовлекаем команду 50 Мы поручили разработчикам разбирать результаты тестов! Получили:

    • Первую инструкцию «Как разбирать тесты» • Первый воркшоп «Как запускать тесты»
  51. Вовлекаем команду 51 Мы поручили разработчикам разбирать результаты тестов! Получили:

    • Первую инструкцию «Как разбирать тесты» • Первый воркшоп «Как запускать тесты» • Улучшенные инструменты разбора
  52. Вовлекаем команду 52 Мы поручили разработчикам разбирать результаты тестов! Получили:

    • Первую инструкцию «Как разбирать тесты» • Первый воркшоп «Как запускать тесты» • Улучшенные инструменты разбора • Тесты начали чиниться
  53. Консистентность: фиксируем всё 53 1. Тесты рядом с кодом

  54. Консистентность: фиксируем всё 54 1. Тесты рядом с кодом 2.

    Любое изменение в системе = коммит
  55. Консистентность: фиксируем всё 55 1. Тесты рядом с кодом 2.

    Любое изменение в системе = коммит Неизвестное изменение демотивирует!
  56. Консистентность: фиксируем всё 56 1. Тесты рядом с кодом 2.

    Любое изменение в системе = коммит 3. Выполни хотя бы пункт 1 Неизвестное изменение демотивирует!
  57. Измеряем всё, что можем 57 Open Tracing Jaeger

  58. Измеряем всё, что можем 58 Grafana Prometheus

  59. Продолжаем вовлекать команду 59

  60. Продолжаем вовлекать команду 60 Две самые частые реакции:

  61. Продолжаем вовлекать команду 61 Это не моё! Две самые частые

    реакции:
  62. Продолжаем вовлекать команду 62 Это не моё! Две самые частые

    реакции:
  63. Настраиваем процессы 63 Максимально просто: • Дежурства

  64. Настраиваем процессы 64 Максимально просто: • Дежурства • Анализ падений

    (их уже мало)
  65. Настраиваем процессы 65 Максимально просто: • Дежурства • Анализ падений

    (их уже мало) • Заведение багов на продукт/тесты
  66. Настраиваем процессы 66 Максимально просто: • Дежурства • Анализ падений

    (их уже мало) • Заведение багов на продукт/тесты • Заполнение таблицы для обобщения причин падений
  67. Настраиваем процессы 67 Максимально просто: • Дежурства • Анализ падений

    (их уже мало) • Заведение багов на продукт/тесты • Заполнение таблицы для обобщения причин падений Не очень: • Много ручной работы
  68. Настраиваем процессы 68 Максимально просто: • Дежурства • Анализ падений

    (их уже мало) • Заведение багов на продукт/тесты • Заполнение таблицы для обобщения причин падений Не очень: • Много ручной работы • Нудная отчетность
  69. Настраиваем процессы 69 Максимально просто: • Дежурства • Анализ падений

    (их уже мало) • Заведение багов на продукт/тесты • Заполнение таблицы для обобщения причин падений Не очень: • Много ручной работы • Нудная отчетность • Невозможно приоритизировать проблемы
  70. Настраиваем процессы 70

  71. Настраиваем процессы 71 Улучшенный процесс: • Договорились как отмечать

  72. Настраиваем процессы 72 Улучшенный процесс: • Договорились как отмечать •

    Всё обсуждение запуска в треде
  73. Настраиваем процессы 73 Улучшенный процесс: • Договорились как отмечать •

    Всё обсуждение запуска в треде • Ссылки на баги в треде
  74. Первый ChatOps 74 Bot: • Анализирует сообщения из slack

  75. Первый ChatOps 75 Bot: • Анализирует сообщения из slack •

    Собирает статистику разборов
  76. Первый ChatOps 76 Bot: • Анализирует сообщения из slack •

    Собирает статистику разборов • Вставляет в jira bugs ссылки на запуски
  77. Первый ChatOps 77 Bot: • Анализирует сообщения из slack •

    Собирает статистику разборов • Вставляет в jira bugs ссылки на запуски • Приоритизирует список проблем
  78. Первый ChatOps 78 Bot: • Анализирует сообщения из slack •

    Собирает статистику разборов • Вставляет в jira bugs ссылки на запуски • Приоритизирует список проблем • Отслеживает активность инженеров
  79. Хвалим 79

  80. Хвалим 80

  81. Хвастаемся 81

  82. Лёд тронулся 82 • Меньше

  83. Лёд тронулся 83 • Меньше • Почти нет «это не

    моё»
  84. Лёд тронулся 84 • Меньше • Почти нет «это не

    моё» • Люди вовлекаются сами
  85. Лёд тронулся 85 • Меньше • Почти нет «это не

    моё» • Люди вовлекаются сами • Хочу так же, но до коммита
  86. Где мы сейчас 86 SLA: 95%

  87. Где мы сейчас 87 SLA: 95%

  88. Где мы сейчас 88 SLA: 95% Цель не достигли, но

    тесты ускорили и обуздали ~ 0,1% упавших тестов на запуск
  89. Пройденный нами путь 89 1. Потратили деньги – купили железо

  90. Пройденный нами путь 90 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты
  91. Пройденный нами путь 91 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты
  92. Пройденный нами путь 92 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов
  93. Пройденный нами путь 93 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера
  94. Пройденный нами путь 94 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline
  95. Пройденный нами путь 95 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов
  96. Пройденный нами путь 96 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов 8. Положили тесты рядом с кодом продукта
  97. Пройденный нами путь 97 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов 8. Положили тесты рядом с кодом продукта 9. Научились измерять
  98. Пройденный нами путь 98 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов 8. Положили тесты рядом с кодом продукта 9. Научились измерять 10. Настроили, затем улучшили процессы
  99. Пройденный нами путь 99 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов 8. Положили тесты рядом с кодом продукта 9. Научились измерять 10. Настроили, затем улучшили процессы 11. Создали ChatOps
  100. Пройденный нами путь 100 1. Потратили деньги – купили железо

    2. Выкинули нестабильные тесты 3. Перестали перезапускать тесты 4. Сосредоточились на стабильности тестов 5. Нашли ментора, евангелиста и перформера 6. Создали Pipeline 7. Поручили разработчикам разбирать результаты тестов 8. Положили тесты рядом с кодом продукта 9. Научились измерять 10. Настроили, затем улучшили процессы 11. Создали ChatOps 12. Научились хвалить и хвастаться
  101. Сергей Быстрых Руководитель отдела Tools & Infrastructure Plesk Вопросы? sergey.bystrykh

    www.plesk.com sbystrykh@plesk.com