Slide 1

Slide 1 text

© 2019 CloudBees, Inc. All Rights Reserved. © 2019 CloudBees, Inc. All Rights Reserved. Jenkins.war story Как мы внедряли поддержку Java 11 Олег Ненашев, CloudBees @oleg_nenashev

Slide 2

Slide 2 text

© 2019 CloudBees, Inc. All Rights Reserved. О чём доклад? V - Миграция крупных проектов на Java 11 V - Наш опыт, проблемы и решения V - Java, Maven, стандартные тулы X - Jenkins X - Jenkins X X - Дебри Java 11 2

Slide 3

Slide 3 text

© 2019 CloudBees, Inc. All Rights Reserved. > whoami @oleg_nenashev oleg-nenashev • Principal SW Engineer, CloudBees • Jenkins Core maintainer • Platform SIG leader 3

Slide 4

Slide 4 text

© 2019 CloudBees, Inc. All Rights Reserved. > whoami -cloudbees 4 ● CloudBees Jenkins Distribution ● CloudBees Jenkins Support ● Сообщество: Java 11, Jenkinsfile Runner, JCasC https://www.cloudbees.com

Slide 5

Slide 5 text

© 2019 CloudBees, Inc. All Rights Reserved. Who is Mr. Jenkins? 1. Сервер автоматизации 2. CI/CD/DevOps/… 3. 200k+ инсталляций 4. Open-source 5. Большое сообщество 6. >1700 плагинов https://jenkins.io 5

Slide 6

Slide 6 text

© 2019 CloudBees, Inc. All Rights Reserved. Under the hood JENKINS Image: https://www.youtube.com/watch?v=Qae_3RDa6sM 6

Slide 7

Slide 7 text

© 2019 CloudBees, Inc. All Rights Reserved. 7

Slide 8

Slide 8 text

© 2019 CloudBees, Inc. All Rights Reserved. 8 Более 50 тикетов на совместимость с Java 9/10

Slide 9

Slide 9 text

© 2019 CloudBees, Inc. All Rights Reserved. Java 8 навсегда? 9

Slide 10

Slide 10 text

© 2019 CloudBees, Inc. All Rights Reserved. Java 8 навсегда? 10

Slide 11

Slide 11 text

© 2019 CloudBees, Inc. All Rights Reserved. 8 11

Slide 12

Slide 12 text

© 2019 CloudBees, Inc. All Rights Reserved. 12

Slide 13

Slide 13 text

© 2019 CloudBees, Inc. All Rights Reserved. 13

Slide 14

Slide 14 text

© 2019 CloudBees, Inc. All Rights Reserved. Июнь 2018 - Online Hackathon ● 1й день - Pipeline 14

Slide 15

Slide 15 text

© 2019 CloudBees, Inc. All Rights Reserved. Июнь 2018 - Online Hackathon ● 2й день - BlueOcean 15

Slide 16

Slide 16 text

© 2019 CloudBees, Inc. All Rights Reserved. Июнь 2018 - Online Hackathon ● 5й день - “самое скучное демо на свете” 16

Slide 17

Slide 17 text

© 2019 CloudBees, Inc. All Rights Reserved. Сентябрь 2018 ● 1 день - поддержка Java 11 17

Slide 18

Slide 18 text

© 2019 CloudBees, Inc. All Rights Reserved. Java 10 PoC - июнь 2018 Java 11 PoC - сентябрь 2018 Java 11 RC - декабрь 2018 Java 11 GA - март 2019 18 ? ? ?

Slide 19

Slide 19 text

© 2019 CloudBees, Inc. All Rights Reserved. Запустить проект на Java 11 - легко, а переехать на Java 11 - сложно 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты Наш Pipeline 21

Slide 22

Slide 22 text

© 2019 CloudBees, Inc. All Rights Reserved. Наши тулы ● Maven и немного Gradle ● Parent POM и BOM ● Maven SureFire + JUnit 4 ● SpotBugs, Animal Sniffer, Maven Enforcer ● JaCoCo и Cobertura ● Свои Maven-плагины 22

