Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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