Operation am offenen Herzen



Ähnliche Dokumente
Operation am offenen Herzen

Operation am offenen Herzen

Continuous Delivery in der Realität eines Großunternehmens

Daniel Tschan Technischer Leiter. Continuous Delivery mit OpenShift

Consultant & Geschäftsführer, enpit consulting OHG ugb@enpit.de

AGILE APPLICATION LIFECYCLE MANAGEMENT IM ATLASSIAN ECOSYSTEM

End-to-End Agility Sind Sie schon agil genug? Mag. Christoph Leithner

Buildsystem. Maven & Scons. Controls Entwicklungsforum Januar 2012

Build-Pipeline mit Jenkins

WebService in Java SE und EE

Continuous Delivery mit OpenShift, 2nd Edition

Uwe Baumann artiso Solutions

Maven 2 Softwareprojekte mit Kultur

Referat. Continuous Integration. mit Maven und Jenkins. Benjamin Keeser. Hochschule für angewandte Wissenschaften München FB 07 Informatik (Master)

Open Source. Hendrik Ebbers 2015

ES GIBT EIN LEBEN NACHCI!

Spring Dynamic Modules for OSGi Service Platforms

Build Management Tool

Continuous Delivery. für Java Anwendungen. Axel Fontaine Software Development Expert

Iterativ. Inkrementell

Build Management Tool?

FWP Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen

Die Projek*ools. Files, Git, Tickets & Time

Schritt 4: Hallo Enterprise Bean

Build Management Tool?

Dennis Schulte / Tobias Flohre codecentric AG. Enterprise Java Batch mit Spring

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Java Web Services Metadata JSR-181

Renée Bäcker. Perl $foo Magazin

Continuous Integration (CI) Workshop

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Gerrit und Jenkins ein Traumpaar für Pre-Tested Commit

Übersicht innovative ITSM Lösungen von NTT DATA

CONTINUOUS DELIVERY. Entmystifiziert. codecentric AG

Android Testautomatisierung mit dem Framework Robotium

Erfolgreicher Ums9eg auf Git

Continuous Integration mit GitLab CI. Christine Koppelt Philipp Haußleiter GUUG-Frühjahrsfachgespräch 1. März 2018

DevOps in der Praxis. Alexander Pacnik

Platform as a Service (PaaS) Prof. Dr. Ch. Reich

Application Server und Continuous Integration

Bekannte Tools in einem agilen Ansatz. Frank Schwichtenberg SourceTalkTage 2013 Göttingen,

Android-Testautomatisierung mit Robotium

Continuous Delivery. Release- und Deploymentmanagement bei der Brunata Hürth

ALM mit Visual Studio Online. Philip Gossweiler Noser Engineering AG

Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java

RESTful Web. Representational State Transfer

JAX-RS 2.0 REST mit Java EE 7

Auszug aus JAX-WS Folien

Artem Eger. Build-Systeme in java Maven & ANT

Gerrit und Jenkins ein Traumpaar für Pre-Tested Commit

Softwareprojekte mit Kultur

Wir implementieren Lösungen. + DevOps-in-the-Box. Rainer Heinold VP Technology and Services

Automatisiertes Testen von Java EE-Applikationen mit Arquillian

Bean-Mapping mit MapStruct

FWP Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen

Oliver Paulus, 7. Februar Spring Framework Einführung. Oliver Paulus, Was ist Spring?

Continuous Integration mit GitLab CI Christine Koppelt Open-Source-Treffen, 26. Januar 2018

From Agile Project Management to Continuous Integration Thomas Bergmüller

Crashkurs Subversion / Trac / Provisioning. Jan Zieschang, , Berlin

Spring Dynamic Modules for OSGi Service Platforms

DevOps with AWS. Software Development und IT Operation Hand in Hand. Matthias Imsand CTO Amanox Solutions AG

E-Business Architekturen

Die Integration von Requirements Management, Software Configuration Management und Change Management mit der MKS Integrity Suite 2006