Slide 23

Slide 23 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка > mvn clean package -Djava.level = 11 23 Попытка 1: Maven Compiler Plugin: Unsupported target: 1.11 Попытка 2: Maven Compiler Plugin: Unsupported target: 11

Slide 24

Slide 24 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты Maven-плагины 24

Slide 25

Slide 25 text

© 2019 CloudBees, Inc. All Rights Reserved. Maven-плагины 25 > mvn versions:display-plugin-updates ...

Slide 26

Slide 26 text

© 2019 CloudBees, Inc. All Rights Reserved. Maven-плагины Maven Compiler Plugin Maven Enforcer & Rule Plugin Maven Site GMaven/GMavenPlus Javadoc ... > mvn versions:display-plugin-updates 26

Slide 27

Slide 27 text

© 2019 CloudBees, Inc. All Rights Reserved. 27 java.lang.IllegalArgumentException at org.kohsuke.asm6.ClassReader.(ClassReader.java:185) at org.kohsuke.asm6.ClassReader.(ClassReader.java:168) at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.reader(…) …. at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.getCommonSuperClass(...) at org.jenkinsci.bytecode.NonClassLoadingClassWriter.getCommonSuperClass(NonClassLoadingClassWriter.java:72) at org.kohsuke.asm6.ClassWriter.getMergedType(ClassWriter.java:1736) at org.kohsuke.asm6.Frame.merge(Frame.java:1530) at org.kohsuke.asm6.Frame.merge(Frame.java:1478) at org.kohsuke.asm6.MethodWriter.visitMaxs(MethodWriter.java:1520) at org.kohsuke.asm6.tree.MethodNode.accept(MethodNode.java:835) at org.kohsuke.asm6.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187) at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:109) at org.kohsuke.asm6.MethodVisitor.visitEnd(MethodVisitor.java:878) at org.kohsuke.asm6.ClassReader.readMethod(ClassReader.java:1169) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:727) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:525) at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:115) at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:857) at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1311) at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1364) at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1327) at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1080) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at org.jenkinsci.plugins.workflow.cps.CpsScript.(CpsScript.java:69) at WorkflowScript.(WorkflowScript

Slide 28

Slide 28 text

© 2019 CloudBees, Inc. All Rights Reserved. 28 java.lang.IllegalArgumentException at org.kohsuke.asm6.ClassReader.(ClassReader.java:185) at org.kohsuke.asm6.ClassReader.(ClassReader.java:168) at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.reader(…) …. at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.getCommonSuperClass(...) at org.jenkinsci.bytecode.NonClassLoadingClassWriter.getCommonSuperClass(NonClassLoadingClassWriter.java:72) at org.kohsuke.asm6.ClassWriter.getMergedType(ClassWriter.java:1736) at org.kohsuke.asm6.Frame.merge(Frame.java:1530) at org.kohsuke.asm6.Frame.merge(Frame.java:1478) at org.kohsuke.asm6.MethodWriter.visitMaxs(MethodWriter.java:1520) at org.kohsuke.asm6.tree.MethodNode.accept(MethodNode.java:835) at org.kohsuke.asm6.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187) at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:109) at org.kohsuke.asm6.MethodVisitor.visitEnd(MethodVisitor.java:878) at org.kohsuke.asm6.ClassReader.readMethod(ClassReader.java:1169) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:727) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:525) at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:115) at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:857) at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1311) at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1364) at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1327) at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1080) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at org.jenkinsci.plugins.workflow.cps.CpsScript.(CpsScript.java:69) at WorkflowScript.(WorkflowScript at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1080) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at org.jenkinsci.plugins.workflow.cps.CpsScript.(CpsScript.java:69) at WorkflowScript.(WorkflowScript

Slide 29

Slide 29 text

© 2019 CloudBees, Inc. All Rights Reserved. 29 java.lang.IllegalArgumentException at org.kohsuke.asm6.ClassReader.(ClassReader.java:185) at org.kohsuke.asm6.ClassReader.(ClassReader.java:168) at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.reader(…) …. at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.getCommonSuperClass(...) at org.jenkinsci.bytecode.NonClassLoadingClassWriter.getCommonSuperClass(NonClassLoadingClassWriter.java:72) at org.kohsuke.asm6.ClassWriter.getMergedType(ClassWriter.java:1736) at org.kohsuke.asm6.Frame.merge(Frame.java:1530) at org.kohsuke.asm6.Frame.merge(Frame.java:1478) at org.kohsuke.asm6.MethodWriter.visitMaxs(MethodWriter.java:1520) at org.kohsuke.asm6.tree.MethodNode.accept(MethodNode.java:835) at org.kohsuke.asm6.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187) at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:109) at org.kohsuke.asm6.MethodVisitor.visitEnd(MethodVisitor.java:878) at org.kohsuke.asm6.ClassReader.readMethod(ClassReader.java:1169) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:727) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:525) at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:115) at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:857) at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1311) at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1364) at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1327) at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1080) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at org.jenkinsci.plugins.workflow.cps.CpsScript.(CpsScript.java:69) at WorkflowScript.(WorkflowScript java.lang.IllegalArgumentException at org.kohsuke.asm6.ClassReader.(ClassReader.java:185) at org.kohsuke.asm6.ClassReader.(ClassReader.java:168) at org.jenkinsci.bytecode.helper.???Reader.reader(…)

Slide 30

Slide 30 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты Maven-плагины Зависимости 30

Slide 31

Slide 31 text

© 2019 CloudBees, Inc. All Rights Reserved. Lib 1 Lib 2 Lib 3 Plugin 1 Plugin 2 Plugin 3 Lib 4 Lib 5 Plugin 4 иногда 31

Slide 32

Slide 32 text

© 2019 CloudBees, Inc. All Rights Reserved. 32 IT IS OVER 9000 DEPENDENCIES

Slide 33

Slide 33 text

© 2019 CloudBees, Inc. All Rights Reserved. Dependency Hell 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

© 2019 CloudBees, Inc. All Rights Reserved. ASM 36 https://asm.ow2.io/

Slide 37

Slide 37 text

© 2019 CloudBees, Inc. All Rights Reserved. java.lang.IllegalArgumentException at org.kohsuke.asm6.ClassReader.(ClassReader.java:185) at org.kohsuke.asm6.ClassReader.(ClassReader.java:168) at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.reader(ClassLoadingReferenceTypeHierachyReader.java:64) …. at org.jenkinsci.bytecode.helper.ClassLoadingReferenceTypeHierachyReader.getCommonSuperClass(...) at org.jenkinsci.bytecode.NonClassLoadingClassWriter.getCommonSuperClass(NonClassLoadingClassWriter.java:72) at org.kohsuke.asm6.ClassWriter.getMergedType(ClassWriter.java:1736) at org.kohsuke.asm6.Frame.merge(Frame.java:1530) at org.kohsuke.asm6.Frame.merge(Frame.java:1478) at org.kohsuke.asm6.MethodWriter.visitMaxs(MethodWriter.java:1520) at org.kohsuke.asm6.tree.MethodNode.accept(MethodNode.java:835) at org.kohsuke.asm6.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187) at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:109) at org.kohsuke.asm6.MethodVisitor.visitEnd(MethodVisitor.java:878) at org.kohsuke.asm6.ClassReader.readMethod(ClassReader.java:1169) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:727) at org.kohsuke.asm6.ClassReader.accept(ClassReader.java:525) at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:115) at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:857) at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1311) at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1364) at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1327) at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1080) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at org.jenkinsci.plugins.workflow.cps.CpsScript.(CpsScript.java:69) at WorkflowScript.(WorkflowScript 37 at org.jenkinsci.bytecode.Transformer.transform (Transformer.java:115)

Slide 38

Slide 38 text

© 2019 CloudBees, Inc. All Rights Reserved. Наш список ASM Byte Buddy Reflections Jetty Groovy JNR, JNA Annotation Indexer SezPoz ... 38

Slide 39

Slide 39 text

© 2019 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/ Что поможет? 39

Slide 40

Slide 40 text

© 2019 CloudBees, Inc. All Rights Reserved. maven-enforcer-plugin … 1.8 test … … extra-enforcer-rules … 40

Slide 41

Slide 41 text

© 2019 CloudBees, Inc. All Rights Reserved. 41 maven-enforcer-plugin … 1.8 test … … extra-enforcer-rules … 1.8 test

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

© 2019 CloudBees, Inc. All Rights Reserved. Транзитивные зависимости ● И снова Maven Enforcer Plugin ● requireUpperBoundDeps commons-logging:commons-logging com.google.code.findbugs:jsr305 net.java.dev.jna:jna 43

Slide 44

Slide 44 text

© 2019 CloudBees, Inc. All Rights Reserved. А Вы обновляете зависимости? 44

Slide 45

Slide 45 text

© 2019 CloudBees, Inc. All Rights Reserved. Технический долг 45

Slide 46

Slide 46 text

© 2019 CloudBees, Inc. All Rights Reserved. Dependabot dependabot.com, куплен GitHub 46

Slide 47

Slide 47 text

© 2019 CloudBees, Inc. All Rights Reserved. Dependabot ● CLI и GitHub App ● Регулярное сканирование ● Поддержка Maven, Gradle и др. 47

Slide 48

Slide 48 text

© 2019 CloudBees, Inc. All Rights Reserved. Dependabot 48 @oleg_nenashev https://speakerdeck.com/onenashev/

Slide 49

Slide 49 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты Maven-плагины Зависимости Наш код 49

Slide 50

Slide 50 text

© 2019 CloudBees, Inc. All Rights Reserved. 50

Slide 51

Slide 51 text

© 2019 CloudBees, Inc. All Rights Reserved. JEP 261: Module System 51

Slide 52

Slide 52 text

© 2019 CloudBees, Inc. All Rights Reserved. Никто не заставляет использовать модули! 52

Slide 53

Slide 53 text

53 ONE DOES NOT SIMPLY IGNORE MODULES IN JAVA11

Slide 54

Slide 54 text

© 2019 CloudBees, Inc. All Rights Reserved. java.lang.NoClassDefFoundError: java.sql.Date at o.a.c.beanutils.ConvertUtilsBean.class$(ConvertUtilsBean.java:157) at o.a.c.beanutils.ConvertUtilsBean.registerOther(ConvertUtilsBean.java:708) at o.a.c.beanutils.ConvertUtilsBean.deregister(ConvertUtilsBean.java:580) at o.a.c.beanutils.ConvertUtilsBean.(ConvertUtilsBean.java:164) at org.kohsuke.stapler.Stapler.(Stapler.java:1065) at hudson.model.Node$Mode.(Node.java:597) at JENKINS-54426 54

Slide 55

Slide 55 text

© 2019 CloudBees, Inc. All Rights Reserved. http://java9.wtf/class-loading/ 55

Slide 56

Slide 56 text

© 2019 CloudBees, Inc. All Rights Reserved. JEP-261 - Restricted Bootstrap Class Loader java.sql.* javax.activation.* javax.annotation.* javax.jws.* javax.lang.model.* javax.rmi.* javax.script.* javax.smartcardio.* javax.sql.* javax.tools.* javax.transaction.xa.* javax.xml.bind.* javax.xml.crypto.* javax.xml.soap.* javax.xml.ws.* 56

Slide 57

Slide 57 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Проблема: new URLClassloader(null, ...) ● Классы из модулей больше недоступны ● getPlatformClassLoader() для Java 9+ ● А для Java 8 метода нет…. JEP-261 - Restricted Bootstrap Class Loader 57

Slide 58

Slide 58 text

© 2019 CloudBees, Inc. All Rights Reserved. Platform Classloader. Решение private ClassLoader getPlatformClassloader() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { if (isPostJava8()) { return (ClassLoader) ClassLoader.class.getMethod ("getPlatformClassLoader").invoke(null); } return null; // Java 8 } private static boolean isPostJava8() { String javaVersion = System.getProperty("java.version"); return !javaVersion.startsWith("1."); } 58

Slide 59

Slide 59 text

© 2019 CloudBees, Inc. All Rights Reserved. Кстати о Reflection... WARNING: Illegal reflective access by hudson.remoting.RemoteClassLoader (file:/var/jenkins_home/war/WEB-INF/lib/remoting-3.7.jar) to method java.lang.ClassLoader.getClassLoadingLock(java.lang.String) at h.r.RemoteClassLoader.(RemoteClassLoader.java:330) at h.r.MultiClassLoaderSerializer$Output.annotateClass(MultiClassLoaderSerializer.java:69) at java.base/java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1291) at java.base/java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1232) 59 JENKINS-46724

