«Обновлять нельзя оставить». Управляем зависимостями в CI/CD (RUS)

«Обновлять нельзя оставить». Управляем зависимостями в CI/CD (RUS)

Если хотите построить процесс CI/CD для большого проекта, вы неминуемо столкнетесь с проблемой управления зависимостями. В реальном проекте могут быть сотни и тысячи зависимостей, для которых постоянно выходят обновления. Не обновлять часто нельзя (уязвимости, критические баги), но любое изменение может привнести новые дефекты. Сизифов труд, да?

В этом докладе Олег расскажет о том, какие средства контроля и управления зависимостями доступны разработчикам. Мы поговорим о ботах для автоматического апдейта зависимостей (Dependabot) и о том, как предотвратить dependency hell с помощью средств Maven (Maven Enforcer Plugin и т.д.) и Bill of Materials. После этого мы совместим все компоненты в единый pipeline.

568e3391c8b528f2b255443e4cca27ca?s=128

Oleg Nenashev

June 06, 2020
Tweet

Transcript

  1. © 2020 CloudBees, Inc. All Rights Reserved. © 2020 CloudBees,

    Inc. All Rights Reserved. «Обновлять нельзя оставить» Управляем зависимостями в CI/CD Олег Ненашев, CloudBees @oleg_nenashev
  2. © 2020 CloudBees, Inc. All Rights Reserved. > whoami @oleg_nenashev

    oleg-nenashev • Principal SW Engineer, CloudBees • Jenkins Core maintainer • Jenkins Board Member • CDF Ambassador 2
  3. © 2020 CloudBees, Inc. All Rights Reserved. О чём доклад?

    V – Управление зависимостями V – На примере Java/Maven V - Cтандартные тулы X - Jenkins X - Дебри Java X - OSGi, модули, … 3
  4. © 2020 CloudBees, Inc. All Rights Reserved. Что в докладе?

    CI/CD. И причем тут зависимости? Maven и Maven Enforcer Боты, на примере Dependabot Bill of Materials Демо 4
  5. © 2020 CloudBees, Inc. All Rights Reserved. CI/CD – это

    процесс, а не средства Time to Market Time to Recovery 5
  6. © 2020 CloudBees, Inc. All Rights Reserved. • Ранняя интеграция

    и тестирование изменений • Быстрый и частый мердж в мастер • Автоматизация • Тестовое покрытие • Прозрачность статуса • Минимальные изменения Основы Continuous Integration 6 https://martinfowler.com/articles/continuousIntegration.html
  7. © 2020 CloudBees, Inc. All Rights Reserved. Сборка Merge Юнит-тесты

    Статический анализ Интеграционные тесты Типовой Pipeline 7 Тесты, Тесты, Тесты . . .
  8. © 2020 CloudBees, Inc. All Rights Reserved. А зачем библиотеки?

    8 1. Взять компоненты из библиотеки
  9. © 2020 CloudBees, Inc. All Rights Reserved. Что делать пользователям?

    9 1. Взять компоненты из библиотеки 2. Собрать свой велосипед проект Просто добавь клея!
  10. © 2020 CloudBees, Inc. All Rights Reserved. • Ранняя интеграция

    и тестирование изменений • Автоматизация • Быстрый и частый мердж в мастер • Тестовое покрытие • Прозрачность статуса • Минимальные изменения Основы CI/CD 10
  11. © 2020 CloudBees, Inc. All Rights Reserved. “Минимальные изменения”? 11

  12. © 2020 CloudBees, Inc. All Rights Reserved. Dependency Hell 12

  13. © 2020 CloudBees, Inc. All Rights Reserved. Lib 1 Lib

    2 Lib 3 Plugin 1 Plugin 2 Plugin 3 Lib 5 Lib 6 Plugin 4 иногда 13 + Средства разработки Наш проект Lib 4
  14. © 2020 CloudBees, Inc. All Rights Reserved. 14 IT IS

    OVER 9000 DEPENDENCIES
  15. © 2020 CloudBees, Inc. All Rights Reserved. Pipeline Pipeline’ов 15

    Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты
  16. © 2020 CloudBees, Inc. All Rights Reserved. Pipeline Pipeline’ов 16

    Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты
  17. © 2020 CloudBees, Inc. All Rights Reserved. Pipeline Pipeline’ов 17

    Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты Сборка Merge Юнит-тесты Статический анализ Интеграционные тесты
  18. © 2020 CloudBees, Inc. All Rights Reserved. Как часто Вы

    обновляете зависимости? 18
  19. © 2020 CloudBees, Inc. All Rights Reserved. Обновлять нельзя,оставить aka

    “работает – не трогай” 19
  20. © 2020 CloudBees, Inc. All Rights Reserved. Почему? Сложно тестировать

    Нет времени И так сойдет 20
  21. © 2020 CloudBees, Inc. All Rights Reserved. Не сойдёт! Нужны

    новые фичи Багфиксы Security-апдейты  21 https://snyk.io/vuln/maven:com.fasterxml.jackson.core%3Ajackson-databind Пример: jackson-databind
  22. © 2020 CloudBees, Inc. All Rights Reserved. Апдейт - возможность

    прочувствовать технический долг 22
  23. © 2020 CloudBees, Inc. All Rights Reserved. 23 https://2019.jokerconf.com/2019/talks/rjhhmugp5tzqbmlmg3mcm/

  24. © 2020 CloudBees, Inc. All Rights Reserved. Экосистема Jenkins Ядро

    и модули Плагины Дистрибутивы Подпроекты Библиотеки Средства разработки 24
  25. © 2020 CloudBees, Inc. All Rights Reserved. Java 10 PoC

    - июнь 2018 Java 11 PoC - сентябрь 2018 Java 11 RC - декабрь 2018 Java 11 GA - март 2019 25 ? ? ? TODO: • Обновить несколько библиотек • Автоматизировать тесты
  26. © 2020 CloudBees, Inc. All Rights Reserved. Обновление и бинарная

    совместимость 26
  27. © 2020 CloudBees, Inc. All Rights Reserved. Наши “друзья” ClassNotFoundException

    MethodNotFoundException AbstractMethodError LinkageError 27
  28. © 2020 CloudBees, Inc. All Rights Reserved. Тулы не работают

    Нет фиксов для Java 9+ Несовместимые изменения Библиотеки требуют Java 9+ Мёртвые проекты 28
  29. © 2020 CloudBees, Inc. All Rights Reserved. Апдейт - возможность

    прочувствовать технический долг 29
  30. © 2020 CloudBees, Inc. All Rights Reserved. Обновлять,нельзя оставить 30

  31. © 2020 CloudBees, Inc. All Rights Reserved. Rocket Science Переписать

    всё на Go/Kotlin/{ваш язык} Перейти на микросервисы OSGi Модули Java … нет 31
  32. © 2020 CloudBees, Inc. All Rights Reserved. 32 Источник изображения:

    https://newsroom.unsw.edu.au/news/health/we- can-shrink-covid-19-curve-rather-just-flatten-it Производительность команды Обновляем всё разом Обновляем последовательно Число задач
  33. © 2020 CloudBees, Inc. All Rights Reserved. 33 Источник изображения:

    https://newsroom.unsw.edu.au/news/health/we- can-shrink-covid-19-curve-rather-just-flatten-it ДЕДЛАЙН Производительность команды Обновляем последовательно Обновляем всё разом Число задач
  34. © 2020 CloudBees, Inc. All Rights Reserved. 34 ? ?

    ? > mvn versions:display-dependency-updates
  35. © 2020 CloudBees, Inc. All Rights Reserved. Maven-плагины The following

    dependencies in Dependencies have newer versions: [INFO] com.github.tomakehurst:wiremock ....................... 1.57 -> 2.26.3 [INFO] com.tngtech.java:junit-dataprovider ................. 1.10.0 -> 1.13.1 [INFO] io.jenkins:configuration-as-code ........................ 1.32 -> 1.41 [INFO] io.rest-assured:rest-assured .......................... 3.3.0 -> 4.3.0 [INFO] org.apache.commons:commons-lang3 ......................... 3.7 -> 3.10 [INFO] org.hamcrest:hamcrest-core ................................ 2.1 -> 2.2 [INFO] org.hamcrest:hamcrest-library ............................. 2.1 -> 2.2 [INFO] org.jenkins-ci.modules:instance-identity .................. 2.1 -> 2.2 … > mvn versions:display-dependency-updates 35
  36. © 2020 CloudBees, Inc. All Rights Reserved. Наши тулы •

    Maven /Gradle • Parent POM • Maven SureFire, JUnit/etc. • SpotBugs, Animal Sniffer, Maven Enforcer • JaCoCo и Cobertura • Свои Maven-плагины 36
  37. © 2020 CloudBees, Inc. All Rights Reserved. Maven не контролирует

    зависимости по умолчанию 37
  38. © 2020 CloudBees, Inc. All Rights Reserved. Транзитивные зависимости… 38

    ПОТОМУ ЧТО MAVEN
  39. © 2020 CloudBees, Inc. All Rights Reserved. 39 Барух Садогурский,

    Кирилл Толкачев — Баттл инструментов для сборки — Maven vs Gradle ПОТОМУ ЧТО MAVEN
  40. © 2020 CloudBees, Inc. All Rights Reserved. • Maven Enforcer

    Plugin https://maven.apache.org/enforcer/maven-enforcer-plugin/ • Extra Enforcer Rules Plugin https://www.mojohaus.org/extra-enforcer-rules/ Что поможет? 40
  41. © 2020 CloudBees, Inc. All Rights Reserved. Транзитивные зависимости •

    И снова Maven Enforcer Plugin • requireUpperBoundDeps <requireUpperBoundDeps> <excludes> <exclude>commons-logging:commons-logging</exclude> <exclude>com.google.code.findbugs:jsr305</exclude> <exclude>net.java.dev.jna:jna</exclude> </excludes> </requireUpperBoundDeps> 41
  42. © 2020 CloudBees, Inc. All Rights Reserved. • banDuplicateClasses •

    enforceBytecodeVersion • banCircularDependencies • … Extra Enforcer Rules Plugin 42 https://www.mojohaus.org/extra-enforcer-rules/
  43. © 2020 CloudBees, Inc. All Rights Reserved. <plugin> <artifactId>maven-enforcer-plugin</artifactId> <executions>

    <execution> … <configuration> <rules> <enforceBytecodeVersion> <maxJdkVersion>1.8</maxJdkVersion> <ignoredScopes> <ignoredScope>test</ignoredScope> </ignoredScopes> </enforceBytecodeVersion> … </executions> <dependencies> … <artifactId>extra-enforcer-rules</artifactId> … 43
  44. © 2020 CloudBees, Inc. All Rights Reserved. 44 <plugin> <artifactId>maven-enforcer-plugin</artifactId>

    <executions> <execution> … <configuration> <rules> <enforceBytecodeVersion> <maxJdkVersion>1.8</maxJdkVersion> <ignoredScopes> <ignoredScope>test</ignoredScope> </ignoredScopes> </enforceBytecodeVersion> … </executions> <dependencies> … <artifactId>extra-enforcer-rules</artifactId> … <enforceBytecodeVersion> <maxJdkVersion>1.8</maxJdkVersion> <ignoredScopes> <ignoredScope>test</ignoredScope> </ignoredScopes> </enforceBytecodeVersion>
  45. © 2020 CloudBees, Inc. All Rights Reserved. Автоматизация зависимостей? 45

  46. © 2020 CloudBees, Inc. All Rights Reserved. https://github.com/marketplace 46

  47. 47 Dependabot, Renovate, Greenkeeper, etc.

  48. © 2020 CloudBees, Inc. All Rights Reserved. Dependabot 48 dependabot.com,

    acquired by GitHub
  49. © 2020 CloudBees, Inc. All Rights Reserved. Dependabot • CLI

    – для GitHub, GitLab и Azure DevOps • SaaS + GitHub App 49 dependabot.com, acquired by GitHub
  50. © 2020 CloudBees, Inc. All Rights Reserved. Automatic scans and

    updates 50
  51. 51

  52. 52

  53. © 2020 CloudBees, Inc. All Rights Reserved. Шаг 1. Enable

    Dependabot 53
  54. © 2020 CloudBees, Inc. All Rights Reserved. Шаг 2. Доступ

    к репозиториям 54
  55. © 2020 CloudBees, Inc. All Rights Reserved. Шаг 3. Настройка

    55
  56. © 2020 CloudBees, Inc. All Rights Reserved. Шаг 4. Подождём…

    56
  57. © 2020 CloudBees, Inc. All Rights Reserved. Dependabot – это

    не только pull request 57
  58. © 2020 CloudBees, Inc. All Rights Reserved. Release notes 58

  59. © 2020 CloudBees, Inc. All Rights Reserved. CommentOps 59

  60. © 2020 CloudBees, Inc. All Rights Reserved. Configuration-as-Code 60

  61. © 2020 CloudBees, Inc. All Rights Reserved. Продвинутые опции Фильтрация

    артефактов Фильтрация версий 61
  62. © 2020 CloudBees, Inc. All Rights Reserved. Продвинутые опции Фильтрация

    артефактов Фильтрация версий Validated merge 62
  63. © 2020 CloudBees, Inc. All Rights Reserved. Продвинутые опции Фильтрация

    артефактов Фильтрация версий Validated merge Интеграция с GitHub Security 63
  64. © 2020 CloudBees, Inc. All Rights Reserved. Dependabot в Jenkins

    • Начали использовать в 2019 • 80+ репозиториев • 4500+ pull requests • Экономит время! 64
  65. © 2020 CloudBees, Inc. All Rights Reserved. 65 https://jenkins.devstats.cd.foundation/

  66. © 2020 CloudBees, Inc. All Rights Reserved. Стоимость CI/CD Ресурсы

    для сборки API rate limit Время на ревью 66
  67. © 2020 CloudBees, Inc. All Rights Reserved. Bill of Materials

    (BOM) 67
  68. © 2020 CloudBees, Inc. All Rights Reserved. BOM – “Библиотека

    зависимостей” 68 Наш проект Bill of Materials Зависимости и версии • Версионирование • Интеграционные тесты • Анализ зависимостей
  69. © 2020 CloudBees, Inc. All Rights Reserved. Включаем BOM в

    Maven <dependencyManagement> <dependencies> <dependency> <groupId>${GROUP_ID}</groupId> <artifactId>${ARTIFACT_ID}</artifactId> <version>${VERSION_ID}</</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> 69
  70. © 2020 CloudBees, Inc. All Rights Reserved. Используем BOM в

    Maven … <dependency> <groupId>org.jenkins-ci.plugins.workflow</groupId> <artifactId>workflow-cps</artifactId> <scope>test</scope> </dependency> … 70 ВЕРСИИ НЕТ!
  71. © 2020 CloudBees, Inc. All Rights Reserved. Пример https://github.com/jenkinsci/jenkins/tree/master/bom https://github.com/jenkinsci/bom

    71
  72. © 2020 CloudBees, Inc. All Rights Reserved. CI/CD – Pipeline

    of Pipeline 72 Bill of Materials • Версионирование • Интеграционные тесты • Анализ зависимостей • CI/CD Наш проект Внешние зависимости
  73. © 2020 CloudBees, Inc. All Rights Reserved. Demo! https://github.com/jenkinsci/jenkinsfile-runner 73

  74. © 2020 CloudBees, Inc. All Rights Reserved. • От апдейта

    не убежишь • Зависимости - отличная возможность прочувствовать технический долг • Обновляться лучше постоянно • Есть средства разработки Заключение 74
  75. © 2020 CloudBees, Inc. All Rights Reserved. Что Вы можете

    сделать после доклада? Добавьте Maven Enforcer и правила в свой проект Попробуйте Dependabot или подобные тулы 75
  76. © 2020 CloudBees, Inc. All Rights Reserved. Contacts: E-mail: onenashev@cloudbees.com

    GitHub: oleg-nenashev Twitter: @oleg_nenashev ВОПРОСЫ? 76