Einführung in Maven und GWT

Ohne Build geht's besser: Makeloses Java mit dem z 2 -Environment. Henning Blohm

Installation von NetBeans inkl. Glassfish Anwendungs-Server

Dirk Reinemann Working Student Sales Consulting

Programmierung von Client/Server- Anwendungen

Platform as a Service (PaaS) & Containerization

Atlassian Git Essentials Nahtlose Entwicklungsworkflows aus einer Hand

End-to-End Automatisierung Mehr als Continuous Integration & Continuous Delivery

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Anforderungen gezielter umsetzen, Optimieren, Transparenz schaffen

Einreichung zum Call for Papers

Übungsaufgabe Transaktion als Middleware

Von SVN zu Git. Daniel Willmann cbna

Value Delivery and Customer Feedback

Continuous Delivery mit OpenShift

OP-LOG

Andreas Mösching Senior IT Architekt Hewlett-Packard (Schweiz) GmbH HP Banking Service Center Bern

THOMAS WEHRSPANN. Diplom Wirtschaftsinformatiker Scrum Master. Geburtsjahr 1978 Profil-Stand Juli 2015

Evaluation eines kooperativen Entwicklungswerkzeuges zur Unterstützung von Projektteams am Beispiel von IBM Rational Team Concert.

Praktikum Ingenieurinformatik (PI)

Enterprise JavaBeans Überblick

Übersicht Application Management BMC Remedy ITSM

Git in großen Projekten

JBoss AS 7. Installation, Konfiguration und Betrieb. Alexander Pacnik Karlsruhe,

Praktikum Spring MVC Spring integrieren In der pom.xml Einträge für Spring hinzufügen.

Java Batch Der Standard für's Stapeln

RESTful Services mit Java EE

Software Engineering II

Wer bin ich. > Senior Consultant, Architekt und Trainer (MATHEMA Software GmbH) > 25+ Jahre Software > 12+ Jahre Java Enterprise > 7+ Jahre.

Ora Education GmbH. Lehrgang: Oracle Application Server 10g R2: Administration II

It's time to rethink Datenbank-Design in der schönen neuen Welt

Moodle aktuell halten mit Git

SAP NetWeaver Gateway. 2013

SVN-Einführung für das SEP DS und CM. Julian Timpner, Stefan Brenner, Stephan Rottmann

Make-loses Java für mehr Produktivität: Das z 2 -Environment. Henning Blohm

Transkript:

Operation am offenen Herzen Case Study zur erfolgreichen JEE-7 Migration Dirk Ehms, GameDuell GmbH

GameDuell Plattform Topologie Classic Platform Social Platform 64x Frontend Server OpenMQ 16x Frontend Server Randbedingungen: keinen Einfluss auf Betrieb Entwicklung 10x Persister Server 10x Reporting / Administration SQL / NoSQL / LDAP

GameDuell Entwicklungsumgebung Werkzeuge 300++ Maven Module EAR WAR 10x Deployment Artefakte 1x Assembly pro Stunde 1-2 Deployments pro Tag

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 4

Dependency Management: Module POM <project> <parent> <groupid>de.gameduell</groupid> <artifactid>jee-parent</artifactid> <version>2.8.0</version> </parent> <dependencies> <dependency> <groupid>javax</groupid> <artifactid>javaee-api</artifactid> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> </project> $ mvn clean install $ mvn clean install P jee7 5

Dependency Management: Parent POM <project> <profiles> <profile> <id>jee6</id> <activation> <activebydefault>true</activebydefault> </activation> <dependencymanagement> <dependencies> <dependency> <groupid>javax</groupid> <artifactid>javaee-api</artifactid> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> </dependencymanagement> </profile> <profile> <id>jee7</id> <dependencymanagement> <dependencies> <dependency> <groupid>javax</groupid> <artifactid>javaee-api</artifactid> <version>7.0</version> <scope>provided</scope> </dependency> </dependencies> </dependencymanagement> </profile> 6

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 7

