continuous integration für eclipse 4 rcp … › wp-content › uploads › slides › v27...maven...
TRANSCRIPT
Die Datenbank-Spezialisten.
Continuous Integration für Eclipse 4 RCP-Anwendungen mit Maven/Jenkins/Nexus/Sonar
Hannes Schmidt – 02.10.2015
Die Datenbank-Spezialisten.
Eclipse-Basics
Die Datenbank-Spezialisten.
Plugins, Features, Produkte …
Plugin A
Plugin B
Plugin C
Feature A
Feature B
Produkt
Die Datenbank-Spezialisten.
Manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: EXAMPLE-PROJECT
Bundle-SymbolicName: org.example.project;singleton:=true
Bundle-Version: 3.18.1.qualifier
Require-Bundle: org.apache.log4j;bundle-version="1.2.0";visibility:=reexport
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: org.example
Import-Package: org.osgi.framework;version="1.7.0";resolution:=optional
Die Datenbank-Spezialisten.
Projektanalyse vor Eclipse RCP
Die Datenbank-Spezialisten.
Stand vor Eclipse RCP-Projekt
Ticketsystem Eigenentwicklung
Versionsverwaltung Eigenentwicklung
Ticket- und Versionsverwaltung auf selber DB, arbeiten eng miteinander zusammen
Applikationsstart über Java Webstart
Die Datenbank-Spezialisten.
Stand vor Eclipse RCP-Projekt
Ticket kapselt installierbaren Patch
pro Werktag 20 – 40 Tickets Durchsatz
jeder Kunde hat anderen Patchstand
Installation eines Patches mittels Apache Ant
Die Datenbank-Spezialisten.
Modultypen
Datenbankmodule (Tabellen, Sequenzen, Trigger, Packages, Views, Types …)
Datenbankskripte (Stammdaten, Datenmigration)
Java-Module, über Eclipse exportiert
Oracle-Forms-Module (Maske, Bibliothek)
Die Datenbank-Spezialisten.
Probleme
veraltete Technologie (Oracle Forms)
Komplexität: ~1000 Forms-Masken, +20000 DB-Module
sehr modulare Auslieferung
extrem kurze Patchzyklen
Die Datenbank-Spezialisten.
Continuous Integration
Die Datenbank-Spezialisten.
Continuous Integration
„Beschreibt den Prozess des fortlaufenden Zusammenfügens von Komponenten zu einer Anwendung.“
Die Datenbank-Spezialisten.
Motivation für CI
kurze Patchzyklen im Projekt
Release-Aufwand war mit vorheriger Technologie sehr gering
Entwicklungsgeschwindigkeit musste gleich bleiben
im RCP-Projekt sollte der Release-Aufwand genauso niedrig sein
Die Datenbank-Spezialisten.
Tools für CI
Versionsverwaltung
Repository-Manager
Build-Automatisierung
Continuous Integration Tool
Tool für Code-Qualität
Die Datenbank-Spezialisten.
Versionsverwaltung
Die Datenbank-Spezialisten.
Versionsverwaltung
Subversion
CVSGit
Mercurial
Bitkeeper
zentralisiert
verteilt
Die Datenbank-Spezialisten.
Variante 1
core core-test
Plugin Plugin.test
SCM-Repository A
branches
tags
trunk
branches
tags
trunk
…
…
Die Datenbank-Spezialisten.
Variante 2
core
Host
SCM-Repository A
branches
tags
trunk
Plugin
Test
Die Datenbank-Spezialisten.
Repositories
Die Datenbank-Spezialisten.
p2 Repository
Equinox Sub-Projekt
Updateseite
Erstellen der Compile-Umgebung
content.xml
artifacts.xml
features/
plugins/
a.feature_1.0.0.xml
a.plugin_1.0.0.jar
Die Datenbank-Spezialisten.
Maven2 Repository
lokal
intern
öffentlich
org
example
example-project
1.0.0
example-project-1.0.0.jar
example-project-1.0.0-source.jar
Die Datenbank-Spezialisten.
Repository-Manager
Die Datenbank-Spezialisten.
Repository-Manager
Archiva
Artifactory
Nexus
Die Datenbank-Spezialisten.
Konfiguration Repositories
m2-Snapshot-Repo
m2-Stable-Repo
p2-Snapshot-Repo
p2-Stable-Repo
mavendeploy
release
p2-Third-party-Repo
special
P2-Capability P2-Capability
Die Datenbank-Spezialisten.
Build-Automatisierung
Die Datenbank-Spezialisten.
Build-Automatisierung
Apache Ant
Apache Maven
Gradle
Eclipse PDE
Die Datenbank-Spezialisten.
Maven
Lebenszyklus
– validate, compile, test, install, deploy…
Project Object Model
Convention over Configuration
Abhängigkeitsmanagement
Die Datenbank-Spezialisten.
Tycho
Extension für Maven
Manifest-first
unterstützt Bundles, Fragmente, Features, Update-Sites …
kaum Redundanz in Metadaten bei POM und Manifest
Die Datenbank-Spezialisten.
Jarcontent.xml
PluginsTargetmanifest.mf
Tycho – Funktionsweise
pom.xml Repository
src/
Die Datenbank-Spezialisten.
Maven Konfigurationsbaum
company-parent
tycho-parent
project-parent
core-parentmasks-parent maskparts-parent
A BC D E F
Parent und Reaktor
Die Datenbank-Spezialisten.
Plan
RCP-Quellenbestehende Prozesslandschaft
?
Die Datenbank-Spezialisten.
Maven Release Plugin – Preparation Goals
<preparationGoals>
org.codehaus.mojo:build-helper-maven-plugin:1.8:parse-version
org.eclipse.tycho:tycho-versions-plugin:${tycho.version}:update-pom
org.eclipse.tycho:tycho-versions-plugin:${tycho.version}:set-version
-DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.
${parsedVersion.incrementalVersion}
scm:checkin
-Dincludes="META-INF/MANIFEST.MF"
-Dmessage="[maven-release-plugin] sync manifest and pom version[${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}]"
-Dtycho.mode=maven
</preparationGoals>
Die Datenbank-Spezialisten.
Maven Release Plugin – Completion Goals
<completionGoals>
org.codehaus.mojo:build-helper-maven-plugin:1.8:parse-version
org.eclipse.tycho:tycho-versions-plugin:${tycho.version}:update-pom
org.eclipse.tycho:tycho-versions-plugin:${tycho.version}:set-version
-DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.
${parsedVersion.incrementalVersion}.qualifier
scm:checkin
-Dincludes="META-INF/MANIFEST.MF"
-Dmessage="[maven-release-plugin] sync manifest and pom version[${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.qualifier]"
-Dtycho.mode=maven
</completionGoals>
Die Datenbank-Spezialisten.
Maven Release Plugin – weitere Konfiguration
<goals>deploy,signservice:sign,de.robotron.maven.plugins:rvcs-maven-plugin:${rvcs.version}:checkin</goals>
<remoteTagging>false</remoteTagging>
<suppressCommitBeforeTag>true</suppressCommitBeforeTag>
<useReleaseProfile>false</useReleaseProfile>
Die Datenbank-Spezialisten.
Target-Definition-Dateien
Die Datenbank-Spezialisten.
Aufbau
<target name="plugin-target" sequenceNumber="1">
<locations>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit">
<repositorylocation="http://nexus.example.com/content/repositories/repoA/.meta/p2/"/>
<unit id="com.example.plugin" version="1.1.1.c201507281332"/>
<unit id="com.example.plugin.source" version="1.1.1.c201507281332"/>
</location>
<locations>
</target>
Die Datenbank-Spezialisten.
unstable-plugin-target
entspricht dem Trunk im Subversion
zum Bauen von Snapshots
automatische Aktualisierung nach Snapshot-Build
keine Tags, immer Version 1.0.0-SNAPSHOT
Die Datenbank-Spezialisten.
stable-plugin-target
enthält alle über Maven Release freigegebenen Module
zum Bauen von Stable-Plugins (Maven Release)
automatische Aktualisierung nach Maven Release
keine Tags, immer Version 1.0.0-SNAPSHOT
Die Datenbank-Spezialisten.
feature-target
enthält alle Features des Projekts
zum Materialisieren von Produkten
händische Aktualisierung
keine Tags, immer Version 1.0.0-SNAPSHOT
Die Datenbank-Spezialisten.
running-number-plugin-target
pro möglichem Patchstand ein Tag
Trunk enthält den zurzeit freigegebenen Patchstand
zum Bauen von Hotfixes
Die Datenbank-Spezialisten.
Continuous Integration Tool
Die Datenbank-Spezialisten.
Continuous Integration Tool
JenkinsHudson
Bamboo
Die Datenbank-Spezialisten.
regular regularregular regular regular regular
nightlynightlynightly
Jenkins Job Overview
core-parentmasks-parent maskparts-parent
A BC D E F
Die Datenbank-Spezialisten.
Jenkins Jobverwaltung
Jenkins-Maven-Plugin
Job im XML definieren
Vererbung
kaum C&P-Fehler
Plugin erzeugt config.xml
Publish über Jenkins REST-API
Die Datenbank-Spezialisten.
Einen Job anlegen
<job><id>pluginA</id><parent>common-deploy</parent><repository>
<remote>http://svn/core/trunk/pluginA</remote><local>.</local>
</repository></job>
Die Datenbank-Spezialisten.
API zur Verfügung stellen
Moduljobgav update-
target-file-job
update-target-file-job SVNtarget.xml
Nexus
Die Datenbank-Spezialisten.
Deployment auf Entwicklungs-Application-Server
Moduljobgav update-
target-file-job
jar
Applserv
gav deploy-to-applserv-job
deploy-to-applserv-job
Nexus
Die Datenbank-Spezialisten.
Module Release
Maven-release-plugin, Jenkins Maven Release Plug-in Plug-in
Die Datenbank-Spezialisten.
Buildflow
manche Jobs haben Vorgänger …
CloudBees Build Flow plugin
– kann Build-Pipelines abbilden
– einfache DSL build( "job1" ) build( "job2" ) build( "job3" )
Die Datenbank-Spezialisten.
Third-Party
Die Datenbank-Spezialisten.
Third-Party Repository erstellen
Nexus-Site
pom.xml
org.reficio:p2-maven-plugin
P2-Repocp / scp
Die Datenbank-Spezialisten.
org.reficio:p2-maven-plugin Beispiel
Die Datenbank-Spezialisten.
Konfiguration ohne manifest.mf
Die Datenbank-Spezialisten.
Third-Party releasen
alle Plugins aus Feature-repo runterladen
wenn BSN nicht mit „your.domain.“ beginnt
über API ins Ticketsystem, wenn API-Version dort noch nicht vorhanden ist
Die Datenbank-Spezialisten.
Unit Tests
Die Datenbank-Spezialisten.
URL-Trigger
Test-Job Nexus
latest unstable-plugin-target
Starte Job
Version von Host geändert
Die Datenbank-Spezialisten.
Unit Tests – warum so kompliziert? SVN-Struktur
core core-test
Plugin Plugin.test
trunk trunk
Host
…
Plugin
Test
Die Datenbank-Spezialisten.
pom.xml
pom.xml
Unit Tests – neuer Ansatz
Job SVN
Generische Reaktor-POM
Host
Test
pom.xml
Host
Test
schnelleres Feedback
weniger Jobs
Die Datenbank-Spezialisten.
Code-Qualität
Die Datenbank-Spezialisten.
Code-Qualität
SonarQube
manuell automatischPMD
CheckstyleFindbugs
SonargraphInspektion
AuditPair Programming
Walkthrough
Atlassian Crucible
Die Datenbank-Spezialisten.
Sonar
Nightly Build aktualisiert Sonar
deshalb lokale Analysen:
– Sonarqube for Eclipse
– Preview-Analysis mit maven-sonar-plugin und HTML-Report
Sonar-Analyse vor dem Release
… langsames Feedback
Die Datenbank-Spezialisten.
Quality Gates
Die Datenbank-Spezialisten.
Release Sonar Test
Build Breaker-Plugin für Sonar
erreicht die Sonar-Analyse vor dem Release das Quality-Gate nicht, dann wird das Release abgebrochen
Die Datenbank-Spezialisten.
Release Sonar Test Umsetzung
Release-Build
IS_RELEASEBUILD
SNAPSHOT-Build
ConditionalBuildStepPlugin
mvn -B -e sonar:sonar
-Dsonar.profile="Profilname"
-Dsonar.qualitygate="QualityGateName"
-Dsonar.buildbreaker.skip=false
-Dsonar.branch=release
-P maven-sonar-release,module-release
Die Datenbank-Spezialisten.
Weitere Integrationstests
Die Datenbank-Spezialisten.
Schritte nach Maven-Release
Integration des Patches auf das Integrationssystem mittels Apache ANT
Nach Deployment folgen Integrationstests …
Die Datenbank-Spezialisten.
Entity-Integration-Test
Datenmodell-Änderungen brechen Entitäten-API
Entitäten-API-Erweiterungen werden ohne Datenmodell-Änderung abgegeben
deshalb: Gleichzeitige Integration von Datenmodell-Änderungen und Entitäten Prüfung
– aller abgegebenen Entitäten gegen das Datenmodell
– aller abgegebenen Datenmodelländerungen gegen Entitäten
Bei Inkompatibilität schlägt der Integrationsbuild fehl
Die Datenbank-Spezialisten.
OSGi-Integration-Test
OSGi mit allen Bundles starten
OSGi-Konsole: „ss -s installed“
werden Bundles ausgegeben, schlägt der Build fehl
Beispiel-Whitelist: ^.+\.win32.+$
Die Datenbank-Spezialisten.
Epilog
Die Datenbank-Spezialisten.
Contra
Releasen dauert pro Plugin 10 – 15 min
teils große Abhängigkeitsbäume für Patches
viele Jobs im Jenkins
Die Datenbank-Spezialisten.
Pro
häufige Integration (trigger durch commit)
schnelles Feedback
relativ genaue Problemzuordnung möglich
automatisierte Quellcodeanalyse
Vorbereitung für modulare Auslieferung
Die Datenbank-Spezialisten.
Fragen?
Hannes SchmidtKonfigurationsmanager
www.robotron.de
Die Datenbank-Spezialisten.
Quellen
https://de.wikipedia.org/w/index.php?title=Kontinuierliche_Integration&stableid=144464982
https://de.wikipedia.org/w/index.php?title=Versionsverwaltung&stableid=142123493
https://maven.apache.org/repository-management.html
https://de.wikipedia.org/w/index.php?title=Apache_Subversion&stableid=145933763
https://cwiki.apache.org/confluence/display/MAVENOLD/Repository+Layout+-+Final
https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins
https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin
Die Datenbank-Spezialisten.
Anhang: Tools – Versionen und Plugins
Die Datenbank-Spezialisten.
Maven
Version 3.0.4
org.apache.maven.plugins:maven-compiler-plugin:3.1
org.apache.maven.plugins:maven-deploy-plugin:2.7
org.apache.maven.plugins:maven-source-plugin:2.2.1
org.apache.maven.plugins:maven-scm-plugin:1.9
org.apache.maven.plugins:maven-release-plugin:2.3.2
org.codehaus.mojo:build-helper-maven-plugin:1.8:parse-version
org.reficio:p2-maven-plugin:1.0.2
Die Datenbank-Spezialisten.
Tycho
Version 0.19.0
org.eclipse.tycho:tycho-packaging-plugin
org.eclipse.tycho:tycho-source-plugin
org.eclipse.tycho:target-platform-configuration
org.eclipse.tycho:tycho-versions-plugin:update-pom
org.eclipse.tycho:tycho-versions-plugin:set-version
Die Datenbank-Spezialisten.
Jenkins
Version 1.546
Jenkins Xvfb plugin 1.0.12
Jenkins URLTrigger Plug-in 0.37
Rebuilder 1.20.0
Timestamper 1.6.2
Jenkins Maven Release Plug-in Plug-in 0.13.0
Jenkins Sonar Plugin 2.1
conditional-buildstep 1.3.3
CloudBees Build Flow plugin 0.18
Die Datenbank-Spezialisten.
Nexus
Version 2.5.1-01
Nexus p2 Repository Plugin 2.3.2
Die Datenbank-Spezialisten.
Sonar
Version 4.5.5
Build Breaker 1.1
Issues Report 1.3