Pro Yearly is on sale from $80 to $50! »

JUG.ru: Groovy DSL в Jenkins и Pipeline. Реализации и грабли (RUS)

568e3391c8b528f2b255443e4cca27ca?s=47 Oleg Nenashev
December 04, 2017

JUG.ru: Groovy DSL в Jenkins и Pipeline. Реализации и грабли (RUS)

Несмотря на появление новых средств CI/CD, Jenkins остается одним из наиболее популярных серверов автоматизации. Он фактически является распределенным веб-сервисом и предоставляет различные DSL, в том числе с доступом к JVM и внутренним API. Давать такой доступ нужно аккуратно, а то в продакшне будет мучительно больно: security, UX, performance, и т.д. О предотвращении этой боли и пойдет разговор.

Олег расскажет:
- как в Jenkins реализованы Groovy DSL и почему их так много;
- как в Jenkins Pipeline реализованы Groovy Sandbox, доступ к API Java, Script Security и персистентность контекста при рестарте;
- какие архитектурные проблемы это вызывает;
- как можно при всем этом расширять и поддерживать DSL для частных задач.

Disclaimer: Цель доклада — поговорить об архитектурных особенностях Jenkins, который в своей основе является распределённым Java-приложением. Мы будем говорить о Jenkins Pipeline и его новомодных фичах (Declarative Pipeline, Blue Ocean), но только в контексте реализации.

Страничка митапа: https://www.meetup.com/St-Petersburg-Jenkins-Meetup/events/245462046/

568e3391c8b528f2b255443e4cca27ca?s=128

Oleg Nenashev

December 04, 2017
Tweet

