Konfigurationsmanagement für Oracle APEX -Teil 2 Delta, Merge und Forks

Im zweite Teil der Reihe geht es um das Zusammenführen (merge) von parallelen Entwicklungssträngen (fork) von Oracle APEX-Anwendungen.

Das Zusammenführen zweier paralleler Entwicklungsstränge bringt einiges an Aufwand mit sich. Ich möchte Ihnen in diesem Beitrag ein mögliches Vorgehe beschreiben.

Zu Anfang geht es darum sich das Delta der beiden Releases bewusst zu machen. In welchen Punkten weichen die Datenbank Schemas voneinander ab? Welche Datenbankobjekte müssen in dem Zielschema neu erzeugt werden? Welche werden nicht mehr benötigt oder müssen angepasst werden?

Im zweiten Schritt stellen Sie sich ähnliche Fragen für die eigentliche Anwendung. Welche Anwendungsteile, seien es Seiten, Regionen, Items oder Shared Components, sind neu, entfallen oder wurden geändert?

Aus diesen Analysen ergibt sich eine ToDo Liste der Anpassungen, die Sie durchführen müssen.

Im nächsten Schritt führen Sie die Objekte der Schemas zusammen, so dass Sie ein gemeinsames neues Datenmodell für das neue Release erhalten. Auf dieser Basis passen Sie dann die Supporting Objects im Basisentwicklungsstrang an.

Zu guter Letzt, geht es noch an das Überarbeiten der Anwendung. Dabei müssen Sie neue Seite aus dem parallelen Release in die Basisversion integrieren. Evtl. müssen Sie nicht mehr benötigte Bestandteile entfernen. Der aufwändigste Part wird in der Regel die manuelle Integration von partiellen Änderungen , z.B. in einer vorhandenen Seite sein.

Datenmodelle vergleichen und Unterschiede ermitteln

Es gibt sicher viele Ansätze, mit denen Sie ausgehend von einem Entwicklungsstand eines Datenmodells die Änderungen zu einem neues Release ermitteln können. An dieser Stelle möchte Ich Ihnen zwei Varianten vorstellen.

Änderungen protokollieren

Mit etwas Disziplin könnten Sie jede Änderung, die Sie vornehmen, als DDL-Skript speichern. Ich persönlich finde allerdings, dass man durch solche Verwaltungsaufgaben immer aus seinem Arbeitsfluss gerissen wird. Wenn Sie so ein Vorgehen präferieren, dann schauen Sie sich doch einmal diesen Beitrag Protokollieren von Strukturänderungen an. Dort stelle ich Ihnen eine Möglichkeit vor, wie Sie einen DDL-Trigger nutzen können, der alle Änderungen an einem Schema protokolliert.

Abbildung 1: Änderungshistorie

Auf Basis dieses Protokolls können Sie ein DDL-Skript entwickeln, um damit das Datenmodell eines Releases in das Modell eines neueren Releases zu überführen.

Schema vergleichen

APEX bringt aber auch von Haus aus eine sehr nützliche Funktion für diesen Fall mit. Im SQL Workshop finden Sie im Bereich Utilities den Link Schema Comparison. Da hinter verbirgt sich ein Werkzeug, mit dem Sie die Objekte eines Schemas mit denen eines anderen Schemas vergleichen können. Ihnen werden allerdings nur die Schemas angezeigt, die dem Workspace zugeordnet wurden.

Wie Sie im ersten Teil dieser Beitragsreihe lesen konnten, können Sie einem APEX-Workspace mehrere Schemas zuordnen. Möchten Sie nun für eine neue Version Ihrer Anwendung ein Upgrade-Skript entwickeln, so können Sie wie folgt vorgehen.

Stellen Sie aus Ihrem Anwendungsarchiv die Vorgängerversionen Ihrer Anwendung wieder her.

Abbildung 2: Anwendung in neuem Schema wiederherstellen

Dabei wählen Sie ein anderes Schema als bei der aktuellen Version Ihrer Anwendung. Wenn Sie in Ihrer Anwendung die notwendigen DDL-Skripte als Supporting Objects hinterlegt haben, führen Sie diese bei der Installation aus.