Source Code Branches 1. Anlegen einer Kopie vom Trunk / Master 2. Notwendige JEE-7 Anpassungen durchführen 3. Weiterentwicklung erfolgt wie bisher auf dem Trunk 4. Änderungen automatisch zusammenführen 2) svn commit JEE-7 Branch 3) svn commit Trunk / Master 8

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 9

GameDuell Build Pipeline Source Repository Artifact Repository 1. Check-in 2. Trigger Jenkins 3. Artifact Deploy 4. Update JIRA Ticket 5. Success email 6. Status: Integrated $ svn ci m XYZ-4711, //minor 10

Jenkins konfigurieren (Trunk) SECONDARY PRIMARY $ mvn clean verify P jee7 Jenkins Job ARTIFACT ARTIFACT social-services-2.9.1.jar social-services-2.9.1.jar 1. Neuen Jenkins Job anlegen 2. Nachfolger-Job starten

Jenkins konfigurieren (Branch) SECONDARY PRIMARY Jenkins Job ARTIFACT ARTIFACT social-services-2.9.1.jar social-services-2.9.1-jee7.jar 1. Neuen Jenkins Job anlegen 2. VCS Merge 3. Nachfolger-Job starten 4. Merge Konflikt (optional)

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 13

GameDuell Release Pipeline Artifact Repository Assembly Monkey 1. Assembly Monkey (1x pro Stunde) 2. Integrated Tickets 3. Dependency Update 4. Trigger Jenkins 5. Artifact Deploy 6. User Acceptance Tests Source Repository 14

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 15

Rolling Deployment / Zero Downtime Load Balancer UAT Ops Team QA Team EAR WAR 1. 50% der Frontends auf Standby 2. Deployment auf einem Frontend 3. User Acceptance Tests 4. Exploratives Testen 5. Echte User auf das Frontend 6. Rollout fortsetzen 7. Vollständiger Rollout

Inkrementeller Rollout 17

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 18

Laufzeitverhalten überwachen Vergleich zwischen GF3 und GF4 (Speicherverbrauch, CPU, Threads, GC) Tools: JConsole, Java VisualVM, Java Mission Control, Java Flight Recoder 19

Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 20

Aufräumarbeiten 1. Integration aller Banches in die zugehörigen Trunks 2. Umstellen der Entwicklungsumgebung auf JEE-7 3. Primäre Jenkins Jobs anpassen (Maven Profil) 4. Alle zusätzlichen Jenkins Jobs löschen 5. Optional: Branches löschen 2) svn delete JEE-7 Branch Trunk / Master 21

Ausgewählte Glassfish Migrationsbeispiele 22

GF3: JAX-RS (web.xml) <web-app> <servlet> <servlet-name>jersey Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.servletcontainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>de.gameduell.rest.accounting</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.pojomappingfeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 23

GF4: JAX-RS (web.xml) <web-app> <servlet> <servlet-name>jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.servletcontainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>de.gameduell.rest.accounting</param-value> </init-param> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jackson.jacksonfeature</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 24