Transcript

  1. Groovy DSL в Jenkins и Pipeline. Реализации и грабли Олег

    Ненашев CloudBees, Inc. СПб, 4 декабря 2017
  2. © 2017 CloudBees, Inc. All Rights Reserved. 2 Обо мне

    @oleg_nenashev oleg-nenashev librecores.org Jenkins СПб / Jenkins RU Политех
  3. © 2017 CloudBees, Inc. All Rights Reserved. 3 В Jenkins…

    • Jenkins Core • Windows Service Wrapper • Плагины • Remoting
  4. © 2017 CloudBees, Inc. All Rights Reserved. 4 Jenkins #RU

    • Митапы в Москве, СПб и Минске • Gitter: #jenkinsci-ru/public • YouTube: http://bit.ly/jenkins-ru-youtube • Facebook: http://bit.ly/jenkins-ru-facebook • Twitter: @jenkins_ru Москва: Здесь может быть Ваше лого
  5. © 2017 CloudBees, Inc. All Rights Reserved. 5 /me и

    Java • 2006 - J# и Java ME • 2010+ - патчи в Hudson/Jenkins • 2013+ - Jenkins & Java нон-стоп @oleg_nenashev oleg-nenashev
  6. © 2017 CloudBees, Inc. All Rights Reserved. 6 О Вас

  7. © 2017 CloudBees, Inc. All Rights Reserved. 7 О чём

    доклад? Groovy DSL в Jenkins Groovy Sandbox и все-все-все Особенности DSL в Jenkins Pipeline Groovy DSL в Ваши проектах. О чем помнить?
  8. © 2017 CloudBees, Inc. All Rights Reserved. 8 •Pipeline для

    пользователей •Красивых картинок BlueOcean/Pipeline/etc. •Closed-source Чего НЕТ в докладе? Disclaimer: • Презентация отражает личное мнение докладчика • Оно может не совпадать с позицией сообщества Jenkins и/или CloudBees
  9. © 2017 CloudBees, Inc. All Rights Reserved. 9 1. Один

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

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

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

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

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

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

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

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

    это? Groovy-движок в вашем проекте
  18. © 2017 CloudBees, Inc. All Rights Reserved. 18 Groovy-движок на

    1,2,3… <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>${groovy.version}</version> </dependency> http://groovy-lang.org/download.html
  19. © 2017 CloudBees, Inc. All Rights Reserved. 19 Groovy-движок на

    1,2,3… protected void runGroovy(@Nonnull File f) { if (f.exists()) { throw new Error("File does not exist: ${f}") } def compilerConf = CompilerConfiguration.DEFAULT compilerConf.classpath = new File(home, "init.groovy.d/").absolutePath def useConfCP = true def cl = new GroovyClassLoader(System.classLoader, compilerConf, useConfCP) try { def bindings = new Binding() new GroovyShell(cl, bindings).evaluate(new GroovyCodeSource(f)) } catch (IOException e) { throw new Error("Failed to execute " + f, e) } }
  20. © 2017 CloudBees, Inc. All Rights Reserved. 20 Configuration as

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

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

    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 (R.I.P.) Groovy Plugin, Scriptler Plugin SCM Sync Configuration Groovy • Много решений с Groovy • Вызов Groovy-скриптов через CLI
  23. © 2017 CloudBees, Inc. All Rights Reserved. 23 • Репозиторий

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

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

  26. © 2017 CloudBees, Inc. All Rights Reserved. 26 Groovy-хуки •

    Универсальное решение • Расширяемых механизм хуков • 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
  27. © 2017 CloudBees, Inc. All Rights Reserved. 27 Groovy-хуки. Инфа

    http://bit.ly/jenkins_msk_3_groovy_hooks
  28. © 2017 CloudBees, Inc. All Rights Reserved. 28 https://hub.docker.com/r/onenashev/ demo-jenkins-config-as-code/

    Groovy-хуки
  29. © 2017 CloudBees, Inc. All Rights Reserved. 29 Groovy-хуки. Пример

    https://github.com/oleg-nenashev/demo-jenkins-config-as-code
  30. © 2017 CloudBees, Inc. All Rights Reserved. 30 Groovy-хуки Все

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

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

    возможности Groovy Полный доступ к рантайму Декларативное описание Интеграция с IDE СОВСЕМ полный доступ к рантайму Нет поддержки Classpath по- умолчанию Плюсы: Минусы:
  33. © 2017 CloudBees, Inc. All Rights Reserved. 33 Groovy-хуки Все

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

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

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

    метод System.exit()?
  37. © 2017 CloudBees, Inc. All Rights Reserved. 37 Почему НЕ

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

    • Затронуто более 30 плагинов •Groovy Plugin •JobDSL Plugin •Grails Plugin •Scriptler Plugin • Часть заблокирована до сих пор
  39. © 2017 CloudBees, Inc. All Rights Reserved. 39 Вообще-то, это

    не только о Groovy Tcl Plugin •Заблокирован в апреле 2017
  40. © 2017 CloudBees, Inc. All Rights Reserved. 40 Вообще-то, это

    не только о Groovy Tcl Plugin •Заблокирован в апреле 2017 Jenkins Core 2.73.3 •Command Computer Launcher •Запускал команду на мастере… •Прав на редактирование настроек агента было досаточно…
  41. © 2017 CloudBees, Inc. All Rights Reserved. 41 •Разрешение Jenkins.RunScripts

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

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

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

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

    • Скрипт одобряется СТАТИЧЕСКИ по хэшу • Автоматическое одобрение для админа • Ошибка, если скрипт не одобрен • Groovy, Jexl, Jelly, System Command Режимы Script Security
  46. © 2017 CloudBees, Inc. All Rights Reserved. 46 Script Approval

    Groovy Sandbox • Динамическая верификация скриптов при исполнении • Только для Groovy • http://groovy-sandbox.kohsuke.org/ Режимы Script Security
  47. © 2017 CloudBees, Inc. All Rights Reserved. 47 Script Approval

    Groovy Sandbox Режимы Script Security Одобрение classpath
  48. © 2017 CloudBees, Inc. All Rights Reserved. 48 http://groovy-sandbox.kohsuke.org/ https://github.com/jenkinsci/groovy-sandbox

  49. © 2017 CloudBees, Inc. All Rights Reserved. 49 •CompilationCustomizer из

    groovy-all •Потокозависимые интерсепторы •“skin-deep” sandboxing Groovy Sandbox
  50. © 2017 CloudBees, Inc. All Rights Reserved. 50 •Ограниченный доступ

    к низкоуровневым операциям (File, System, …) •Ограниченный доступ к API Jenkins •Whitelist Script Security & Groovy Sandbox
  51. © 2017 CloudBees, Inc. All Rights Reserved. 51 Sandbox и

    Script Security foo.groovy МАГИЯ результат Whitelist скриптов и методов Script Security, Groovy Sandbox, ещё что-то
  52. © 2017 CloudBees, Inc. All Rights Reserved. 52 Sandbox и

    Script Security. Как оно работает? • org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox private static Object evaluate(Whitelist whitelist, String script) { GroovyShell shell = new GroovyShell(GroovySandbox.createSecureCompilerConfiguration()); Object actual = GroovySandbox.run(shell.parse(script), whitelist); if (actual instanceof GString) { actual = actual.toString(); // for ease of comparison } return actual; }
  53. © 2017 CloudBees, Inc. All Rights Reserved. 53 Sandbox и

    Script Security. Как оно работает? foo.groovy Компиляция Стандартный компилятор Groovy • Синтаксический анализатор • SandboxTransformer extends CompilationCustomizer
  54. © 2017 CloudBees, Inc. All Rights Reserved. 54 Sandbox и

    Script Security. Как оно работает? • org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox public static @Nonnull CompilerConfiguration createSecureCompilerConfiguration() { CompilerConfiguration cc = new CompilerConfiguration(); cc.addCompilationCustomizers(new SandboxTransformer()); return cc; }
  55. © 2017 CloudBees, Inc. All Rights Reserved. 55 Sandbox и

    Script Security. Как оно работает? foo.groovy Компиляция Стандартный компилятор Groovy Инструментирование Script Security • Синтаксический анализатор • SandboxTransformer extends CompilationCustomizer • SandboxInterceptor extends GroovyInterceptor – анализ исполняемого кода в динамике
  56. © 2017 CloudBees, Inc. All Rights Reserved. 56 Sandbox и

    Script Security. Как оно работает? public static Object run(@Nonnull Script script, @Nonnull final Whitelist whitelist) throws RejectedAccessException { Whitelist wrapperWhitelist = new ProxyWhitelist( new ClassLoaderWhitelist(script.getClass().getClassLoader()), whitelist); GroovyInterceptor sandbox = new SandboxInterceptor(wrapperWhitelist); sandbox.register(); try { return script.run(); } finally { sandbox.unregister(); } }
  57. © 2017 CloudBees, Inc. All Rights Reserved. 57 Script Security

    & Groovy Sandbox. Как оно работает? foo.groovy Компиляция Стандартный компилятор Groovy Инструментирование Script Security • Синтаксический анализатор • SandboxTransformer extends CompilationCustomizer • SandboxInterceptor extends GroovyInterceptor – анализ исполняемого кода в динамике Groovy
  58. © 2017 CloudBees, Inc. All Rights Reserved. 58 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
  59. © 2017 CloudBees, Inc. All Rights Reserved. 59 Script Security.

    API • Аннотация @Whitelisted @Whitelisted public int getTimeout() { return timeout; } @Whitelisted public void setTimeout(int timeout) { this.timeout = timeout; }
  60. © 2017 CloudBees, Inc. All Rights Reserved. 60 Script Security.

    API • Аннотация @Whitelisted • Расширения Jenkins • https://jenkins.io/doc/developer/extensions/script-security/ • ApprovalListener • Language • Whitelist
  61. © 2017 CloudBees, Inc. All Rights Reserved. 61 Script Security.

    API • Аннотация @Whitelisted • Расширения Jenkins • Разрешение через конфигурацию Jenkins • В Web UI для администратора • Через System Groovy & Co
  62. © 2017 CloudBees, Inc. All Rights Reserved. 62 Manage Jenkins

    / Script Approvals
  63. © 2017 CloudBees, Inc. All Rights Reserved. 63 Script Security.

    API • Аннотация @Whitelisted • Расширения Jenkins • Разрешение через конфигурацию Jenkins • Permissive Script Security Plugin • Последний довод • Отключает Script Security
  64. © 2017 CloudBees, Inc. All Rights Reserved. 64 Script Security.

    “Чёрные списки” • Показывают предупреждение админу перед аппрувом • Примеры: ▸ new java.io.File java.lang.String ▸ staticMethod java.lang.System exit java.lang.Integer ▸ 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
  65. © 2017 CloudBees, Inc. All Rights Reserved. 65 •Много ручных

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

  67. © 2017 CloudBees, Inc. All Rights Reserved. 67 Примеры 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
  68. Специфика Jenkins Pipeline

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

    - это… 1. Тип задачи Pipeline Multi-Branch Pipeline Organization Folder • GitHub • BitBucket* • …
  70. © 2017 CloudBees, Inc. All Rights Reserved. 70 Jenkins Pipeline

    - это… 1. Тип задачи 2. Groovy DSL для описания задач ▸ Хранится в SCM (Jenkinsfile) ▸ Или: определяется в настройках задачи node("linux && java9") { git url:"http://github.com/myorg/myproject.git" sh "make all" } http://bit.ly/pipeline-tutorial
  71. © 2017 CloudBees, Inc. All Rights Reserved. 71 Основные возможности

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

    - это… 1. Тип задачи 2. Groovy DSL для описания задач 3. Даже два типа Groovy DSL… • “Scripted” • “Declarative”
  73. © 2017 CloudBees, Inc. All Rights Reserved. 73 Scripted Pipeline

    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
  74. © 2017 CloudBees, Inc. All Rights Reserved. 74 Синтаксический сахар

    над Pipeline • “pipeline { }” closure • Используется тот же движок • DSL внутри DSL 74 Декларативный Pipeline https://github.com/jenkinsci/pipeline- model-definition-plugin/wiki
  75. © 2017 CloudBees, Inc. All Rights Reserved. 75 Синтаксический сахар

    над Pipeline Секции для типовых задач • Простая настройка • Больше статического анализа • Меньше гибкость L 75 Декларативный Pipeline https://github.com/jenkinsci/pipeline- model-definition-plugin/wiki
  76. © 2017 CloudBees, Inc. All Rights Reserved. 76 76 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
  77. © 2017 CloudBees, Inc. All Rights Reserved. 77 Jenkins Pipeline

    - это… 1. Тип задачи 2. Groovy DSL для описания задач 3. Даже два типа Groovy DSL… 4. Экосистема Pipeline as Code…
  78. © 2017 CloudBees, Inc. All Rights Reserved. 78 Branch- Source,

    BlueOcean, ... 89 – явная поддержка в коде 44 – плагины для Pipeline Документация Примеры Средства разработки Экосистема Jenkins Pipeline Плагины: Публичные библиотеки
  79. Особенности движка Pipeline • Groovy • Groovy Sandbox • Script

    Security • Pipeline CPS Plugin
  80. © 2017 CloudBees, Inc. All Rights Reserved. 80 Script Security

    & Groovy Sandbox. Обычные скрипты foo.groovy Компиляция Стандартный компилятор Groovy Инструментирование Script Security • Синтаксический анализатор • SandboxTransformer extends CompilationCustomizer • SandboxInterceptor extends GroovyInterceptor – анализ исполняемого кода в динамике Groovy
  81. © 2017 CloudBees, Inc. All Rights Reserved. 81 Script Security

    & Groovy Sandbox. Pipeline foo.groovy Компиляция Стандартный компилятор Groovy Инструментирование Script Security • Синтаксический анализатор • SandboxTransformer extends CompilationCustomizer • SandboxInterceptor extends GroovyInterceptor – анализ исполняемого кода в динамике Groovy
  82. © 2017 CloudBees, Inc. All Rights Reserved. 82 Pipeline CPS

    • CPS = Continuation-passing style NonCPS CPS
  83. © 2017 CloudBees, Inc. All Rights Reserved. 83 Pipeline CPS

    Jenkinsfile AST Pipeline CPS Стандартный компилятор Groovy • Синтаксический анализатор • Обёртка вызовов в CpsCallableInvocation • Свой движок
  84. © 2017 CloudBees, Inc. All Rights Reserved. 84 Pipeline CPS

    Jenkinsfile AST Стандартный компилятор Groovy • Синтаксический анализатор • Обёртка вызовов в CpsCallableInvocation Pipeline CPS • Свой движок Исполнение CPS • Граф исполнения – FlowGraph • Сериализация контекста на диск • Очередь задач
  85. © 2017 CloudBees, Inc. All Rights Reserved. 85 Pipeline CPS.

    Жизненный цикл PERSISTED PREPARING SUSPENDED RUNNABLE RUNNING COMPLETED Начало исполнения
  86. © 2017 CloudBees, Inc. All Rights Reserved. 86 Хранение контекста

  87. © 2017 CloudBees, Inc. All Rights Reserved. 87 Pipeline CPS

    Jenkinsfile AST Pipeline CPS Исполнение CPS • Граф исполнения – FlowGraph • Сериализация контекста на диск • Очередь задач Исполнение CPS @NonCPS
  88. © 2017 CloudBees, Inc. All Rights Reserved. 88 Пример •

    Нельзя Вызывать 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 }
  89. © 2017 CloudBees, Inc. All Rights Reserved. 89 1. Переключаться

    в NonCPS ТОЛЬКО один раз 2. Не смешивать CPS/NonCPS логику 3. toString() и Co – всегда @NonCPS В скрипте…
  90. © 2017 CloudBees, Inc. All Rights Reserved. 90 Pipeline DSL

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

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

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

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

    исключения… try/catch •Пропущенные исключения останавливают Pipeline Обработка ошибок
  95. © 2017 CloudBees, Inc. All Rights Reserved. 95 Обработка ошибок

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

    исключения… try/catch •Пропущенные исключения останавливают Pipeline •Исключения в catch() сериализуются Обработка ошибок
  97. © 2017 CloudBees, Inc. All Rights Reserved. 97 •Pipeline кидает

    исключения… try/catch •Пропущенные исключения останавливают Pipeline •Исключения в catch() сериализуются •Поймать можно почти любое исключение •В том числе и запрет от Script Security L Обработка ошибок
  98. Расширяемость Pipeline DSL. Как это сделано? ØДвижок расширений Jenkins ØШаги

    ØПеременные окружения
  99. © 2017 CloudBees, Inc. All Rights Reserved. 99 Пример Pipeline

    node(‘linux’) { checkout scm sh “mvn clean verify -Pcoverage” junit ”target/…/*.xml” findbugs(”**/target/findBugs.xml”) cobertura(“target/coverage.xml”) } Приходит из плагинов
  100. © 2017 CloudBees, Inc. All Rights Reserved. 100 • @ExtensionPoint

    – классы и интерфейсы • @Extension • Annotation Indexer • Шаги – расширения BuildStep / Publisher Ликбез. Движок расширений Jenkins
  101. © 2017 CloudBees, Inc. All Rights Reserved. 101 Разрешение имён

    - Аннотация @Symbol • Было: • Стало:
  102. © 2017 CloudBees, Inc. All Rights Reserved. 102 Pipeline Snippet

    Generator
  103. © 2017 CloudBees, Inc. All Rights Reserved. 103 • @DataBoundConstructor

    • @DataBoundSetter • Reflection • Хелп-файлы в ресурсах • Валидаторы/автозаполнение полей - Stapler Ликбез. Form binding
  104. © 2017 CloudBees, Inc. All Rights Reserved. 104 Шаги Pipeline

    Job Plugin: Step Контекст Pipeline
  105. © 2017 CloudBees, Inc. All Rights Reserved. 105 Шаги Pipeline

    Job Plugin: Step Ядро: SimpleBuildStep/SimpleBuildWrapper • Реализации совместимы с Pipeline и Freestyle/AbstractProject • В Pipeline требуют workspace и т.п. • Пример: ▸https://github.com/jenkinsci/mailer- plugin/blob/master/src/main/java/hudson/tasks/Mailer.java
  106. © 2017 CloudBees, Inc. All Rights Reserved. 106 Глобальные переменные

    org.jenkinsci.plugins.workflow.cps.GlobalVariable
  107. Можно ли расширить DSL без плагинов?

  108. Я - автоматизатор. Я не хочу писать плагины. Я хочу

    команды в Pipeline.
  109. © 2017 CloudBees, Inc. All Rights Reserved. 109 Переиспользование кода

    без плагинов 2015 • load() – загрузка из workspace def pipeline node('slave') { pipeline = load 'pipeline.groovy' pipeline.functionA() } pipeline.functionB()
  110. © 2017 CloudBees, Inc. All Rights Reserved. 110 Переиспользование кода

    без плагинов 2015 • load() – загрузка из workspace Начало 2016 • Global Pipeline Library • Pipeline Remote Loader Plugin def helloworld = fileLoader.fromGit( 'examples/fileLoader/helloworld', 'https://github.com/jenkinsci/workflow- remote-loader-plugin.git', 'master', credentialsID, ’linux && jumphost') helloworld.printHello()
  111. © 2017 CloudBees, Inc. All Rights Reserved. 111 Переиспользование кода

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

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

    [1/2] Глобальные настройки, папки my-imaginary-lib
  114. © 2017 CloudBees, Inc. All Rights Reserved. 114 Объявление Библиотеки

    [2/2] https://github.com/oleg-nenashev/my-imaginary-lib
  115. © 2017 CloudBees, Inc. All Rights Reserved. 115 Пример. Импорт

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

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

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

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

    это работает? … Pure Pipeline DSL
  120. © 2017 CloudBees, Inc. All Rights Reserved. 120 Больше о

    Pipeline-библиотеках? https://heisenbug- moscow.ru/talks/2017/msk/1f0wvztnneoo0gc6oweaio/ Доки на jenkins.io Jenkins-митапы Гейзенбаг (09.12)
  121. © 2017 CloudBees, Inc. All Rights Reserved. 121 А можно

    ли упаковать Pipeline в плагин?
  122. © 2017 CloudBees, Inc. All Rights Reserved. 122 • Глобальная

    переменная: • https://jenkins.io/blog/2016/04/21/dsl-plugins • Пример • https://github.com/jenkinsci/workflow-remote-loader-plugin • GroovyFileGlobalVariable – базовый класс • Хак можно упаковать в API-плагин… А можно ли упаковать Pipeline в плагин?
  123. Свой DSL создали, а дальше-то что?

  124. © 2017 CloudBees, Inc. All Rights Reserved. 124 •Чего не

    хватает? Достаточно ли крутого DSL?
  125. © 2017 CloudBees, Inc. All Rights Reserved. 125 •Чего не

    хватает? Достаточно ли крутого DSL?
  126. © 2017 CloudBees, Inc. All Rights Reserved. 126

  127. © 2017 CloudBees, Inc. All Rights Reserved. 127 Pipeline. Средства

    разработки Интеграция с IDE Unit Test Framework Статический анализ Library manager Средства отладки Докумен- тация Деплоймент скриптов Средства миграции на DSL Хорошо Слабовато Не хватает
  128. © 2017 CloudBees, Inc. All Rights Reserved. 128 Jenkins Pipeline

    Unit • https://github.com/jenkinsci/JenkinsPipelineUnit • Вызывается из Pipeline “mvn verify” был вызван… И вызов успешен… Для Jenkinsfile…
  129. © 2017 CloudBees, Inc. All Rights Reserved. 129 Jenkins Pipeline

    Unit String clonePath = 'path/to/clone' def library = library() .name('commons') .retriever(gitSource('git@orgithub/devteam/jenkins-shared.git')) .targetPath(clonePath) .defaultVersion("master") .allowOverride(true) .build() helper.registerSharedLibrary(library) loadScript("job/library/exampleJob.jenkins") printCallStack()
  130. © 2017 CloudBees, Inc. All Rights Reserved. 130 Документация (root)

    +- README.md +- LICENSE.txt +- … +- src +- org +- oleg +- MailExtSender.groovy +- vars +- cobertura.groovy +- covertura.txt +- runTests.groovy +- runTests.txt Documentation as Code? Asciidoc / Markdown • У первого есть макросы…
  131. © 2017 CloudBees, Inc. All Rights Reserved. 131 Документация (root)

    +- README.md +- LICENSE.txt +- … +- src +- org +- oleg +- MailExtSender.groovy +- vars +- cobertura.groovy +- covertura.txt +- runTests.groovy +- runTests.txt Asciidoc / Markdown • У первого есть макросы… Javadoc • Работает для классов • ПОКА не работает для глобальных переменных ▸ https://github.com/jenkinsci/gmaven/pull/1 ▸ https://github.com/jenkins-infra/pipeline- library/pull/22
  132. © 2017 CloudBees, Inc. All Rights Reserved. 132 Интеграция с

    IDE. Что надо?
  133. © 2017 CloudBees, Inc. All Rights Reserved. 133 •Автодополнение •Документация

    •Статический анализ •Отладка Интеграция с IDE. Что надо?
  134. © 2017 CloudBees, Inc. All Rights Reserved. 134 Файл Синтаксиса

    https://st-g.de/2016/08/jenkins- pipeline-autocompletion-in-intellij
  135. Заключение

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

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

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

    в 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
  139. © 2017 CloudBees, Inc. All Rights Reserved. 139 Итого •

    Groovy DSL – один из основных движков Configuration-as-Code в Jenkins • Groovy DSL повышает гибкость системы • DSL сложно разрабатывать и поддерживать, если не знать как • Если пишете свой DSL, уделяйте внимание средствам разработки
  140. © 2017 CloudBees, Inc. All Rights Reserved. 140 Ссылки Документация

    • Веб-сайт проекта: https://jenkins.io • 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 Jenkins RU • Gitter: https://gitter.im/jenkinsci-ru/public • Митап в СПб: https://www.meetup.com/St-Petersburg-Jenkins-Meetup/
  141. © 2017 CloudBees, Inc. All Rights Reserved. 141 Спасибо! Контакты:

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