Abbildung 3: Install Supporting Objects

Jetzt haben Sie in Ihrem Workspace das Schema Ihres Basisentwicklungsstrangs und das Schema des Vorgänger Releases im Zugriff.

Den Vergleich der jeweils enthaltenen Objekte können Sie anschließend mit Hilfe des Utilities Schema Comparison durchführen.

Abbildung 4: Schema Vergleichen

Die Handhabung ist einfach. Wählen Sie die zu vergleichenden Schemas aus und legen Sie bei Bedarf noch einen Filter fest. Dann klicken Sie auf Compare.

Abbildung 5: Schemas vergleichen

Als Ergebnis erhalten Sie eine Übersicht der abweichenden Datenbankobjekte. Anhand dieser Liste können Sie die fehlenden DDL-Skripte erstellen.

Anwendungsteile vergleichen, Unterschiede ermitteln

Eine APEX-Anwendung wird durch Ihre Eigenschaften definiert. Diese Daten werden bei APEX in Tabellen gespeichert. Diese strukturierte Ablage der Definition macht es möglich, Anwendungen sehr detailliert vergleichen zu  können.

Im Internet findet man vereinzelt Ansätze, mit denen Sie die Unterschiede zweier Anwendungen ermitteln können. Beispielsweise existiert ein Open Source Projekt auf github namens apex-diff, welches einen Vergleich ermöglicht.

Ein andere Möglichkeit bieten die APEX-Views. Über diese können Sie entsprechende select-Statements  entwickeln, die einzelne Bestandteile zweier Anwendungen miteinander abgleichen. So ein Abgleich – hier für die Pages – kann z.B wie in Listing 1 aussehen.

SELECT
    n.page_id,
    n.page_name,
    'Page was changed ( N: '
    || n.last_updated_on
    || ' , O: '
    || o.last_updated_on || ' )' AS info
FROM
    apex_180100.apex_application_pages n,
    apex_180100.apex_application_pages o
WHERE
    n.application_id = 115
    AND o.application_id = 113
    AND n.page_id = o.page_id
    AND n.last_updated_on <> o.last_updated_on
UNION
SELECT
    n.page_id,
    n.page_name,
    'New page in application ' || n.application_id AS info
FROM
    apex_180100.apex_application_pages n
WHERE
    n.application_id = 115
    AND NOT EXISTS (
        SELECT
            'X'
        FROM
            apex_180100.apex_application_pages o
        WHERE
            o.application_id = 113
            AND n.page_id = o.page_id
    )
UNION
SELECT
    o.page_id,
    o.page_name,
    'Deleted page ' AS info
FROM
    apex_180100.apex_application_pages o
WHERE
    o.application_id = 113
    AND NOT EXISTS (
        SELECT
            'X'
        FROM
            apex_180100.apex_application_pages n
        WHERE
            n.application_id = 115
            AND n.page_id = o.page_id
    );

Listing 1: App 115 mit App 113 vergleichen

Das Ergebnis sieht dann beispielhaft so aus.

Abbildung 6: Abweichende Seiten zweier APEX-Anwendungen

Auf Basis der APEX-Views können Sie auf diese Art und Weise für alle Komponenten einer APEX -Anwendung entsprechende Vergleiche erstellen.

APEX selbst bietet für den Anwendungsvergleich unter seinen WorkspaceUtilities aber auch ein entsprechendes Werkzeug namens Application Comparison.

Abbildung 7: APEX-Anwendungen vergleichen

Dieses liefert Ihnen eine Liste mit abweichenden Objekten.

Zusammenführen von Entwicklungszweigen (fork)

Grundsätzlich müssen Sie hier zwei Bereiche der Anwendung betrachten. Die Datenbankobjekte und die Anwendung.

Datenmodell bzw. Datenbankobjekte

Auf Basis der im vorhergehenden Abschnitt ermittelten Unterschiede können Sie nun das Schema des Basisentwicklungsstrangs auf den benötigten aktuellen Stand bringen.

