Slide 1

Slide 1 text

Groovy DSL в Jenkins и Pipeline. Реализации и грабли Олег Ненашев CloudBees, Inc. СПб, 4 декабря 2017

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

© 2017 CloudBees, Inc. All Rights Reserved. 3 В Jenkins… • Jenkins Core • Windows Service Wrapper • Плагины • Remoting

Slide 4

Slide 4 text

© 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 Москва: Здесь может быть Ваше лого

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

© 2017 CloudBees, Inc. All Rights Reserved. 6 О Вас

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

© 2017 CloudBees, Inc. All Rights Reserved. 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

© 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) } }

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

© 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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

© 2017 CloudBees, Inc. All Rights Reserved. 25 Scriptler Plugin

Slide 26

Slide 26 text

© 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

Slide 27

Slide 27 text

© 2017 CloudBees, Inc. All Rights Reserved. 27 Groovy-хуки. Инфа http://bit.ly/jenkins_msk_3_groovy_hooks

Slide 28

Slide 28 text

© 2017 CloudBees, Inc. All Rights Reserved. 28 https://hub.docker.com/r/onenashev/ demo-jenkins-config-as-code/ Groovy-хуки

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

© 2017 CloudBees, Inc. All Rights Reserved. 37 Почему НЕ Groovy? • Пользователи могут редактировать задачи • Прямой доступ в JVM… •System.exit(0) в задаче?

Slide 38

Slide 38 text

© 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 • Часть заблокирована до сих пор

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

© 2017 CloudBees, Inc. All Rights Reserved. 43 Сделай сам Jenkins Script Security https://plugins.jenkins.io/ script-security

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

© 2017 CloudBees, Inc. All Rights Reserved. 47 Script Approval Groovy Sandbox Режимы Script Security Одобрение classpath

Slide 48

Slide 48 text

© 2017 CloudBees, Inc. All Rights Reserved. 48 http://groovy-sandbox.kohsuke.org/ https://github.com/jenkinsci/groovy-sandbox

Slide 49

Slide 49 text

© 2017 CloudBees, Inc. All Rights Reserved. 49 •CompilationCustomizer из groovy-all •Потокозависимые интерсепторы •“skin-deep” sandboxing Groovy Sandbox

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

© 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; }

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

© 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; }

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

© 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(); } }

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

© 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

Slide 59

Slide 59 text

© 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; }

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

© 2017 CloudBees, Inc. All Rights Reserved. 62 Manage Jenkins / Script Approvals

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

© 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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

© 2017 CloudBees, Inc. All Rights Reserved. 66

Slide 67

Slide 67 text

© 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

Slide 68

Slide 68 text

Специфика Jenkins Pipeline

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

© 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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

© 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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

© 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:"[email protected]", subject:"FAILURE:${currentBuild.name}", …} } } Пример. Декларативный Pipeline

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

© 2017 CloudBees, Inc. All Rights Reserved. 78 Branch- Source, BlueOcean, ... 89 – явная поддержка в коде 44 – плагины для Pipeline Документация Примеры Средства разработки Экосистема Jenkins Pipeline Плагины: Публичные библиотеки

Slide 79

Slide 79 text

Особенности движка Pipeline • Groovy • Groovy Sandbox • Script Security • Pipeline CPS Plugin

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

© 2017 CloudBees, Inc. All Rights Reserved. 86 Хранение контекста

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

© 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 entry : currentBuild.build().environment) { str += " ${entry.key} = ${entry.value}\n" } echo str }

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

© 2017 CloudBees, Inc. All Rights Reserved. 90 Pipeline DSL ВСЕГДА исполняется на мастере

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

Расширяемость Pipeline DSL. Как это сделано? ØДвижок расширений Jenkins ØШаги ØПеременные окружения

Slide 99

Slide 99 text

© 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”) } Приходит из плагинов

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

© 2017 CloudBees, Inc. All Rights Reserved. 101 Разрешение имён - Аннотация @Symbol • Было: • Стало:

Slide 102

Slide 102 text

© 2017 CloudBees, Inc. All Rights Reserved. 102 Pipeline Snippet Generator

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

© 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

Slide 106

Slide 106 text

© 2017 CloudBees, Inc. All Rights Reserved. 106 Глобальные переменные org.jenkinsci.plugins.workflow.cps.GlobalVariable

Slide 107

Slide 107 text

Можно ли расширить DSL без плагинов?

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

© 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()

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

© 2017 CloudBees, Inc. All Rights Reserved. 114 Объявление Библиотеки [2/2] https://github.com/oleg-nenashev/my-imaginary-lib

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

© 2017 CloudBees, Inc. All Rights Reserved. 116 Пример. Импорт по-умолчанию

Slide 117

Slide 117 text

© 2017 CloudBees, Inc. All Rights Reserved. 117 buildPlugin()

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

© 2017 CloudBees, Inc. All Rights Reserved. 121 А можно ли упаковать Pipeline в плагин?

Slide 122

Slide 122 text

© 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 в плагин?

Slide 123

Slide 123 text

Свой DSL создали, а дальше-то что?

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

© 2017 CloudBees, Inc. All Rights Reserved. 126

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

© 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()

Slide 130

Slide 130 text

© 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 • У первого есть макросы…

Slide 131

Slide 131 text

© 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

Slide 132

Slide 132 text

© 2017 CloudBees, Inc. All Rights Reserved. 132 Интеграция с IDE. Что надо?

Slide 133

Slide 133 text

© 2017 CloudBees, Inc. All Rights Reserved. 133 •Автодополнение •Документация •Статический анализ •Отладка Интеграция с IDE. Что надо?

Slide 134

Slide 134 text

© 2017 CloudBees, Inc. All Rights Reserved. 134 Файл Синтаксиса https://st-g.de/2016/08/jenkins- pipeline-autocompletion-in-intellij

Slide 135

Slide 135 text

Заключение

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

© 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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

© 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/

Slide 141

Slide 141 text

© 2017 CloudBees, Inc. All Rights Reserved. 141 Спасибо! Контакты: E-mail: [email protected] GitHub: oleg-nenashev Twitter: @oleg_nenashev

Slide 142

Slide 142 text

Software at the speed of ideas СПАСИБО! www.cloudbees.com