Make Catchphrase Eclipse RCP gradle again CI von Eclipse RCP Anwendungen mit Gradle/Jenkins Johannes Tandler Michael Barth 09.03.2017 Dresden
Agenda 1. Eclipse IDE 2. Eclipse RCP 3. Repositories I 4. Architecture 5. Repositories II 6. Gradle/Jenkins/CI 7. BuildMonkey
Visualisierung von Maschinendaten Mobile HMI in der Industrie 4.0
HMI SUITE - MONKEY WORKS GMBH Entwicklungsumgebung für Maschinenvisualisierung Eclipse RCP-Applikation Nutzung vieler Eclipse-Technologien Grafische & Textuelle (DSL) Editoren Codegenerierung Serverkomponente (ProcessHub) Bibliotheken für mobile Plattformen
Der konkrete Fall Es war einmal Eclipse
Eclipse IDE Geschichte Release 2001 als IDE mit Schwerpunkt JAVA 2004 Wechsel auf OSGI-Basis (Equinox) Heute Riesiges Universum an Projekten und Distributionen Multi - Language Support
Eclipse RCP Eclipse zugrundeliegendes Applikationsframework Eclipse und jede Variante davon ist eigene RCP - Applikation XMind, IBM Rational Developer MONKEY WORKS HMI Suite Workbench Dependency Injection, Services, Build tooling Abbildung: Eclipse RCP-Applikation XMind
Eclipse RCP Theorie Produkt = Features + Plugins + Configuration + Assets + Binaries Feature = Plugins + Andere Features Ein Plugin (Projekt) = Java Bibliothek + zusätzliche Konfiguration Praxis Eclipse RCP Produkt = Target Platform + Product File + Magie
Eclipse RCP Eigenes Buildsystem (PDE) Eigenes Dependencymanagement Als Teil der MANIFEST.MF Eigenes Management von Repositories und Nutzung derer Target-Platform Abbildung: Target-Platform Definition
Eclipse provisioning platform - P2 Provisioning Platform für OSGI-Applikationen Geschichte Veröffentlichung mit Eclipse Ganymede Als Ersatz des alten Update - Mechanismus Abbildung: Logo von Eclipse Ganymede
Eclipse P2 Begriffe Repository Metadata Installable Unit Feature Plugin Artifact Abbildung: Begrifflichkeiten in der P2-Domäne
Eclipse P2 Struktur Trennung von Metadaten : Beschreibung von Inhalt und Abhängigkeiten Artefakten : URL, Artefaktgröße, Hash, etc. Zentraler Index notwendig Abbildung: Beispiel eines P2-Repositories
Eclipse P2 Architektur Abbildung: Architektur von Eclipse P2
Maven Build-Management-Tool für Java-Projekte Deskriptiver Ansatz Geschichte: Release 1.0 im Jahr 2002 Release 3.0 im Jahr 2010 Aktuell Version 3.3.9 Repository-Format von anderen Buildwerkzeugen adoptiert Umfangreiche Unterstützung Konvention vor Konfiguration
Maven Begriffe Project Pom Dependencies GroupID Artifact Abbildung: Beispiel einer pom.xml aus der offiziellen Mavendokumentation
Maven Architektur pom s Project Object Model Dependency Manager M2 Repository Project lifecycle plugin plugin plugin src gen bin Abbildung: Architektur von Maven
Maven Struktur Gesamtes Repository ist an einem Ort gespeichert Konvention für Ordnerbenennung Buildbeschreibung (Pom) wird mitgespeichert Kein zentraler Index notwendig Abbildung: Beispiel eines Maven Repositories
Build Das sollte doch ganz einfach sein...
Problematik External P2 Eclipse Plugin - Projekt MF src Buildtool External M2
Exist. Lösungsansätze Eclipse Orbit Umwandlung von Maven- Abhängigkeiten in Eclipse Plugins Bereitstellung mit P2-Repository Eclipse Projekte Verschiedene Eclipse Projekte deployen Artefakte nach Maven Central
Exist. Lösungsansätze Tycho Sammlung von Maven-Mojos für Eclipse Projekte Erlaubt den Zugriff auf P2-Repositories mit Maven P2 Maven / Tycho M2 Erlaubt den Zugriff auf Maven-Abhängigkeiten aus Eclipse-Plugins (m2e) Produkterstellung möglich Build lokales P2 lokales M2 Produkt Abbildung: Funktionsweise von Maven / Tycho
Buildsystem - Alt Codebasis XXX.XXX Zeilen 3+ Programmiersprachen Branchspezifische Builds Produktdeployment für Master Buildzeiten von 2 Stunden Inkonsistente Builds Komplex Keine Abhängigkeitspflege Kein Continuous Delivery
Buildsystem - Wünsche Viel kürzere Buildzeiten Deployment von Branches möglich Leichtere Pflege von Abhängigkeiten durch Entwickler Komplette Isolation von Buildzweigen Continuous Delivery
Lösungsidee Wünsche Reduzierung von Maven Buildtool soll sich nach Entwicklung richten nicht andersherum Manifest First Integration von externen Abhängigkeiten in Eclipse Keine exotischen Eclipse-Plugins Persistenz von Abhängigkeiten
Lösungsarchitektur External P2 Eclipse Internal P2 Plugin - Projekt gradle - m2 MF src gradle - p2 gradle - build Internal M2 gradle External M2
Repositories II OSGi-Repository Im P2 und M2 Format Beinhaltet alle Abhängigkeiten aus Eclipse-Ökosystem Unterstützt Branching Thirdparty-Repository Im P2 und M2 Format Umfasst alle Abhängigkeiten aus externen Quellen Unterstützt Branching Feature/Branch-Repositories Im M2 Format Umfasst Buildartefakte des jeweiligen Branch
Buildpipeline Wenn Sie jetzt noch wach sind...
Gradle/Jenkins/CI Continuous Integration Eclipse Development Jenkins DSL Gradle tasks Build Artefacts Maven Artefacts Java Gradle Source Scripts Build Process Artefact Server Artifactory Git SCM Build Server Dependencies Maven Artefacts Jenkins
Gradle/Jenkins/CI Erstellen der Target Platform gradle mirrorp2repository Source Platform Mirror task Public P2 Repositories gradle mavenizep2repository One local P2 Repository Mavenize task Local Maven Repository gradle artifactoryupload_1 gradle artifactoryupload_0 Artifactory/ Osgi/p2 Upload tasks Artifactory/ Osgi/m2 gradle createtargetplatform Target file task Target Platform gradle publishtargetplatform Publish target file task Git/ TargetPlatforms
Gradle/Jenkins/CI Erstellen des Third Party Features gradle updatesite (bnd-tools) Libraries Update site task Maven Repositories gradle mavenizep2repository gradle artifactoryupload_1 gradle artifactoryupload_0 One local P2 Repository Artifactory/ Thirdparty/p2 Mavenize task Upload tasks Local Maven Repository Artifactory/ Thirdparty/m2 gradle updatetargetplatform Update Target file task Target Platform Git/ TargetPlatforms
Gradle/Jenkins/CI Aufbau eines Features Plugins als Unterprojekte Root Gradle Script, Jenkins Script, Feature Properties Aufbau eines Plugins Source- Verzeichnis Mavenkonform Manifest Datei, Eclipse Projekt Dateien, Plugin Properties
Gradle/Jenkins/CI Bauen eines Features Feature aus SCM Gemeinsame Gradle Skripte build (assemble, test, check) publish trigger upstream
Gradle/Jenkins/CI Erstellen eines Produktes.product prepareproduct Feature list gradle publishproduct bnd-tools updatesite materialise lokales P2 Produkt
BuildMonkey Open Source Projekt initiiert von MONKEY WORKS https://github.com/monkey-works/buildmonkey Ziel ist die Abbildung der gesamten Buildpipeline in gradle gradle build.gradle commons.gradle Plugins 4 Hauptprojekte: ArtifactoryUpload Compilation Repository Materialisation Mitarbeit ausdrücklich gewünscht
BuildMonkey ArtifactoryUpload kopiert jede Filestruktur in ein Artifactory Repository gradle artifactoryclearrepository gradle artifactoryupload_n
BuildMonkey Compilation ManifestDependencyPlugin FixDependencyVersion ModifyBundle
BuildMonkey Repository P2MirrorPlugin MavenizerPlugin P2DeployerPlugin MavenArtefactsPlugin
BuildMonkey Materialisation Build Product Execute Tests
Fazit Buildzeiten drastisch reduziert auf 5 Minuten (komplett ca. 30 Minuten) Continuous Delivery ist möglich Buildskripte sind selten länger als 1 Bildschirmseite und lesbar Dependency- Pflege viel einfacher Branches nutzen konsistente Umgebung Produkte sind auch von Branches aus erstellbar
Wir danken für Ihre Aufmerksamkeit und den Projekten Wuff, Buildship, Tycho und bnd-tools