Zuerst legen Sie die neue Objekte an. Dazu können Sie z.B. ein DDL-Statemit auf Basis des vorhandenen Objektes extrahieren oder Sie ermitteln die DDL- Anweisung wie oben beschrieben mit einem DDL-Trigger aus einer Log Tabelle.

Abweichende Datenbankobjekte (Tabellen, Views , Packages,…) müssen nun von Hand überarbeitet werden. Hier müssen Sie entscheiden, ob eine Version durch eine aktuelle Version komplett ersetzt werden kann oder ob eine manuelle Ergänzung notwendig ist. Als Beispiel seien hier neue Spalten in einer Tabelle oder neue Funktionen in einem PL/SQL Package erwähnt.

Als Ergebnis haben Sie in Ihrem Basisschema abschließend alle benötigten Datenbankobjekte aus beiden Entwicklungssträngen zusammen gefügt.

Supporting Objects

APEX bietet mit den Supporting Objects – wie bereits erwähnt – die Möglichkeit DDL und DML-Skripte in der Anwendung zu hinterlegen, die bei der Installation der Anwendung ausgeführt werden.

Ein einfacher Ansatz ist es ein DDL-Skript zu entwickeln, welches alle benötigten Datenbankobjekte von Grund auf neu erzeugt. Da es aber recht zeitaufwendig und fehleranfällig ist ein komplett neues Installationsskript zu erstellen, können Sie auch einfach ein weiteres DDL-Skript nach dem bereits vorhandenem laufen lassen. Dieses ergänzt dann die neuen Objekte.

Die Migration der bestehenden Daten einer produktiven Vorgängerversion kann in einem zweiten Schritt über ein Upgrade Skript erfolgen. Bei diesem Ansatz fügen Sie dem produktiven Workspace ein neues Schema hinzu in dem Sie die Anwendung inkl. aller Datenbankobjekte des neuen Releases installieren. Abschließend wird dann über die Supporting Objects ein Skript ausgeführt, welches die Daten aus der Vorgängerversion in die neue Tabellen des neuen Schemas überführt.

Dieser Ansatz bietet aus meiner Sicht den Vorteil, dass Sie immer eine sehr einfache Fallback-Variante haben. Die Altdaten und die alte Anwendung werden nicht angetastet und können im Fehlerfall weiter genutzt werden.

Werkzeuge

APEX bietet in seinem SQL Workshop das Werkzeug Generate DDL, mit dem Sie – auch selektiv – für vorhandene Datenbankobjekte DDL-Skripte erzeugen können.

Abbildung 8: SQL Workshop-Generate DDL

Auf dieser Basis können Sie dann  entsprechende Skripte erstellen und diese in den Supporting Objects hinterlegen.

Ein anderes sehr nützliches Tool finden Sie direkt in den Supporting Objects. In dem Bereich Installation Scripts können Sie über die Schaltfläche Create > einen Wizzard starten, der Ihnen zu Beginn u.a. die Option “Create from Database Object’ anbietet.

Abbildung 9: Supporting Objects – Install

Bei dieser Variante können Sie für verschiedene Datenbankobjekte entsprechende DDL Skripte erzeugen lassen und direkt in den Supporting Objects speichern.

Abbildung 10: Create from Database Object

Anwendungsteile zusammen führen

Jetzt müssen Sie sich noch um die Anwendung selbst kümmern. Leider ist auch hier einiges an Handarbeit angesagt. Es sind verschiedene Bereiche zu berücksichtigen.

Meine Empfehlung ist es mit den Shared Components zu beginnen. Da diese von verschiedenen anderen Teilen Ihrer Anwendung verwendet werden. Anschließend sind die Seiten und deren Bestandteile an der Reihe.

Shared Components

Um die Bestandteile der Shared Components von einer Anwendungsversion in eine Andere zu übernehmen, gibt es verschiedene Methoden.

1. Es gibt Komponenten bzw. Einstellungen, die Sie schlicht manuell überführen müssen.

2. Einige der Komponenten können Sie über Create > As a Copy of an … > Copy from Application aus einer anderen Anwendung des Workspaces übernehmen. Wo immer es geht, sollten Sie diese Möglichkeit nutzen. Eine Übersicht der Shared Components, bei denen ich diese Möglichkeit gefunden habe, finden Sie in Abbildung 11.

