Олег Ненашев — Groovy DSL в Jenkins и Pipeline

Олег Ненашев — Groovy DSL в Jenkins и Pipeline

Рассказ о том, как в Jenkins реализован Groovy DSL для задач Configuration-as-Code. Какие DSL используются в Jenkins, и почему их так много? Мы поговорим о том, как в Jenkins Pipeline реализованы Groovy Sandbox, доступ к API Java, Script Security и персистентность контекста при рестарте. Какие проблемы это вызывает в пользовательских скриптах? И как можно расширять и поддерживать DSL для частных задач?

3fc5b5eb32bd3b48d7810fd67b37f9a1?s=128

Moscow JUG

July 27, 2017
Tweet

Transcript

  1. Groovy DSL в Jenkins и Pipeline Олег Ненашев CloudBees, Inc.

    Совместный митап: Jenkins Msk и jug.msk.ru 27 июля 2017
  2. © 2017 CloudBees, Inc. All Rights Reserved. 2 Обо мне

    @oleg_nenashev oleg-nenashev
  3. © 2017 CloudBees, Inc. All Rights Reserved. 3 Oleg’s “Hall

    of Shame”(c) • Jenkins Core • Windows Service Wrapper • Плагины • Remoting
  4. © 2017 CloudBees, Inc. All Rights Reserved. 4 /me и

    Java • 2006 - J# и Java ME • 2010+ - патчи в Hudson/Jenkins • 2013+ - J&J fun non-stop • Не являюсь… •Экспертом в Groovy @oleg_nenashev oleg-nenashev
  5. © 2017 CloudBees, Inc. All Rights Reserved. 5 üGROOVY DSL

    В JENKINS О чём доклад?
  6. © 2017 CloudBees, Inc. All Rights Reserved. 6 О чём

    доклад? Groovy DSL в Jenkins. Виды • Configuration-as-Code • User space: плагины, JobDSL, Scriptler О безопасности Groovy DSL в Jenkins Современный движок Groovy DSL • Groovy Sandbox, Script Security, и т.д. Groovy DSL в Jenkins Pipeline
  7. © 2017 CloudBees, Inc. All Rights Reserved. 7 1. Один

    из наиболее популярных CI/CD тулов 2. Независимый open-source проект 3. Большое сообщество 4. Коммерческая поддержка (опц.) 5. … Who is Mr. Jenkins? https://jenkins.io
  8. © 2017 CloudBees, Inc. All Rights Reserved. 8 Jenkins –

    Сервер CI/CD для ПО Вы согласны?
  9. © 2017 CloudBees, Inc. All Rights Reserved. 9 Jenkins –

    Software CI/CD Server – Фреймворк автоматизации Disclaimer: IMHO
  10. © 2017 CloudBees, Inc. All Rights Reserved. 10 Система Docs

    Plugins Configs Infra- structure Samples Demos Система автоматизации Infra- structure Infra- structure • Framework • Orchestrator
  11. © 2017 CloudBees, Inc. All Rights Reserved. 11 •Плагинов мало

    •Нужны скриптовые языки Фреймворку нужна кастомизация…
  12. © 2017 CloudBees, Inc. All Rights Reserved. 12 Системные скрипты

    в Jenkins • В составе плагинов • Configuration-as-Code • Скриптовый язык в плагинах • Замена плагинов
  13. © 2017 CloudBees, Inc. All Rights Reserved. 13

  14. © 2017 CloudBees, Inc. All Rights Reserved. 14 •Близость к

    Java •Полный доступ к JVM •… Почему Groovy?
  15. © 2017 CloudBees, Inc. All Rights Reserved. 15 Configuration as

    Code в Jenkins Задачи Системные конфигурации
  16. © 2017 CloudBees, Inc. All Rights Reserved. 16 Configuration as

    Code в Jenkins Задачи Системные конфигурации
  17. © 2017 CloudBees, Inc. All Rights Reserved. 17 Системные конфигурации…

    as Code Внешние тулы Jenkins CLI and REST API python-jenkins jenkins-client (java) Configuration Management Ansible, Chef, … Docker, Docker Compose ... Решения внутри проекта Jenkins Groovy Boot Hooks System Config DSL (alpha) Groovy Plugin, Scriptler Plugin SCM Sync Configuration Нестабилен Just examples…
  18. © 2017 CloudBees, Inc. All Rights Reserved. 18 • Репозиторий

    для системных Groovy-скриптов • Решаемые задачи: • Управление конфигурациями Jenkins • Управление ими… в рантайме • Кастомные шаги сборки • Недостатки • Заблокирован, SECURITY Scriptler Plugin https://plugins.jenkins.io/scriptler
  19. © 2017 CloudBees, Inc. All Rights Reserved. 19 Scriptler Plugin

    • Внешние репозитории скриптов • Приватные репозитории • Документация J
  20. © 2017 CloudBees, Inc. All Rights Reserved. 20 Scriptler Plugin

  21. © 2017 CloudBees, Inc. All Rights Reserved. 21 System Config

    DSL Plugin • Groovy DSL • Source: • https://github.com/jenkinsci/system -config-dsl-plugin • Начат Kohsuke Kawaguchi в 2015 • Работает для базовых задач • Заброшен
  22. © 2017 CloudBees, Inc. All Rights Reserved. 22

  23. © 2017 CloudBees, Inc. All Rights Reserved. 23 Groovy Hooks!

  24. © 2017 CloudBees, Inc. All Rights Reserved. 24 Groovy Hooks

    • Универсальное решение • Расширяемых механизм хуков • init, boot-failure – в ядре • Скрипты • WEB-INF/HOOK.groovy в jenkins.war • WEB-INF/HOOK.groovy.d/*.groovy в jenkins.war • $JENKINS_HOME/HOOK.groovy • $JENKINS_HOME/HOOK.groovy.d/*.groovy в lexical order https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Hook+Script
  25. © 2017 CloudBees, Inc. All Rights Reserved. 25 https://hub.docker.com/r/onenashev/ demo-jenkins-config-as-code/

    Groovy Hooks
  26. © 2017 CloudBees, Inc. All Rights Reserved. 26 Groovy Hooks

    Все возможности Groovy Полный доступ к рантайму Декларативное описание Интеграция с IDE Плюсы:
  27. © 2017 CloudBees, Inc. All Rights Reserved. 27 Groovy Hooks

    Все возможности Groovy Полный доступ к рантайму Декларативное описание Интеграция с IDE СОВСЕМ полный доступ к рантайму: приватные поля/методы Проблемы с CLASSPATH: сложно добавить классы Затруднена отладка Плюсы: Минусы:
  28. © 2017 CloudBees, Inc. All Rights Reserved. 28 Configuration as

    Code в Jenkins Задачи Системные конфигурации
  29. © 2017 CloudBees, Inc. All Rights Reserved. 29 Configuration as

    Code для Задач Типы задач Pipeline JobDSL ... Плагины для задач Groovy, Scriptler Mail-Ext, EnvInject ... Окружение Script Run Listener Shared Resources ...
  30. © 2017 CloudBees, Inc. All Rights Reserved. 30 Почему НЕ

    Groovy? • Пользователи могут редактировать задачи • Прямой доступ в JVM… •System.exit(0) в задаче?
  31. © 2017 CloudBees, Inc. All Rights Reserved. 31 Scryptocalypse https://jenkins.io/security/advisory/2017-04-10/

    • Затронуто более 30 плагинов •Groovy Plugin •JobDSL Plugin •Grails Plugin •Scriptler Plugin • Часть заблокирована до сих пор
  32. © 2017 CloudBees, Inc. All Rights Reserved. 32 •Разрешение Jenkins.RunScripts

    круче админа •Пользователи могут запускать скрипты без сэндбокса by-design (EnvInject, MailExt) •Ошибки в home-made защите •Валидация полей, CSRF, CLI, … Причины уязвимостей
  33. © 2017 CloudBees, Inc. All Rights Reserved. 33 Сделай сам

  34. © 2017 CloudBees, Inc. All Rights Reserved. 34 Сделай сам

    Jenkins Script Security https://plugins.jenkins.io/ script-security
  35. © 2017 CloudBees, Inc. All Rights Reserved. 35 Script Security

    Plugin Используется почти во всех Groovy-плагинах https://plugins.jenkins.io/script-security
  36. © 2017 CloudBees, Inc. All Rights Reserved. 36 •Ориентирован на

    Groovy •Может быть использован для других языков •2 режима Script Security Plugin
  37. © 2017 CloudBees, Inc. All Rights Reserved. 37 Режимы Script

    Approval • Одобряется скрипт целиком • Автоматическое одобрение для админа • Изменение пользователем требует одобрения Groovy Sandbox • http://groovy-sandbox.kohsuke.org/ • Пользователь может писать скрипты • Одобрение для вызовов • Whitelist и Blacklist Режимы Script Security
  38. © 2017 CloudBees, Inc. All Rights Reserved. 38 https://hub.docker.com/r/onenashev/ demo-jenkins-config-as-code/

  39. © 2017 CloudBees, Inc. All Rights Reserved. 39 Groovy Sandbox

    • Ограниченный доступ к низкоуровневым операциям (File, System, …) • Ограниченный доступ к публичному API Jenkins • Ограниченный доступ ко всему остальному
  40. © 2017 CloudBees, Inc. All Rights Reserved. 40 Викторина Чем

    опасен метод System.exit() ?
  41. © 2017 CloudBees, Inc. All Rights Reserved. 41 Викторина Чем

    опасен метод java.net.URL openConnection() ?
  42. © 2017 CloudBees, Inc. All Rights Reserved. 42 Script Security.

    Чёрные списки • Заранее опасные методы • Примеры: •new java.io.File java.lang.String •staticMethod groovy.json.JsonOutput toJson java.lang.Object •method java.lang.Class getResource java.lang.String •method java.net.URL openConnection •staticMethod jenkins.model.Jenkins getInstance https://github.com/jenkinsci/script-security- plugin/blob/master/src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/blacklist
  43. © 2017 CloudBees, Inc. All Rights Reserved. 43 Script Security.

    Белые списки • Формируется вручную в плагине • Примеры: • method groovy.lang.Binding hasVariable java.lang.String • staticField groovy.lang.Closure DELEGATE_FIRST • staticMethod java.lang.Boolean parseBoolean java.lang.String • method hudson.model.AbstractBuild getEnvironments https://github.com/jenkinsci/script-security-plugin/tree/master/src/main/resources/ org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists
  44. © 2017 CloudBees, Inc. All Rights Reserved. 44 Script Security.

    API • Аннотация @Whitelisted • Расширения • https://jenkins.io/doc/developer/ext ensions/script-security/ • ApprovalListener • Language • Whitelist @Whitelisted public int getTimeout() { return timeout; } @Whitelisted public void setTimeout(int timeout) { this.timeout = timeout; } Permissive Script Security Plugin
  45. © 2017 CloudBees, Inc. All Rights Reserved. 45

  46. © 2017 CloudBees, Inc. All Rights Reserved. 46 •Много ручных

    аппрувов для Advanced-скриптов •Run / Fix / Run для новых скриптов •Blacklist расширяется при апдейтах Проблемы
  47. © 2017 CloudBees, Inc. All Rights Reserved. 47

  48. © 2017 CloudBees, Inc. All Rights Reserved. 48 Примеры SECURITY-проблем

    в Sandbox • SECURITY-538 / CVE-2017-1000095 – 10.07.2017 • Регрессия • DefaultGroovyMethods.putAt(Object, String, Object) • DefaultGroovyMethods.getAt(Object, String) • Эксплойт: currentBuild['rawBuild'] • SECURITY-258 / CVE-2016-3102 - 11.04.2016 • Прямой доступ к полям объектов • Эксплойт: foo.@bar
  49. Специфика Jenkins Pipeline

  50. © 2017 CloudBees, Inc. All Rights Reserved. 50 Jenkins Pipeline

    is a… 1. Groovy DSL for automatic flow description - defined in SCM (Jenkinsfile) - defined in Job configuration // Run on a node having the “my_fpga” label node("linux && ml509") { git url:"http://github.com/myorg/myproject.git" sh "make all" } http://bit.ly/pipeline-tutorial
  51. © 2017 CloudBees, Inc. All Rights Reserved. 51 Jenkins Pipeline

    is a… 1. Groovy DSL for automatic flow description 2. Item type Pipeline Job Multi-Branch Pipeline Organization Folder • GitHub • BitBucket* • …
  52. © 2017 CloudBees, Inc. All Rights Reserved. 52 Jenkins Pipeline

    is a… 1. Groovy DSL for automatic flow description 2. Item type 3. Pipeline as Code Ecosystem
  53. © 2017 CloudBees, Inc. All Rights Reserved. 53 Branch- Source,

    BlueOcean, ... 89 - explicit support 42 - Pipeline- specific Documentation Samples Development Tools Jenkins Pipeline Ecosystem Plugins:
  54. © 2017 CloudBees, Inc. All Rights Reserved. 54 Основные возможности

    Независимость от агента и рабочей директории Параллелизация Устойчивость к рестарту мастера Устойчивость к разрывам сети
  55. © 2017 CloudBees, Inc. All Rights Reserved. 55 Пример. CD

    для Jenkins IRC Bot def imageName = 'jenkinsciinfra/ircbot’ node('docker') { checkout scm def imageTag = findTag() stage('Build ircbot’) { withMavenEnv (["BUILD_NUMBER=${env.BUILD_NUMBER}:${commit}"]) { sh 'make bot' // Make invokes Maven }} stage ('Build & Deploy container’) { def img = docker.build("${imageName}:${imageTag}”) img.push() } } https://github.com/jenkins-infra/ircbot Docker Registry Server Jenkins SCM Puppet
  56. © 2017 CloudBees, Inc. All Rights Reserved. 56 Синтаксический сахар

    над Pipeline • “pipeline { }” closure Секции для типовых задач • Простая настройка • Больше статического анализа • Меньше гибкость L 56 Декларативный Pipeline https://github.com/jenkinsci/pipeline- model-definition-plugin/wiki
  57. © 2017 CloudBees, Inc. All Rights Reserved. 57 57 pipeline

    { agent label:"generic-linux" tools { maven "Maven 3.3.9" jdk "Oracle JDK 8u40" } stages { stage("build") { steps { sh 'mvn clean install -Dmaven.test.failure.ignore=true' } } } post { always { junit "path/to/xml" } failure { mail to:"me@ema.il", subject:"FAILURE:${currentBuild.name}", …} } } Пример. Декларативный Pipeline
  58. Особенности движка Pipeline • http://www.groovy-lang.org/

  59. © 2017 CloudBees, Inc. All Rights Reserved. 59 Pipeline DSL

    ВСЕГДА исполняется на мастере
  60. © 2017 CloudBees, Inc. All Rights Reserved. 60 Как работает

    сборка в Jenkins? Мастер Агент RPC вызовы Вызов системной команды RemoteInputStream/ RemoteOutputStream Недостающие классы • Логи • Артефакты
  61. © 2017 CloudBees, Inc. All Rights Reserved. 61 •Вызовы java.io.File(s)

    не имеют смысла •Запросы должны выполняться через Remoting •Плагин: Pipeline Basic Steps Pipeline DSL ВСЕГДА исполняется на мастере
  62. © 2017 CloudBees, Inc. All Rights Reserved. 62 Основные возможности

    Независимость от агента и рабочей директории Параллелизация Устойчивость к рестарту мастера Устойчивость к разрывам сети
  63. © 2017 CloudBees, Inc. All Rights Reserved. 63 Pipeline CPS

    • CPS = Continuation-passing style • На шагах контекст сериализуется на диск (XML) • При рестарте контекст восстанавливается… NonCPS CPS
  64. © 2017 CloudBees, Inc. All Rights Reserved. 64 Хранение контекста

    – CPS/NonCPS • Решение – Аннотация NonCPS (откат на CPS при рестарте)
  65. © 2017 CloudBees, Inc. All Rights Reserved. 65 Пример •

    Нельзя Вызывать NonCPS из CPS • Стандартные методы (toString(), hashCode()) должны быть с @NonCPS @NonCPS def dumpEnvVars() { def str = "Dumping build environment variables...\n" for (Map.Entry<String, String> entry : currentBuild.build().environment) { str += " ${entry.key} = ${entry.value}\n" } echo str }
  66. © 2017 CloudBees, Inc. All Rights Reserved. 66 => Обработка

    ошибок Scripted Pipeline Декларативный Pipeline try/catch() на каждый чих L
  67. © 2017 CloudBees, Inc. All Rights Reserved. 67 •Ссылки по

    классам сложны: •Движок @Symbol Символы
  68. © 2017 CloudBees, Inc. All Rights Reserved. 68 Символы -

    @Symbol • Было: • Стало:
  69. Повторное использование Pipeline. библиотеки

  70. © 2017 CloudBees, Inc. All Rights Reserved. 70 Повторное использование

    кода 2015 • load() Начало 2016 • Global Pipeline Library • Pipeline Remote Loader Plugin Конец 2016 • Pipeline Shared Libraries • Управление библиотеками • Поддержка @Grab – можно включать обычные библиотеки Структура:
  71. © 2017 CloudBees, Inc. All Rights Reserved. 71 Pipeline Shared

    Libraries • Библиотеки лежат в SCM • Версионирование • Области видимости ▸System-wide ▸Folder ▸Job
  72. © 2017 CloudBees, Inc. All Rights Reserved. 72 Библиотеки в

    Scripted Pipeline com.mycorp.libs.make Jenkinsfile makeProject() makeProject() implementation - global variable com.mycorp.libs.coverity com.mycorp.libs.cppunit Globally-defined library, automatic update @Library() definition
  73. © 2017 CloudBees, Inc. All Rights Reserved. 73 Пример. Импорт

  74. © 2017 CloudBees, Inc. All Rights Reserved. 74 Пример. Импорт

    по-умолчанию
  75. © 2017 CloudBees, Inc. All Rights Reserved. 75 buildPlugin()

  76. © 2017 CloudBees, Inc. All Rights Reserved. 76 buildPlugin(). Как

    это работает?
  77. © 2017 CloudBees, Inc. All Rights Reserved. 77 buildPlugin(). Как

    это работает? … Pure Pipeline DSL
  78. © 2017 CloudBees, Inc. All Rights Reserved. 78 https://hub.docker.com/r/onenashev/ demo-jenkins-config-as-code/

  79. Заключение

  80. © 2017 CloudBees, Inc. All Rights Reserved. 80 Lessons Learnt

    • Упрощается администрирование системы • … и разработка задач (при наличии фреймворка) • Открывается дорога к Configuration as Code и простым UI
  81. © 2017 CloudBees, Inc. All Rights Reserved. 81 Lessons Learnt

    • Упрощается администрирование системы • … и разработка задач (при наличии фреймворка) • Открывается дорога к Configuration as Code и простым UI • НО: • Pipeline DSL != Groovy • Баги, не хватает интеграций • Не хватает инструментальной поддержки в IDE • Обучение пользователей затруднено
  82. © 2017 CloudBees, Inc. All Rights Reserved. 82 Pipeline. Средства

    разработки IDE Integration Unit Test Framework Static Analysis Library manager Debug tools Documen- tation Easy script deployment Freestyle => Pipeline Converter Good Not enough Missing
  83. © 2017 CloudBees, Inc. All Rights Reserved. 83 Видите дыру

    в Jenkins? • Не говорите об этом во время Q&A • Cоздайте баг в проекте SECUIRTY •https://wiki.jenkins.io/display/JENKINS/How +to+report+an+issue • Bug bounty: •https://wiki.jenkins.io/display/JENKINS/Rew ards+for+reporting+security+issues
  84. © 2017 CloudBees, Inc. All Rights Reserved. 84 Итого •

    Groovy DSL – один из основных движков Configuration-as-Code в Jenkins • Groovy DSL повышает гибкость системы • DSL сложнее разрабатывать и поддерживать, если не знать как • Надо пробовать: •Configuration-as-Code •Pipeline/JobDSL
  85. © 2017 CloudBees, Inc. All Rights Reserved. 85 Ссылки •

    Jenkins project • Веб-сайт проекта: https://jenkins.io • CloudBees • Community-портал: https://go.cloudbees.com/ • Jenkins Pipeline • Getting Started: http://bit.ly/pipeline-tutorial • Совместимость: http://bit.ly/pipeline-compatibility • Примеры: https://github.com/jenkinsci/pipeline-examples
  86. © 2017 CloudBees, Inc. All Rights Reserved. 86 Спасибо! Контакты:

    E-mail: onenashev@cloudbees.com GitHub: oleg-nenashev Twitter: @oleg_nenashev
  87. Software at the speed of ideas СПАСИБО! www.cloudbees.com