Slide 60

Slide 60 text

© 2019 CloudBees, Inc. All Rights Reserved. Кстати о Reflection... WARNING: Illegal reflective access by hudson.remoting.RemoteClassLoader (file:/var/jenkins_home/war/WEB-INF/lib/remoting-3.7.jar) to method java.lang.ClassLoader.getClassLoadingLock(java.lang.String) at h.r.RemoteClassLoader.(RemoteClassLoader.java:330) at h.r.MultiClassLoaderSerializer$Output.annotateClass(MultiClassLoaderSerializer.java:69) at java.base/java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1291) at java.base/java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1232) JENKINS-46724 60 TL;DR: setAccessible(true) - это плохо Crash в Java 9 EA по-умолчанию Предупреждение в логах для Java 9+

Slide 61

Slide 61 text

© 2019 CloudBees, Inc. All Rights Reserved. Illegal Reflective Access ● Internal Libraries ● Upstream Dependencies ● Object serialization frameworks Escape hatch: “--illegal-access=permit” 61

Slide 62

Slide 62 text

© 2019 CloudBees, Inc. All Rights Reserved. Удалённые компоненты sun.misc.Unsafe Java Web Start JAXB CORBA API: методы и классы ... 62

Slide 63

Slide 63 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Удалена из JDK ● Доступна через Jakarta, но почти не поддерживается ● В итоге – свой плагин Наша боль – java.xml.bind (JAXB) 63 java -p jaxb-api.jar:javax.activation.jar --add-modules java.xml.bind,java.activation ... -cp jaxb-core.jar:jaxb-impl.jar -jar jenkins.war …