Abbildung 11: Shared Components mit Kopierfunktion

3. Als Alternative bietet sich für die meisten Shared Components noch der Export und anschließende Import an. Wobei auch dieser Ansatz durch notwendige Anpassungen (Workdpace-Id, App-Id und evtl. ein Offset) an dem Exportfile nicht optimal ist. Beachten sie bitte, dass beim Import Komponenten wie z.B. Seiten durch Seiten mit der gleichen Id überschrieben werden. Mehr dazu finden Sie unter anderem hier.

Pages und Co.

Als letzter Schritt sind jetzt noch die eigentlichen Seiten und deren Inhalte abzugleichen.

Neue Seiten können Sie über den Application Builder aus dem parallelen Release in Ihre Basisanwendung übernehmen. Dazu klicken Sie im Page Designer auf das + in der Toolbar. In dem sich öffnenden Drop-Down-Menü wählen Sie Page as Copy.

Abbildung 12: Seite kopieren

Jetzt folgen ‘Sie nur noch dem Wizzard und geben dabei an, dass Sie eine Seite aus einer anderen Applikation kopieren möchten. (Page in another Application)

Möchten Sie eine bereits vorhandenen Seite komplett ersetzen, so können Sie die neue Seite mit einer anderen PageId erzeugen lassen oder Sie löschen im Vorfeld die ursprüngliche Seite und kopieren die Seite dann mit der herkömmlichen Seitennummer.

Abbildung 13: Seiten können nicht direkt ersetzt werden

Geht es Ihnen darum, nur einzelne Bestandteile einer Seite aus dem Fork zu übernehmen, müssen Sie im ersten Schritt die Quellseite aus dem Fork in die Basisversion als Kopie einfügen. Anschließend öffnen Sie diese Seite und klicken mit der rechten Maustaste auf die Bestandteile der Seite die Sie kopieren möchten. In dem sich öffnenden Kontextmenü wählen Sie den Eintrag Copy to other Page und beantworten anschließend die Fragen des Wizzards.

Abbildung 14: Bestandteile in eine andere Seite kopieren

Wie bereits in dem Abschnitt über das Kopieren der Shared Components erwähnt, bietet APEX die – meiner Meinung nach nicht zu Ende gedachten Funktion – des Komponenten-Exports und -Imports. Über diese Funktion ist es Ihnen möglich selektiv Bestandteile einer Anwendung zu exportieren. Vor dem Import der Komponenten müssen Sie aber auch hier vorab das SQL-Skript manuell anpassen.(s.o.)

Fazit

Es ist schon ein mühsames Geschäft, verschiedene Versionen einer Anwendung zu Verwalten und zu beherrschen. Ich versuche immer parallele Entwicklungsstränge nach Möglichkeit zu vermeiden. Der Aufwand diese Stränge wieder in einem Basisentwicklungsstrangs zusammenzuführen ist mitunter sehr aufwändig.

Allerdings treffen Sie auch auf ähnlich Probleme, wenn Sie versuchen Komponenten aus bereits vorhanden Anwendungen in einer neuen – thematisch vielleicht anders gelagerten – Anwendung zu übernehmen und wiederzuverwenden. Auf Komponentenbasis stehen Ihnen dafür Plug/Ins zur Verfügung. Für zusammenhängende Teile (Module) eine Anwendung, die aus mehreren Seiten, Shared Components und Datenbankobjekten bestehen, bietet APEX kein wirklich praxistaugliches Konzept.

Sie können Funktionalitäten höchsten in kleine, in sich abgeschlossenen Anwendungen aufteilen. Dies funktioniert in der Praxis aber meist nur, wenn Sie auf Single Sign On setzen.

Beitragsreihe

 

Konfigurationsmanagement für Oracle APEX -Teil 1 Versionsverwaltung

Versionsverwaltung und Konfigurationsmanagement ist für den Entwicklungszyklus gerade auch im Rahmen agiler bzw. iterativer Entwicklung von Oracle Application Express (APEX) Anwendungen ein wichtiges aber sicherlich oft vernachlässigtes Thema. Im ersten Teil geht es um die Versionierung und das Betreiben unterschiedlicher paralleler Versionen in einer Entwicklungsumgebung.