JAX-RS (@Application) @ApplicationPath("/") public class RestfulServiceApp extends Application { } @Override public Set<Class<?>> getclasses() { Set<Class<?>> appclasses = new HashSet<Class<?>>(); appclasses.add(shopresource.class); // enable request debugging with LoggingFilter appclasses.add(loggingfilter.class); // substitution for class :: // com.sun.jersey.api.container.filter.rolesallowedresourcefilterfactory appclasses.add(rolesalloweddynamicfeature.class); // use Jackson Feature instead of POJOMappingFeature appclasses.add(jacksonfeature.class); return appclasses; } @Override public Set<Object> getsingletons() { Set<Object> singletons = new HashSet<>(); // substitution for class :: com.sun.jersey.api.container.filter.postreplacefilter singletons.add(new HttpMethodOverrideFilter(new HttpMethodOverrideFilter.Source[0])); return singletons; } 25

JAX-RS Type Mapping (GF3 -> GF4) Jersey 1.x JAX-RS2 / Jersey 2.x com.sun.jersey.api.client.client com.sun.jersey.api.client.webresource com.sun.jersey.api.client.clientresponse com.sun.jersey.spi.container.containerrequest Filter com.sun.jersey.spi.container.containerrequest com.sun.jersey.spi.container.containerrespons e com.sun.jersey.core.util.readerwriter com.sun.jersey.api.json.jsonconfiguration com.sun.jersey.api.json.jsonjaxbcontext javax.ws.rs.client.client javax.ws.rs.client.webtarget javax.ws.rs.core.response javax.ws.rs.container.containerrequestfilter org.glassfish.jersey.server.containerrequest org.glassfish.jersey.server.containerresponse org.glassfish.jersey.message.internal.readerwri ter org.glassfish.jersey.jettison.jettisonconfig org.glassfish.jersey.jettison.jettisonjaxbcontext 26

JPA / EclipseLink <?xml version="1.0" encoding="utf-8"?> <persistence version="2.0 xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="social-bus" transaction-type="jta"> <provider>org.eclipse.persistence.jpa.persistenceprovider</provider> <jta-data-source>jdbc/busdatasource</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>enable_selective</shared-cache-mode> <properties> <!-- Multiple persistence units clash with EclipseLink 2.5 annotation pre-processor --> <property name="eclipselink.canonicalmodel.subpackage" value="bus" /> </properties> </persistence-unit> <persistence-unit name="social-mps" transaction-type="jta"> <provider>org.eclipse.persistence.jpa.persistenceprovider</provider> <jta-data-source>jdbc/mpsdatasource</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>enable_selective</shared-cache-mode> <properties> <property name="eclipselink.canonicalmodel.subpackage" value="mps" /> </properties> </persistence-unit> </persistence> 27

Byte Code Incompatibility public class SomeManagedBean { } public void foo() { FaceletContext faceletcontext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); String formid = (String) faceletcontext.getattribute("formid"); } // JEE-6 public abstract class FaceletContext extends ELContext { } public static final String FACELET_CONTEXT_KEY = "com.sun.faces.facelets.facelet_context"; // JEE-7 public abstract class FaceletContext extends ELContext { } // The key in the FacesContext attribute map for the FaceletContext instance. public static final String FACELET_CONTEXT_KEY = "javax.faces.facelet_context"; 28

@PostConstruct & Checked Exceptions // Glassfish-3 @Stateless public class AccountingService { } @PostConstruct public void init() throws IOException { } // Glassfish-4 @Stateless public class AccountingService { } @PostConstruct public void init(){ try { } catch(ioexception e) { throw new EJBException(e); } } 29

Resource Injection @Stateless public class DataRetriever { @Resource(name = "jdbc/reporting_3") private DataSource datasource; } @Stateless public class DataRetriever { @Resource(lookup = "jdbc/reporting_3") private DataSource datasource; } 30

Weitere Migrationsbeispiele Jackson-Lib package name (ObjectMapper) org.codehaus.jackson.map com.fasterxml.jackson.databind Geändertes Verhalten der JAXB Implementation Neue Atmosphere-Lib Version (1.0.15 2.1.7) CDI standardmäßig aktiv Fehlende Methoden für handgeschriebene Test-Mocks HttpServletRequest.login() in Verbindung mit Custom Authentication Modules JAX-RS: Default Konstuktoren für Result-Objekte bei WADL Generierung Dateistruktur domain.xml für Embedded Glassfish RESTful Ressource innerhalb von EAR-Artefakten können @Stateless nicht mehr verwenden 31

Vielen Dank https://jaxenter.de/operation-am-offenen-herzen-jee-7-migration-im-laufenden-betrieb-24684 32