Slide 64

Slide 64 text

© 2019 CloudBees, Inc. All Rights Reserved. Удалённые API 64

Slide 65

Slide 65 text

© 2019 CloudBees, Inc. All Rights Reserved. java.lang.UNIXProcess#destroyProcess() 65

Slide 66

Slide 66 text

© 2019 CloudBees, Inc. All Rights Reserved. Подходы к совместимому коду 66 Reflection Class#getDeclaredMethod() Class#getDeclaredField() setAccessible() …

Slide 67

Slide 67 text

© 2019 CloudBees, Inc. All Rights Reserved. Подходы к совместимому коду 67 Reflection Multi-Release JAR (JEP-238) JAR content root A.class B.class C.class META-INF MANIFEST.MF versions 9 A.class B.class 10 A.class Class#getDeclaredMethod() Class#getDeclaredField() setAccessible() …

Slide 68

Slide 68 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты Maven-плагины Зависимости Наш код 68

Slide 69

Slide 69 text

© 2019 CloudBees, Inc. All Rights Reserved. Собирать на Java 8, тестировать с Java 11? 69

Slide 70

Slide 70 text

© 2019 CloudBees, Inc. All Rights Reserved. Maven Surefire - Тестирование с Java 11 … maven-surefire-plugin /path/to/jdk11/bin/java … 70