Was versteht man unter Konfigurationsmanagement?

Laut Wikipedia versteht man unter Konfigurationsmanagement 

Konfigurationsmanagement (KM; englisch configuration managementCM) ist eine Managementdisziplin, die organisatorische und verhaltensmäßige Regeln auf den Lebenslauf eines Produkts und seiner Konfigurationseinheiten [..] anwendet.

[..]

Es sind vier Teilgebiete (Teilprozesse) des KM zu unterscheiden:

  • Konfigurationsidentifizierung (KI),
  • Konfigurationsbuchführung (KB),
  • Konfigurationsüberwachung (KÜ) und
  • Konfigurationsaudit (KA).

Ihre koordinierte Umsetzung ist für ein erfolgreiches Konfigurationsmanagement unumgänglich.

Quelle: https://de.m.wikipedia.org/wiki/Konfigurationsmanagement, 24.06.2018

Im Rahmen der Entwicklung von Software spricht man von Software-Configuration-Management(SCM).

Wie bei vielen Managementsystemen kommen solche Definitionen meist sehr sperrig daher. Im Rahmen der Anwendungsentwicklung mit APEX soll hier eine pragmatische Umsetzung des Ganzen gezeigt werden.

Agile Softwareentwicklung mit APEX

Beginnt man ein neues APEX-Projekt, so wird man je nach Projektmanagementmethode und Größe des Projektes unterschiedlich an die Sache heran gehen.

Aus meiner Sicht bietet sich aber gerade ein agiles Vorgehen für die Entwicklung von APEX-Anwendungen an. Welches konkrete Vorgehensmodell Sie dabei wählen ist zweitrangig.

Bei einem agilen Ansatz starten Sie mit einem ersten Teil Ihres Datenmodells und entwickeln dann sehr zügig die jeweiligen Seiten in Ihrer Anwendung. So erhalten Sie sofort vorzeigbare Anwendungsteile, die Sie mit Ihren Kunden, Productowner, … durchsprechen und abstimmen können.

Aber auch wenn Sie grossschrittiger vorgehen müssen und Ihren Kunden fertig entwickelte Releases ausliefern, gehen Sie als Entwickler wahrscheinlich itterativ an die Sache heran.

Sie starten also mit einem leeren Schema und einem Workspace, erstellen die ersten Tabellen. Dann kann schon die erste Version der Anwendung per Application Wizzard erzeugt werden. Durch die Nutzung der Metadaten, welche die Datenbank APEX zur Verfügung stellt, fügen Sie die ersten Seiten der Anwendung hinzu. Jetzt erweitern Sie das Datenmodell und ergänzen die zugehörigen Seiten in der Anwendung. Die Businesslogik lagern Sie in PL/SQL-Packages aus. Je nach Komplexität und Umfang des Projektes abstrahieren Sie zwischen Datenmodell und Anwendung noch über Views. Auf diese Weise entstehen sukzessive weitere Datenbankobjekte und Anwendungsteile.

Alle diese Teile sind Bestandteil einer sogenannten Konfigurationseinheit.

Sie erzeugen also eine Kette von Builds, die dann weiter zu einem Release der Anwendung führen.

Anschließend oder auch schon parallel werden Sie die Anwendung in einem Testsystem mehr oder weniger ausgiebig testen (lassen) und dann an Ihren Kunden ausliefern.

Je nach Anwendung entwickeln Sie das System weiter. In Ihrem Entwicklungssystem steht dann mit großer Wahrscheinlichkeit nicht mehr die Version, mit der Sie Ihre Kunden beliefert haben, zur Verfügung. Dies führt bei Supportanfragen Ihres Kunden dazu, dass Sie in einem Supportsystem, das ausgelieferte System mit entsprechendem Releasestand wiederherstellen müssen. Fixen Sie den Fehler in dem (veralteten Release), so muss die so bereinigte Version bei Ihren Kunden eingespielt werden. Zusätzlich müssen Sie nun das Problem auch noch in Ihrem aktuellen Entwicklungsstand der Anwendung beheben.

