Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

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

Oleg Nenashev

June 06, 2020
Tweet

More Decks by Oleg Nenashev

Other Decks in Programming

Transcript

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  5. © 2020 CloudBees, Inc. All Rights Reserved.
    CI/CD – это процесс, а не средства
    Time to Market
    Time to Recovery
    5

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. © 2020 CloudBees, Inc. All Rights Reserved.
    “Минимальные изменения”?
    11

    View Slide

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

    View Slide

  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

    View Slide

  14. © 2020 CloudBees, Inc. All Rights Reserved. 14
    IT IS OVER
    9000 DEPENDENCIES

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. © 2020 CloudBees, Inc. All Rights Reserved.
    Как часто Вы обновляете зависимости?
    18

    View Slide

  19. © 2020 CloudBees, Inc. All Rights Reserved.
    Обновлять нельзя,оставить
    aka “работает – не трогай”
    19

    View Slide

  20. © 2020 CloudBees, Inc. All Rights Reserved.
    Почему?
    Сложно тестировать
    Нет времени
    И так сойдет
    20

    View Slide

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

    View Slide

  22. © 2020 CloudBees, Inc. All Rights Reserved.
    Апдейт - возможность
    прочувствовать
    технический долг
    22

    View Slide

  23. © 2020 CloudBees, Inc. All Rights Reserved. 23
    https://2019.jokerconf.com/2019/talks/rjhhmugp5tzqbmlmg3mcm/

    View Slide

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

    View Slide

  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:
    • Обновить несколько библиотек
    • Автоматизировать тесты

    View Slide

  26. © 2020 CloudBees, Inc. All Rights Reserved.
    Обновление и
    бинарная
    совместимость
    26

    View Slide

  27. © 2020 CloudBees, Inc. All Rights Reserved.
    Наши “друзья”
    ClassNotFoundException
    MethodNotFoundException
    AbstractMethodError
    LinkageError
    27

    View Slide

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

    View Slide

  29. © 2020 CloudBees, Inc. All Rights Reserved.
    Апдейт - возможность
    прочувствовать
    технический долг
    29

    View Slide

  30. © 2020 CloudBees, Inc. All Rights Reserved.
    Обновлять,нельзя оставить
    30

    View Slide

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

    View Slide

  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
    Производительность команды
    Обновляем
    всё разом
    Обновляем
    последовательно
    Число
    задач

    View Slide

  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
    ДЕДЛАЙН
    Производительность команды
    Обновляем
    последовательно
    Обновляем
    всё разом
    Число
    задач

    View Slide

  34. © 2020 CloudBees, Inc. All Rights Reserved. 34
    ? ? ?
    > mvn versions:display-dependency-updates

    View Slide

  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

    View Slide

  36. © 2020 CloudBees, Inc. All Rights Reserved.
    Наши тулы

    Maven /Gradle

    Parent POM

    Maven SureFire, JUnit/etc.

    SpotBugs, Animal Sniffer, Maven Enforcer

    JaCoCo и Cobertura

    Свои Maven-плагины
    36

    View Slide

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

    View Slide

  38. © 2020 CloudBees, Inc. All Rights Reserved.
    Транзитивные
    зависимости…
    38
    ПОТОМУ ЧТО
    MAVEN

    View Slide

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

    View Slide

  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

    View Slide

  41. © 2020 CloudBees, Inc. All Rights Reserved.
    Транзитивные зависимости
    ● И снова Maven Enforcer Plugin
    ● requireUpperBoundDeps


    commons-logging:commons-logging
    com.google.code.findbugs:jsr305
    net.java.dev.jna:jna


    41

    View Slide

  42. © 2020 CloudBees, Inc. All Rights Reserved.
    ● banDuplicateClasses
    ● enforceBytecodeVersion
    ● banCircularDependencies
    ● …
    Extra Enforcer Rules Plugin
    42
    https://www.mojohaus.org/extra-enforcer-rules/

    View Slide

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

    maven-enforcer-plugin






    1.8

    test






    extra-enforcer-rules

    43

    View Slide

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

    maven-enforcer-plugin






    1.8

    test






    extra-enforcer-rules


    1.8

    test


    View Slide

  45. © 2020 CloudBees, Inc. All Rights Reserved.
    Автоматизация зависимостей?
    45

    View Slide

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

    View Slide

  47. 47
    Dependabot, Renovate, Greenkeeper, etc.

    View Slide

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

    View Slide

  49. © 2020 CloudBees, Inc. All Rights Reserved.
    Dependabot
    ● CLI – для GitHub, GitLab и Azure DevOps
    ● SaaS + GitHub App
    49
    dependabot.com, acquired by GitHub

    View Slide

  50. © 2020 CloudBees, Inc. All Rights Reserved.
    Automatic scans and updates
    50

    View Slide

  51. 51

    View Slide

  52. 52

    View Slide

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

    View Slide

  54. © 2020 CloudBees, Inc. All Rights Reserved.
    Шаг 2. Доступ к репозиториям
    54

    View Slide

  55. © 2020 CloudBees, Inc. All Rights Reserved.
    Шаг 3. Настройка
    55

    View Slide

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

    View Slide

  57. © 2020 CloudBees, Inc. All Rights Reserved.
    Dependabot –
    это не только pull request
    57

    View Slide

  58. © 2020 CloudBees, Inc. All Rights Reserved.
    Release notes
    58

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  64. © 2020 CloudBees, Inc. All Rights Reserved.
    Dependabot в Jenkins
    • Начали использовать в 2019
    • 80+ репозиториев
    • 4500+ pull requests
    • Экономит время!
    64

    View Slide

  65. © 2020 CloudBees, Inc. All Rights Reserved. 65
    https://jenkins.devstats.cd.foundation/

    View Slide

  66. © 2020 CloudBees, Inc. All Rights Reserved.
    Стоимость CI/CD
    Ресурсы для сборки
    API rate limit
    Время на ревью
    66

    View Slide

  67. © 2020 CloudBees, Inc. All Rights Reserved.
    Bill of Materials (BOM)
    67

    View Slide

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

    View Slide

  69. © 2020 CloudBees, Inc. All Rights Reserved.
    Включаем BOM в Maven



    ${GROUP_ID}
    ${ARTIFACT_ID}
    ${VERSION_ID}
    import
    pom



    69

    View Slide

  70. © 2020 CloudBees, Inc. All Rights Reserved.
    Используем BOM в Maven


    org.jenkins-ci.plugins.workflow
    workflow-cps
    test


    70
    ВЕРСИИ НЕТ!

    View Slide

  71. © 2020 CloudBees, Inc. All Rights Reserved.
    Пример
    https://github.com/jenkinsci/jenkins/tree/master/bom
    https://github.com/jenkinsci/bom
    71

    View Slide

  72. © 2020 CloudBees, Inc. All Rights Reserved.
    CI/CD – Pipeline of Pipeline
    72
    Bill of
    Materials
    • Версионирование
    • Интеграционные тесты
    • Анализ зависимостей
    • CI/CD
    Наш
    проект
    Внешние
    зависимости

    View Slide

  73. © 2020 CloudBees, Inc. All Rights Reserved.
    Demo!
    https://github.com/jenkinsci/jenkinsfile-runner
    73

    View Slide

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

    View Slide

  75. © 2020 CloudBees, Inc. All Rights Reserved.
    Что Вы можете сделать после доклада?
    Добавьте Maven Enforcer и правила в свой проект
    Попробуйте Dependabot или подобные тулы
    75

    View Slide

  76. © 2020 CloudBees, Inc. All Rights Reserved.
    Contacts:
    E-mail: [email protected]
    GitHub: oleg-nenashev
    Twitter: @oleg_nenashev
    ВОПРОСЫ?
    76

    View Slide