Slide 71

Slide 71 text

© 2019 CloudBees, Inc. All Rights Reserved. Maven Surefire - Подключение модулей … /path/to/jdk11/bin/java -p jaxb-api.jar:javax.activation.jar --add-modules java.xml.bind,java.activation ... -cp jaxb-core.jar:jaxb-impl.jar ... … 71

Slide 72

Slide 72 text

© 2019 CloudBees, Inc. All Rights Reserved. Что не так? Тестовые зависимости Несовместимые Maven- плагины Несовместимые тесты 72

Slide 73

Slide 73 text

© 2019 CloudBees, Inc. All Rights Reserved. Mockito ASM, ASM, ASM Минимальные версии mockito-core 2.23.4+ Mockito почти совместим JENKINS-55098 73

Slide 74

Slide 74 text

© 2019 CloudBees, Inc. All Rights Reserved. PowerMock Минимальные версии powermock-module-junit4:2.0.0-RC4 powermock-api-mockito2:2.0.0-RC4 objenesis:3.0.1 PowerMock несовместим JENKINS-55098 74

Slide 75

Slide 75 text

© 2019 CloudBees, Inc. All Rights Reserved. PowerMock 75

Slide 76

Slide 76 text

© 2019 CloudBees, Inc. All Rights Reserved. Тесты только на Java 8? 76