Noch komplizierter wird dieses Szenario, wenn Sie verschiedene Releasestände an mehrere Kunden ausgeliefert haben, dabei aber evtl. auch noch individuelle Anforderungen einzelner Kunden berücksichtigten mussten.

Aus diesem Lebenszyklus einer Software ergeben sich verschiedene Probleme:

  • Wie Verwalten Sie unterschiedliche Versionen (Releasestände und Builds) Ihrer APEX-Anwendungen ?
  • Wie erstellen Sie Test-, Integrations- und Supportsysteme, in denen Sie verschiedene Versionen Ihrer Anwendung verwalten können ?
  • Wie führen Sie parallele Entwicklungslinieren (Forkes) wieder in Ihrer Basisanwendung zusammen ?
  • Wie dokumentieren und identifizieren Sie die Änderungen an Ihren Anwendungsversionen inkl. aller Bestandteile (Tabellen, Views, Triggers, PL/SQL-Packages,…) ?

Konfigurationseinheiten: Komponenten einer APEX Anwendung

Aus welchen Bestandteilen besteht denn nun eine APEX-Anwendung?

Wenn Sie versuchen, diese Frage zu beantworten, schauen Sie sich doch einfach an, was Sie alles benötigen, um eine APEX-Anwendung in einem Produktivstem zum Laufen zu bringen.

Vorausgesetzt, dass eine laufende Oracle-Datenbank mit eingerichtetem APEX (in der korrekten Version) zur Verfügung steht, benötigen Sie zuerst ein Export-File der APEX-Anwendung. Dabei handelt es sich um ein SQL-Skript, mit dem Sie eine Anwendung in APEX exportieren und importieren können.

Die Anwendung basiert natürlich auf Tabellen und verwendet verschiedene anderen Datenbankobjekte. APEX bietet die Möglichkeit, diese Datenbankobjekte über entsprechende DDL-Skripte bei der Installation bzw. dem Import einer Anwendung anlegen zu lassen.

Um diese Tabellen initial mit Stammdaten zu füllen, erstellen Sie entsprechende DML-Skripte.

All diese Skripte können Sie in den sogenannten Supporting Objects hinterlegen, die Sie im Application Builder über die gleichnamigen Schaltfläche aufrufen können.

Abbildung 1: Supporting Objects

Auch für das Upgraden einer produktiven Anwendung, ist es möglich in den Supporting Objects Skripte zu hinterlegen, welche die Änderung zum Vorgänger-Release abdecken.

Natürlich kann man das benötigte Datenmodell über einen Dump oder separate SQL-Skripte in einem Produktivstem einrichten. Da die Supporting Objects aber Bestandteil einer APEX-Anwendung sind und diese mit in dem Anwendungs-Exportfile vorhanden sind, ist es am geschicktesten, diese Möglichkeit zu verwenden. Gerade auch im Hinblick auf die Versionsverwaltung bringt das einige Vorteile mit sich.

Versionierung

Damit Sie den Überblick über die Versionsstände Ihrer Anwendung behalten, ist es ganz hilfreich für etwas Ordnung zu sorgen. APEX bietet Ihnen die Möglichkeit, Ihren Anwendungen beschreibende Eigenschaften mitzugeben. Diese Eigenschaften finden Sie etwas versteckt hinter dem Button Edit Application Properties im Application Builder.

Abbildung 2: Anwendungseigenschaften

Wie Sie hier sehen können, finden Sie ein Textfeld namens Release. Hier können Sie für jede Version Ihrer Anwendung den zugehörigen Releasestand festhalten. Das klingt erst einmal banal, bringt aber den praktischen Vorteil mit sich, dass Sie bei einer archivierten oder  ausgeliederten Anwendung wissen, welche Version Ihrer Anwendung Sie gerade vor sich haben.

Aber wie können Sie eine Versionsnummer konzipieren, die Ihnen einen Überblick verschafft?

Es gibt da sicher verschiedene Möglichkeiten. Ich möchte Ihnen hier die von mir bevorzugte Variante vorstellen.

<Hauptentwicklungslinie>.<Entwicklungszweig>.<Build>

