Automatisches Versionieren von APEX-Anwendungen: Ein Ansatz
Erscheinungsmonat |
APEX-Version |
Datenbankversion |
April 2014 |
alle |
ab 11.2 |
Gerade von Entwicklern, die in Teams arbeiten (und wer tut das nicht?), hört man recht häufig die Frage, welche
Versionierungsmöglichkeiten APEX für Entwicklungsstände von Anwendungen anbietet. Auf
den ersten Blick ist die Antwort enttäuschend, denn APEX bietet keine fertige
Integration mit Versionierungssystemen wie Subversion, CVS, GIT oder
anderen an - auch eine eigene Versionierungsmöglichkeit ist nicht vorhanden.
Dennoch lassen sich mit APEX sehr fortgeschrittene Möglichkeiten finden, Anwendungen
zu versionieren - besonders die Tatsache, dass APEX ein (zentraler) Entwicklungsserver
ist, wird noch sehr hilfreich sein. In diesem Community-Tipp stellen wir einen
Ansatz vor, mit dem
Sie APEX-Anwendungen von verschiedenen Datenbankservern automatisch exportieren und
in eine zentrales "Versionsrepository" speichern können. Alle dazu nötigen Werkzeuge
bringen APEX und die Oracle-Datenbank bereits mit.
Hinweis: In diesem Tipp wird ein Werkzeug verwendet, welches auf der Java-Engine innerhalb
der Oracle-Datenbank basiert. Daher kann der Tipp in einer OracleXE-Datenbank nicht nachvollzogen
werden - es ist mindestens eine Standard Edition erforderlich.
Abbildung 1 zeigt die Vorgehensweise: Es wird ein "zentrales" Datenbankschema mitsamt einer
APEX-Anwendung aufgesetzt.
Von hier aus sollen die zu versionierenden APEX-Anwendungen auch aus anderen Datenbanken
exportiert werden - das kann sogar jobgesteuert geschehen. Das dazu nötige Exportwerkzeug
ist im APEX-Lieferumfang enthalten, legt die Dateien aber ins Dateisystem ab. Also müssen sie
aus diesem ausgelesen und in Datenbanktabellen gespeichert werden. Schließlich wird eine
APEX-Anwendung erstellt, mit der man sich die vorhandenen Versionen ansehen und bei Bedarf
abrufen kann.
Abbildung 1: Arbeitsweise des automatischen Versionierungsansatzes
Verwendete Werkzeuge und Pakete
Wie Sie APEX-Anwendungen von der Kommandozeile aus exportieren, wurde bereits
in einem früheren Community-Tipp beschrieben. Die dazu
nötigen Java-Programme APEXExport und APEXExportSplitter sind im APEX-Paket enthalten. Der
Community-Tipp beschreibt, wie ein Shellskript aufgesetzt werden muss, damit man
sie aufrufen kann: APEXExport exportiert dabei eine APEX-Anwendung und legt die
Datei ins Filesystem ab - mit dem APEXExportSplitter kann diese dann in die einzelnen
APEX-Komponenten zerlegt werden; es entsteht eine Verzeichnisstruktur mit einzelnen
Dateien für die einzelnen Bestandteile der APEX-Anwendung.
Diese könnten dann direkt in Systeme wie Subversion oder CVS eingecheckt werden - die
nötigen Kommandozeilentools stellen die Versionierungssysteme bereit. Für diesen Tipp
wollen wir jedoch APEX nutzen - somit können auch solche Anwender von einer Versionierung
profitieren, die kein fertiges Versionierungssystem besitzen.
Die Dateien, die nach Anwendung des
APEXExportSplitter im Dateisystem liegen, müssen also
in eine Datenbanktabelle geladen werden. Außerdem
sollen die o.g. Kommandozeilenwerkzeuge aus der Datenbank heraus gestartet werden können.
Hier können die
PL/SQL-Pakete zur Interaktion mit dem Betriebs- und Dateisystem
helfen. Mit dem Paket OS_COMMAND kann ein Betriebssystem-Kommando gestartet werden;
mit dem Paket FILE_PKG kann eine Dateisystem-Verzeichnis mit all seinen Inhalten
(rekursiv) in eine Tabelle geladen werden.
Vorbereitungen
Unsere Anwendung soll also mit Hilfe des erwähnten Pakets OS_COMMAND ein Betriebssystem-Kommando
starten - die APEX-Exportdateien werden vor dem Laden in die Datenbanktabelle temporär ins
Dateisystem abgelegt. Suchen Sie sich hierfür auf dem Datenbankserver ein Verzeichnis
aus - bspw. /tmp/apex. Legen Sie darin ein Skript unter dem Namen apexexport.sh
ab. Die folgenden Skripte sind für Unix/Linux-Umgebungen erstellt - wenn Ihre Datenbank
auf Windows läuft, müssen Sie die Skripts entsprechend anpassen. Für Oracle11g-Datenbanken verwenden Sie dieses Skript ...
... und für Oracle12c dieses - natürlich muss die Umgebungsvariable ORACLE_HOME in beiden Fällen an Ihre
Umgebung angepasst werden.
Das Skript geht davon aus, dass das heruntergeladene APEX-Archiv nach
$ORACLE_HOME/apex ausgepackt wurde. Also muss sich die Datei
apexins.sql
im Verzeichnis $ORACLE_HOME/apex befinden. Am besten prüfen Sie, ob das bei Ihnen
der Fall ist - wenn nicht, muss das Skript angepasst werden.
Machen Sie die Datei danach mit einem chmod u+x ausführbar und legen Sie
im gleichen Verzeichnis ein Unterverzeichnis namens files an. Danach sollte Ihr
Verzeichnis /tmp/apex in etwa wie folgt aussehen.
Für die Datenbank- und APEX-Anwendung erzeugen Sie nun am besten ein eigenes
Datenbankschema und einen eigenen APEX-Workspace. Im folgenden sei dieser
VERSION genannt. Dieses Schema braucht neben
den "normalen" Privilegien zum Erzeugen von Tabellen und PL/SQL-Objekten zusätzlich
noch ein EXECUTE-Privileg für das Package DBMS_CRYPTO. Damit eine PL/SQL-Prozedur in diesem Schema das
Shellskript mit OS_COMMAND aufrufen und die generierten Dateien mit FILE_PKG
lesen kann, müssen es vom DBA zusätzliche Java-Privilegien für den Umgang mit
dem Dateisystem erhalten. Das geschieht
mit dem folgenden Skript.
Nun wird deutlich, warum die Verzeichnisstruktur so gewählt wurde ...
- Unterhalb von /tmp/apex/files kann das Schema VERSION nun Dateien anlegen,
ändern oder löschen, aber nichts ausführen.
- Ausgeführt werden darf allein die Datei /tmp/apex/apexexport.sh. Für diese
hat das Schema VERSION aber keine Lese-, Schreib- oder Löschprivilegien. Das Skript kann
also nur ausgeführt werden - Änderungen sind nicht möglich.
Installieren Sie nun die oben erwähnten
PL/SQL-Pakete zur Interaktion mit dem Betriebs- und Dateisystem
im Schema VERSION. Damit sind die Vorbereitungen abgeschlossen.
Einrichten des Datenmodells
Damit die Exports auch automatisiert ablaufen können, müssen die zu exportierenden
APEX-Anwendungen in einer Tabelle gespeichert werden. Eine weitere Tabelle speichert
die für jede Anwendung durchgeführten Exportvorgänge und in eine dritte Tabelle
kommen die konkreten (mit dem APEXExportSplitter zerlegten) Exportdateien - für jede
Komponente einer APEX-Anwendung (Seite, Werteliste, etc) entsteht eine Datei. Erzeugen
Sie die Tabellen mit dem folgenden Skript.
Die Tabelle TAB_SETTINGS enthält, wie man sehen kann, Verbindungsdaten für das
Werkzeug APEXExport. Das Passwort sollte natürlich verschlüsselt gespeichert werden;
daher die Spalte vom Typ RAW.
PL/SQL-Logik: Package PKG_VERSIONING
Das folgende Package PKG_VERSIONING enthält
neben der PL/SQL-Prozedur DO_THE_EXPORT auch die Funktionen zum Ver- und
Entschlüsseln des Passworts - in der Spezifikation enthalten und damit von außen aufrufbar ist jedoch nur ENCRYPT. Natürlich ist
auch der Schlüssel, mit dem die Passwörter verschlüsselt werden, aus dem Code
ersichtlich - der Code sollte also mit dem Oracle-Werkzeug wrap
(Dokumentation) unleserlich
gemacht und das Schema VERSION sollte stark geschützt werden.
Das "Unleserlichmachen" des Codes mit dem wrap-Werkzeug müssen Sie auf dem Datenbankserver
oder auf einem System mit installiertem Oracle-Client machen. Typischerweise behandelt man
nur den Package Body, nicht die Deklaration.
Den gewrappten Code können Sie genauso einspielen wie PL/SQL-Code im Klartext.
Die Prozedur DO_THE_EXPORT tut nun für jede Zeile der Tabelle TAB_SETTINGS folgendes:
- Es wird ein Verzeichnis unterhalb von /tmp/apex/files erzeugt
- Mit diesem Verzeichis als Working Directory , wird das Shellskript apexexport.sh mit
Hilfe des Pakets OS_COMMAND aufgerufen;
es bekommt die Einträge der Tabelle TAB_SETTINGS als Parameter übergeben. Wenn es fertig
ist, enthält das Working Directory einen Verzeichnisbaum mit den einzelnen Artefakten
der APEX-Anwendung.
- Mit dem Paket FILE_PKG wird der gesamte Unterverzeichnisbaum und damit alle Artefakte
in die Tabelle TAB_APP_VERSIONS_ARTEFACTS kopiert.
- Schließlich wird das Working Directory gelöscht.
Erster Test
Fügen Sie nun, zum Testen, ein oder zwei Zeilen in die Tabelle TAB_SETTINGS ein. Passen Sie
die folgenden SQL INSERT-Kommandos an Ihre APEX-Umgebung an.
Wenn Sie die Tabelle danach selektieren, finden Sie darin für die Passwörter verschlüsselte Werte;
Sie brauchen den Code des Pakets PKG_VERSIONING, um diese zu entschlüsseln - und
das haben Sie ja "gewrappt". Testen Sie dann, ob die Prozedur DO_THE_EXPORT
funktioniert.
Nun sollte Ihre Tabelle TAB_APP_VERSIONS_ARTEFACTS Zeilen enthalten ...
Die Spalte CONTENT enthält das konkrete Exportfile für die jeweilige Komponente. Der
Export kann nun manuell gestartet oder mit Hilfe des PL/SQL-Pakets DBMS_SCHEDULER
als regelmäßiger Job in der Datenbank eingerichtet werden (allerdings braucht Ihr
Schema dazu das Privileg CREATE JOB).
Gedanken zum Frontend
Nun fehlt nur noch eine kleine APEX-Anwendung als Frontend - aber dies soll in
diesem Tipp nicht weiter verfolgt werden; schließlich unterscheidet sich das Erstellen
dieser Anwendung durch nichts von jeder anderen. Als "Sprungbrett" können Sie
diese APEX-Anwendung
verwenden (Abbildung 2). Bauen Sie sie einfach nach Belieben aus.
Abbildung 2: APEX-Anwendung als "Frontend" für den Versionierungsansatz
Im Verzeichnisbaum links können Sie (nach Auswahl einer Anwendung und einer konkreten Version)
durch die Artefakte navigieren - klickt man auf eine konkrete Exportdatei rechts, so wird
diese heruntergeladen. Sie kann nun in die Entwicklungsumgebung eingespielt und ein älterer
Stand so wiederhergestellt werden.
Abbildung 3: Abrufen eines Artefakts
Fazit
Der hier vorgestellte Ansatz zeigt, dass auch mit APEX ein professionelles Versionsmanagement
möglich ist. Zwar bietet APEX selbst nur wenig an, mit den vorhandenen Werkzeugen und den
Möglichkeiten der Datenbank ist es jedoch gar nicht so schwer, eigenständig etwas
aufzusetzen. Und dabei zeigt sich besonders der Vorteil eines zentralen Entwicklungsservers:
Denn mit Hilfe von Datenbank-Jobs kann die Versionierung komplett automatisiert werden,
so dass der Entwickler sich um nichts mehr kümmern muss. Nightly Builds sind somit auch
für APEX überhaupt kein Problem.
Zurück zur Community-Seite
|