Slide 77

Slide 77 text

© 2019 CloudBees, Inc. All Rights Reserved. CORBA* 77 * мы её не используем

Slide 78

Slide 78 text

© 2019 CloudBees, Inc. All Rights Reserved. CORBA – Риск RCE при десериализации* Мастер Агент RPC Системные вызовы RemoteInputStream/ RemoteOutputStream Classloading Сериализация обьектов с readResolve() * Анонс Foxglove Security, 2015

Slide 79

Slide 79 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Мы не используем CORBA ● Но у нас есть тесты на deserialization ● Multi-Release Test JAR не работают ☹ CORBA. Удалена в JDK11 (JEP-320) 79

Slide 80

Slide 80 text

© 2019 CloudBees, Inc. All Rights Reserved. Тесты только на Java 8? 80

Slide 81

Slide 81 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты 81

Slide 82

Slide 82 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Animal Sniffer ● FindBugs => SpotBugs ● JaCoCo, Cobertura ● Access Modifier (@Restricted) ● ... Что нам пришлось обновлять? 82

Slide 83

Slide 83 text

© 2019 CloudBees, Inc. All Rights Reserved. SpotBugs 3.1.8+ (№711) 83 FindBugs

Slide 84

Slide 84 text

© 2019 CloudBees, Inc. All Rights Reserved. 84 client.setServerKeyVerifier(verifier); client.start(); try (ClientSession session = cf.getSession()) { /// .... } finally { client.stop(); }

Slide 85

Slide 85 text

© 2019 CloudBees, Inc. All Rights Reserved. 85 client.setServerKeyVerifier(verifier); client.start(); try (ClientSession session = cf.getSession()) { /// .... } finally { // RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE client.stop(); }

Slide 86

Slide 86 text

© 2019 CloudBees, Inc. All Rights Reserved. SpotBugs 3.1.8+ - не панацея 86

Slide 87

Slide 87 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты 87

Slide 88

Slide 88 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins-on-Jenkins 88 1. Зеркала с JDK (ZIP Installer) 2. Тестовые тулы 3. Docker-образы агентов 4. Docker-образы для всех тулов 5. Библиотеки Pipeline 6. Сами Pipeline https://ci.jenkins.io/

Slide 89

Slide 89 text

© 2019 CloudBees, Inc. All Rights Reserved. Мы слишком привыкли к Java 8 89

Slide 90

Slide 90 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Java 8 и 11 ● Linux и Windows ● Разные версии ядра Jenkins ● Версии/дистрибутивы Java Конфигурации 90

Slide 91

Slide 91 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins-on-Jenkins. Сборка ядра https://ci.jenkins.io/blue/organizatio ns/jenkins/Core%2Fjenkins/detail/j ava11-support/18/pipeline 91

Slide 92

Slide 92 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Jenkins Acceptance Test Harness ● Не трогали Selenium ~5 лет… ● Минорные изменения, легкий апдейт ● Перешли на современные драйверы Selenium 92

Slide 93

Slide 93 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins-on-Jenkins. Сборка плагинов 93 // Jenkinsfile buildPlugin() https://github.com/jenkins-infra/pipeline-library

Slide 94

Slide 94 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins-on-Jenkins. Сборка плагинов // Jenkinsfile buildPlugin(configurations: buildPlugin.recommendedConfigurations()) 94

Slide 95

Slide 95 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins-on-Jenkins. Сборка плагинов 95

Slide 96

Slide 96 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты 96 Инсталляторы Docker

Slide 97

Slide 97 text

© 2019 CloudBees, Inc. All Rights Reserved. OracleJDK / OpenJDK Лицензионные соглашения... Новая политика в Oracle JDK 11+ https://www.oracle.com/technetwork/ja va/javase/overview/oracle-jdk-faqs.html Ограничения новых релизов OpenJDK 8 от Oracle 97

Slide 98

Slide 98 text

© 2019 CloudBees, Inc. All Rights Reserved. OpenJDK Jigsaw Team: Собирайте OpenJDK сами Мы: ● AdoptOpenJDK ● RedHat JDK для CentOS ● … Какой дистрибутив взять? 98 https://adoptopenjdk.net/

Slide 99

Slide 99 text

© 2019 CloudBees, Inc. All Rights Reserved. 99

Slide 100

Slide 100 text

© 2019 CloudBees, Inc. All Rights Reserved. Jenkins & Docker. Packaging https://hub.docker.com/r/jenkins/ AND https://hub.docker.com/r/jenkinsci 100

Slide 101

Slide 101 text

© 2019 CloudBees, Inc. All Rights Reserved. Docker Packaging Базовый образ: https://hub.docker.com/_/openjdk/ 101

Slide 102

Slide 102 text

© 2019 CloudBees, Inc. All Rights Reserved. Docker Packaging Базовый образ: https://hub.docker.com/_/openjdk/ ● Поддерживается Docker, не Oracle ● Отстает от релизов, особенно для EA ● Нет образов для Arm & Co ● Не рекомендовано OpenJDK Jigsaw Team ● Непонятное будущее 102

Slide 103

Slide 103 text

© 2019 CloudBees, Inc. All Rights Reserved. Сборка Дистрибутивы Юнит-тесты Статический анализ Интеграционные тесты 103

Slide 104

Slide 104 text

© 2019 CloudBees, Inc. All Rights Reserved. Ожидания Image: https://www.kdnuggets.com/2016/10/big -data-science-expectation-reality.html 104

Slide 105

Slide 105 text

© 2019 CloudBees, Inc. All Rights Reserved. Ожидания Image: https://www.kdnuggets.com/2016/10/big -data-science-expectation-reality.html Реальность 105

Slide 106

Slide 106 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Jenkins работает на Java 11 ● TLS 1.3 и улучшения “из коробки” ● <1% распространение среди пользователей ● Удалили экспериментальные опции (cgroups) ● Обновили кодовую базу и зависимости Что получили? 106

Slide 107

Slide 107 text

© 2019 CloudBees, Inc. All Rights Reserved. Чего не хватало? ● Обновлённой Maven- экосистемы ● Сканеров совместимости с Java 11 ● Тулов для “правильного” апдейта зависимостей 107

Slide 108

Slide 108 text

© 2019 CloudBees, Inc. All Rights Reserved. Чего не хватало? ● Обновлённой Maven- экосистемы ● Сканеров совместимости с Java 11 ● Тулов для “правильного” апдейта зависимостей 108

Slide 109

Slide 109 text

© 2019 CloudBees, Inc. All Rights Reserved. ● Java 11 - это серьёзно ● Надо пробовать ● Миграция возможна ● Большая часть времени - CI и автотесты ● Апдейт - Отличная возможность прочувствовать технический долг ● Пробуйте тулы, если они есть Takeaways 109

Slide 110

Slide 110 text

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