Zu Begin einer Anwendungsentwicklung, also vor dem ersten Release geht es also mit 0.0.1 los.

Nach einer Iteration oder dem erreichen eines Meilensteins erhöhen Sie die Build Nr. auf 0.0.2.

Haben Sie eine releasefähige Version Ihrer Anwendung erreicht, so erhöhen Sie die erste Stelle um 1.

Version 1.0.0

Diese Version nehmen Sie produktiv und entwickeln an der Anwendung weiter.

Es entsteht also Build 1.0.1… 1.0.2 …

Müssen Sie einen Fehler in Version 1.0.0 beheben, erstellen Sie einen Forke Ihrer Anwendung und geben diesem die Version 1.1.0. Änderungen an dieser Version laufen jetzt paralell zu Ihrer Hauptentwicklungslinie (Baseline), die bereits bei Version 1.0.2 angelangt ist.

Für einen anderen Kunden erweitern Sie die Version 1.0.0 um eine individuelle Funktion. Diese ist dann wieder ein Forke der Version 1.0.0 und wird mit 1.2.0 benannt.

Um nun den Aufwand dauerhaft in den Griff zu bekommen und den Überblick nicht zu verlieren, ist es ratsam, die Bugfixes aus den Strang 1.1.x und evtl. die kundenspezifischen Funktionen in den Basisentwicklungsstrang zu integrieren (merge). Was in APEX nicht immer so einfach ist. Aber dazu im zweiten Teil der Beitragsreihe später mehr.

Die neuen Funktionen und Bugfixes fulminieren dann irgendwann in einem neuen Release 2.0.0.

Ihre Entwicklungslinien sehen jetzt so aus.

Abbildung 3: Entwicklungsstränge

Im Application Builder werden Ihnen Ihre Anwendungen über ein Interaktiven Report präsentiert. Blenden Sie dort über Actions >> Columns die Version und evtl. andere für Sie relevante Spalten ein. Anschließend speichern Sie sich über Actions >> Report >> Save Report Ihre individuelle Berichtsansichten.

Abbildung 4: Version anzeigen

Hilfreich finde ich auch die Zuordnung von Anwendungen zu Gruppen. Z.B. können Sie so zwischen Test, Produktiv, Support und Entwicklung unterscheiden.

Anwendungsgruppen (Application Groups) legen Sie über das Menü App Builder >> Workspace Utilities-Database >> Application Groups fest. Über die Anwendungseigenschaften (Button Edit Application Properties) ordnen Sie Ihre Anwendung einer Gruppe zu. Diese Gruppen lassen sich genau wie die Version im Interaktiven Report einblenden.

Abbildung 5: Anwendungen gruppieren

Die Abbildung 5 zeigt ihnen eine aufbereitete Übersicht der Anwendungen in APEX, die bei dem oben skizzierten Projektablauf entstanden sind.

Archivierung von Releaseständen

APEX bietet verschiedene Möglichkeiten Anwendungen zu archivieren. Die Basis für diese Ansätze ist ein Exportfile. Über den Application Builder können Sie alle Eigenschaften eines APEX-Programms in Form eines SQL-Skriptes exportieren.

Abbildung 6: Anwendung exportieren

Diese Datei beinhaltet die komplette Definition aller Seiten, Regionen, Items, Prozesse,… aber auch aller Shared Components wie Dateien oder Listen und – wie bereits erwähnt – die Supporting Objects. Nutzen Sie all diese Möglichkeiten, so können Sie die komplette Anwendung inkl. der Datenbankobjekte in einer einzigen Datei zusammenfassen und später diesen (Release)Stand wiederherstellen.

Somit ergibt sich als einfache Möglichkeit verschiedene Versionen einer APEX-Anwendung zu archivieren, der regelmäßige manuelle Export der Anwendung und Speicherung in einer nach Versionen benannten Ordnern. Diese Idee kann man nun mit einer Software zur Versionsverwaltung wie z.B. SVN oder GIT kombinieren. Im Internet finden Sie verschiedene Beispiele, wie Sie mit verschiedenen Tolles diesen Weg automatisieren können.  In dem Artikel ORACLE APEX DEPLOYMENT:YOU’RE DOING IT WRONG stellt Martin D’Souza die Möglichkeit vor, via. SQLcl zu automatisieren.Mit APEX selbst wird der APEX Java Exporter ausgeliefert, über den Ihnen viele Möglichkeiten zum Exportieren von Anwendungen und Komponenten zur Verfügung stehen.

Wählen Sie beim manuellen Exportieren einer Anwendung das File Format “Database”, so archiviert APEX die Datei im sogenannten Export Repository. Dieses finden Sie in den Workspace Utilities-Database >> Export >> Export Repository (in der rechten Sidebar). Allerdings bietet die Tabelle nicht wirklich viele Informationen zu den archivierten Anwendungen.

Abbildung 7: Export Repository

Einen anderen Ansatz finden Sie in diesem Blog-Beitrag. Dabei werden die einzelnen Bestandteile (Seiten) einer Anwendung separat extrahiert und übersichtlich in einem Verzeichnisbaum bzw. der Datenbank gespeichert. Dieser Ansatz lässt auch automatisieren.

Eine weitere ebenfalls automatisierbare Variante bietet Oracle mit einem seiner Packaged Applications “APEX Application Archive”. Mit dieser Applikation lassen sich Backups Ihrer Anwendungen erstellen, die dann in der Datenbank verwaltet werden. Erweitern Sie das Ganze noch mit Hilfe des Datenbankschedulers ( dbms_schedule ), können Sie die Archivierung komplett automatisieren. Wie Sie das im Einzelnen funktioniert, können Sie sich in dieser Beitragsreihe genau ansehen.

Abbildung 8: Anwendungsarchiv auswählen

Ich persönlich favorisiere diese Möglichkeit, da Sie sich sehr schnell einrichten und anpassen lässt und mit der Package Application “APEX Application Archive” ein Programm zur Verwaltung der einzelnen Releasestände zur Verfügung steht.

Parallele Versionen in APEX betreiben

Aber wie können Sie diese unterschiedlichen Versionen Ihrer Anwendungen in APEX parallel bearbeiten und betreiben?

Eine einfache Möglichkeit ist es eine Kopie Ihrer Anwendung in dem Workspace anzulegen.

Allerdings gehören zu Ihrer Anwendung auch ein Datenmodell und die entsprechenden Datenbankobjekte. Diese werden zwischen den einzelnen Releaseständen Ihrer Anwendungen voneinander abweichen.

APEX bietet für dieses Problem eine einfache aber sehr elegante Lösung. Sie können Ihrem Workspace weitere Datenbank-Schemas zuweisen.

Dazu gehen Sie  so vor.

1. Melden Sie sich am Administration Service als Admin an.

2. Im Menü finden Sie unter Manage Workspace den Eintrag Manage Schema Assignment.

Abbildung 9: Manage Schema Assignment

3. Über Add Schema können Sie nun über einen Wizzard weitere Schemas anlegen.

Hinweis: APEX bietet hier zwei Möglichkeiten. Sie können ein vorhandenes Schema hinzufügen oder ein Neues anlegen. Diese Zweite Version lief in der von mir verwendeten Version auf einen Fehler. Um das Problem zu umgehen, legen Sie also einen User von Hand (z.B. über sqlplus) an und ordnen Sie diesen hier zu.

4. Melden Sie sich wieder als Entwickler an Ihrem Workspace an.

5. Exportieren Sie die Anwendung, die Sie in einem neuen Schema als neues Build/Release anlegen möchten.

6. Importieren Sie die Anwendung und wählen Sie im Import-Wizzard das neue Schema aus.

Abbildung 10: Schema zuordnen

7. Klicken Sie auf Next >.

8. In diesem Schritt wählen Sie die Option “Install Supporting Objects” = YES.

Abbildung 11: Install Supported Objects

9. Setzen Sie die Installation fort und folgen Sie dem Wizzard. Dabei werden nun die DDL-Skripte, welche Sie in den Supporting Objects hinterlegt haben, ausgeführt und somit die benötigten Datenbankobjekte in dem neuen Schema erzeugt.

Beitragsreihe