Dies ist Tabula, das Studentenverwaltungssystem der University of Warwick, das eine Reihe von Modulen umfasst. Es verfügt über ein internes JIRA-Projekt.
Derzeit sind in Tabula folgende Module enthalten:
Wir stellen ein Docker-Setup bereit, das mit docker-compose
verwendet werden kann, um Tabula lokal zu erstellen und bereitzustellen.
Sie sollten in der Lage sein, über mvn.elab.warwick.ac.uk auf die Quelle und die Binärdateien zuzugreifen, wenn Sie Abhängigkeiten auflösen. Wenn Sie eine IDE verwenden (wir empfehlen IntelliJ IDEA), sollte dies bedeuten, dass Sie die Code-Vervollständigung und die ursprüngliche Quelle von Abhängigkeiten erhalten, die nicht vollständig als Open Source bereitgestellt wurden.
Der Gradle-Wrapper sollte jetzt in der Lage sein, Wars zu erstellen. Wenn Sie ./gradlew war
aus dem Stammverzeichnis ausführen, sollte er api/build/libs/api.war
und web/build/libs/ROOT.war
erstellen.
macOS-Hinweis : Der Standard- head
unter macOS ist möglicherweise nicht mit docker/init.sh
kompatibel. Möglicherweise möchten Sie ghead
von Homebrew herunterladen und Instanzen im Skript ersetzen, bevor Sie es ausführen.
Führen Sie zunächst docker/init.sh
aus (dh führen Sie es im Stammverzeichnis des Projekts aus, anstatt in das Docker-Verzeichnis zu cd
). Dabei werden Ihnen drei Fragen gestellt:
urn:localdev.warwick.ac.uk:tabula:service
– Sie erhalten diese, wenn Sie sich beim ITS Web Team für eine SSO-Anbieter-ID registrieren). Dadurch werden die erforderlichen Eigenschaftendateien generiert, um Tabula in docker/data
auszuführen. Sie sollten docker/init.sh
nicht erneut ausführen müssen, es sei denn, die erforderlichen Eigenschaften wurden geändert. Wenn Sie nur Eigenschaftendateien ändern, können Sie diese Dateien einfach direkt ändern, ohne sie neu zu generieren.
Sie können die Docker-Container jetzt mit sudo docker-compose up --build
starten (auch hier benötigen Sie --build
nur, wenn Konfigurationsänderungen vorgenommen wurden). Dadurch wird alles zum Laufen gebracht und Sie sollten eine 404 für https://localdev.warwick.ac.uk/ erhalten (und eine 401-Basisauthentifizierungsaufforderung für http://localdev.warwick.ac.uk:8080/manager).
Jetzt können Sie die Anwendung mit ./gradlew cargoDeployRemote
bereitstellen, das eine Verbindung zur Manager-Anwendung auf Tomcat herstellt und die Anwendung dort bereitstellt. Wenn Sie Änderungen vornehmen und die Bereitstellung erneut durchführen möchten, ohne ganz von vorne zu beginnen, können Sie ./gradlew cargoRedeployRemote
ausführen. Wenn Sie JRebel verwenden und es korrekt mit dem Remote-Server eingerichtet haben, sollten Sie in der Lage sein, Änderungen ohne erneute Bereitstellung live vorzunehmen.
Sobald Sie die Anwendung ausgeführt haben, werden einige Fehler ausgegeben, die zu erwarten sind, wenn weder in der Datenbank noch in Elasticsearch Daten vorhanden sind. Sie müssen zu https://localdev.warwick.ac.uk/sysadmin gehen (beachten Sie, dass dies erfordert, dass Ihr angemeldeter Benutzer Mitglied der WebGroup in-tabula-local-dev-sysadmins
ist, die Sie bearbeiten können die generierten docker/data/tomcat/lib/tabula.properties
um eine andere Gruppe zu verwenden).
WebGroups können im WebGroups-System von Mitarbeitern erstellt werden, oder Sie können eine vorhandene Gruppe wie all-staff
verwenden, um beispielsweise alle Mitarbeiter der Universität zuzulassen.
Klicken Sie in die drei Felder „Audit-Ereignisindex neu erstellen von“, „Profilindex neu erstellen von“ und „Benachrichtigungs-Stream-Index neu erstellen von“, damit sie mit einem Datum gefüllt werden, und klicken Sie auf „Index“. Dies sollte sofort abgeschlossen sein, da keine Daten indiziert werden, aber die Indexstruktur in Elasticsearch erstellt wird.
Als nächstes starten Sie den Import oben rechts:
Da tabula.properties
angibt, dass es sich um eine Sandbox-Instanz handelt, wird dies schnell und mit völlig gefälschten Daten abgeschlossen.
Sie können dann zu „Abteilungen im System auflisten“ gehen, auf eine Abteilung klicken und „Abteilungsadministratoren anzeigen“ klicken, um Berechtigungen zu erteilen. Wenn Sie den Gott-Modus aktivieren, kann Ihr Benutzer Berechtigungsprüfungen umgehen und normale Berechtigungen hinzufügen.
Installieren Sie das neueste Tomcat 8.5 von hier: http://tomcat.apache.org/download-80.cgi – unter Unix ist es sinnvoll, Tomcat einfach nach /opt
zu extrahieren und es dann mit /usr/local/tomcat-8
zu verknüpfen oder wo immer es Ihnen passt. Anschließend können Sie Tomcat aktualisieren, ohne die Konfiguration zu beschädigen, indem Sie einfach diesen Symlink ändern.
Erstellen Sie ein neues Basisverzeichnis für die Konfiguration und Bereitstellung von Tabula, z. B. /var/tomcat/instances/tabula
. Der Aufbau und Inhalt dieses Verzeichnisses sollte wie folgt aussehen:
tabula/
├── bin/
│ └── setenv.sh
├── conf/
│ ├── context.xml
│ ├── fim-ds.xml
│ ├── server.xml
│ ├── sits-ds.xml
│ ├── tabula-ds.xml
│ └── web.xml
├── lib/
│ ├── jtds-1.3.1.jar
│ ├── logback.xml
│ ├── ojdbc8.jar
│ ├── postgresql-42.2.5.jar
│ ├── tabula.properties
│ ├── tabula-sso-config.xml
│ └── warwick-logging-1.1-all.jar
├── logs/
├── temp/
├── webapps/
└── work/
Wenn Sie mit Layouts im Jboss-Stil vertraut sind, kann es nützlich sein /usr/local/tomcat-8/instances
mit /var/tomcat/instances
zu verknüpfen.
Der Inhalt dieser Dateien ist wie folgt:
bin/setenv.sh
Dies ist ein Skript, das ausgeführt wird, um Umgebungsvariablen für die laufende Instanz festzulegen. Sie möchten es wahrscheinlich zum Einrichten von Speicherverwaltung, JRebel, Debugging usw. verwenden.
Eine Beispieldatei finden Sie in config/servers/augustus/bin
conf/context.xml
Darin sind Ressourcen enthalten, die in den Server eingebunden werden sollen – in diesem Fall nur JNDI DataSources. Sie können Entitäts-XML-Includes verwenden, um diese in separaten Dateien zu speichern.
Es gibt eine Beispiel context.xml
und einige Beispieldatenquellen in config/servers/augustus/conf
conf/server.xml
Anweisungen zum Betrieb des Servers, einschließlich der zu bindenden Ports. Das ist so ziemlich Standard.
Es gibt ein Beispiel für server.xml
in config/servers/augustus/conf
conf/web.xml
Dies wird einfach aus dem Verzeichnis conf
in der Tomcat 8-Installation kopiert. Ich konnte Tomcat nicht zum Laufen bringen, ohne dass es kopiert wurde, was ein bisschen ärgerlich ist.
lib/warwick-logging-1.1.jar
Sie können dies unter https://pkg.elab.warwick.ac.uk/ch.qos.logback/warwick-logging-1.1-all.jar erhalten
Beachten Sie, dass diese Abhängigkeit frühere Abhängigkeiten von logback, logstash-logback-encoder, jackson und slf4j-api ersetzt
lib/jtds-1.3.1.jar
Sie können dies unter https://pkg.elab.warwick.ac.uk/net.sourceforge.jtds/jtds-1.3.1.jar erhalten
lib/ojdbc8.jar
Sie können dies unter https://pkg.elab.warwick.ac.uk/oracle.com/ojdbc8.jar erhalten
lib/postgresql-42.2.5.jar
Sie können dies unter http://central.maven.org/maven2/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar erhalten
lib/logback.xml
Logback-Konfiguration. Eine Alternative wäre, dies mit den WARs zu packen, aber das würde es uns nicht ermöglichen, die Konfiguration pro Server zu ändern.
lib/tabula.properties
An die App übergebene Eigenschaften. Sie können eines davon aus tabula-test beziehen und es dann personalisieren.
Verwenden Sie nicht einfach die Schlüssel von tabula-test oder einer anderen Instanz, sondern generieren Sie neue für Ihre lokale Instanz, indem Sie ./gradlew generateEncryptionKey
ausführen und diese für objectstore.encryptionKey
, turnitin.tca.signingSecret
und tabula.database.encryptionKey
verwenden.
lib/tabula-sso-config.xml
Der übliche SSO-Konfigurations-Quatsch. Damit SSO funktioniert, müssen Sie diese Konfiguration zu Web Sign-on hinzufügen. Stellen Sie sicher, dass es einen Abschnitt <trustedapps />
enthält, sonst werden NPEs aus einer der Bouncycastle-Kryptobibliotheken angezeigt. Stellen Sie außerdem sicher, dass die Cluster-Datenquelle mit dem Beispiel übereinstimmt. Ältere Konfigurationen stimmen möglicherweise nicht überein, was zu Ausnahmen führt, dass die Datenquelle nicht gefunden wurde .
Leider besteht die einzige Möglichkeit, dies auf Tomcat zum Laufen zu bringen, darin, ActiveMQ lokal zu installieren.
Installieren Sie ActiveMQ aus dem Paket-Repo und fügen Sie eine neue Konfiguration mit dem Brokernamen Tabula hinzu.
Das ActiveMQ-Paket im utopischen Repo ist völlig defekt, daher verwenden wir ein externes Repo, um die neueste Version zu erhalten.
sudo apt-add-repository 'deb http://dl.bintray.com/jmkgreen/deb /'
sudo apt-get update
sudo apt-get install activemq
Ignorieren Sie die Warnung vor nicht authentifizierten Paketen. Sobald es fertig ist, bearbeiten Sie /etc/activemq/activemq.xml
und suchen Sie nach der Stelle, an der brokerName="localhost"
steht – ändern Sie dies in brokerName="tabula"
. Starten Sie ActiveMQ mit sudo service activemq restart
.
Legen Sie Folgendes in Ihren tabula.properties
fest:
activemq.broker=tcp://localhost:61616
Um dies lokal auszuführen, haben Sie mehrere Möglichkeiten:
Für Ubuntu:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
sudo apt-get update && sudo apt-get install elasticsearch -y
Sie müssen /etc/elasticsearch/elasticsearch.yml
bearbeiten, um cluster.name: tabula
festzulegen (oder elasticsearch.cluster.name=elasticsearch
in tabula.properties
festlegen).
Wenn ich es lokal ausführte, startete es standardmäßig nicht beim Booten, aber ich konnte es mit sudo systemctl start elasticsearch
starten. Führen Sie sudo systemctl enable elasticsearch
aus, damit es beim Booten ausgeführt wird.
Legen Sie die folgenden Eigenschaften in Ihren tabula.properties
fest:
elasticsearch.cluster.nodes=amoru.lnx.warwick.ac.uk:9200,amogu.lnx.warwick.ac.uk:9200,amomu.lnx.warwick.ac.uk:9200
elasticsearch.cluster.name=tabula-dev
elasticsearch.index.prefix=your-name-goes-here
Bitte stellen Sie sicher, dass Sie Ihr elasticsearch.index.prefix
ändern, da Sie sonst möglicherweise den Index einer anderen Person überschreiben. Wenn Sie auf Firewall-Probleme stoßen, rufen Sie #devops an
Hinweis: Zumindest unter Ubuntu müssen Sie möglicherweise einen Neustart durchführen, um Ihre Umgebung nach dem JDK-Wechsel zu bereinigen. Das ist scheiße, wenn jemand es verbessern kann, wäre das großartig.
Fügen Sie die webupd8team-PPA hinzu, falls Sie dies noch nicht getan haben:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
Legen Sie Java 8 als Standard-JDK fest: sudo apt-get install oracle-java8-set-default
Sie müssen beim Starten von Tomcat zwei Umgebungsvariablen festlegen, CATALINA_HOME
und CATALINA_BASE
. CATALINA_HOME
ist das Verzeichnis, in dem Tomcat installiert ist, und CATALINA_BASE
ist das Verzeichnis, in dem sich Ihre oben genannten Konfigurationsdateien befinden.
Sie können dann $CATALINA_HOME/bin/catalina.sh
verwenden, um den Server im Vordergrund zu starten, oder startup.sh
um ihn im Hintergrund zu starten.
Ein Beispiel für ein Startskript für Tabula könnte sein:
#!/bin/bash
# Clear out work and temp because I'm a massive pessimist
cd /var/tomcat/instances/tabula
rm -rf work/* temp/*
export CATALINA_HOME=/usr/local/tomcat-8
export CATALINA_BASE=/var/tomcat/instances/tabula
echo "Starting Tomcat server"
${CATALINA_HOME}/bin/catalina.sh run $@
Richten Sie einen Apache-Vhost ein, der auf die Include-Dateien in config/servers/common/vhosts
verweist – verwenden Sie rewrites.inc
für die vollständige Tabula-Entwicklung.
Sie benötigen einen HTTPS-Vhost für SSO. Wenn Sie also nur einen Vhost einrichten, sollte es der HTTPS-Vhost sein. Die Include-Dateien verweisen auf eine Karte, um den zu verwendenden Port zu erhalten. Daher müssen Sie Ihren Port möglicherweise mit drei Zeilen definieren, z
RewriteMap api txt:/etc/apache2/tabulaport.txt
RewriteMap proxy txt:/etc/apache2/tabulaport.txt
RewriteMap scheduler txt:/etc/apache2/tabulaport.txt
Die obige Zeile sollte auf eine Datei verweisen, die diese Zeile enthält (vorausgesetzt, der Standard-Tomcat-Port 8080):
port 8080
Kopieren Sie gradle-local-example.properties
als gradle-local.properties
und bearbeiten Sie die Eigenschaften dort so, dass sie zu Ihrem System passen. gradle-local.properties
wird von Git ignoriert.
Wenn Sie von einer älteren Version von Tabula aktualisieren, denken Sie daran, aktuelle Datenbankmigrationen aus config/scripts/schema
anzuwenden. Wenn Sie von Lucene eine IllegalStateException
erhalten, bedeutet dies, dass einer Ihrer Indizes veraltet ist. Suchen Sie den Speicherort (suchen Sie in tabula.properties
nach base.data.dir
und schauen Sie im darin enthaltenen index
nach). Löschen Sie den relevanten Index (z. B. rm -fr BASE_DATA_DIR/index/notifications
) und erstellen Sie ihn in /sysadmin innerhalb der App neu.
Führen Sie ./gradlew deployToTomcat
aus, um die App zu erstellen und eine explodierte WAR-Datei an den Speicherort zu kopieren, den Sie in Ihrer Eigenschaftendatei angegeben haben.
Gradle initialisiert einen Zink-Server für inkrementelle Kompilierungen, aber das dauert nur so lange, wie der Gradle-Daemon läuft – das macht ihn für viele Kompilierungen ziemlich ineffizient (glücklicherweise ist die Kompilierungsgeschwindigkeit ziemlich gut, sogar für Scala).
Die Ergebnisse des Gradle-Unit-Tests werden in einer HTML-Datei gespeichert, was ziemlich gut ist, sodass Sie wahrscheinlich nicht zu viel Zeit damit verbringen möchten, die Konsolenausgabe ausführlicher zu gestalten.
Wenn Sie npm run watch
aus dem web
in einem Tab ausführen, werden ständig Assets erstellt und JRebel synchronisiert diese dann zusammen mit WEB-INF-Inhalten wie Freemarker-Ansichten mit dem War.
Einige andere nützliche Gradle-Befehle:
./gradlew test deployToTomcat
– führt auch Tests während der Bereitstellung aus (standardmäßig werden keine Tests ausgeführt)./gradlew web:deployToTomcat
– stellt ein einzelnes Modul bereit, macht aber Modulabhängigkeiten wie üblich (denken Sie daran, dass Tomcat weiterhin alte Kriege bereitstellt, es sei denn, Sie löschen sie!)./gradlew test
– führt Tests aus, zeigt Stacktrace von Fehlern in der Konsole und korrekte Ausgabe in eine HTML-Datei an./gradlew web:test --tests *.ApplicationTest
– führt einen bestimmten Test aus./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk
– Funktionstests ausführen (Starten Sie zuerst die Tomcat-Instanz)./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk --tests *.CourseworkModuleManagerTest
– führt einen bestimmten Funktionstest aus./gradlew cucumber
– Gurkentests ausführen (gegen tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
– Gurkentests für die Produktion ausführen./gradlew cucumber -Dfeature.name=gzip
– Cucumber-Szenarien für ein einzelnes Feature ausführen./gradlew --continuous
– kompiliert kontinuierlich Quellen, während sie in Ihrer IDE gespeichert werden./gradlew test --continuous
– kontinuierlich Quellen kompilieren und Tests ausführen, während sie in Ihrer IDE gespeichert sind (Tests werden nur ausgeführt, wenn sie erfolgreich sind)./gradlew web:test --tests *.ApplicationTest --continuous
– kontinuierlich einen einzelnen Test kompilieren und ausführen./gradlew generateEncryptionKey
– druckt einen Base64-codierten Verschlüsselungsschlüssel zur Verwendung in tabula.properties
für die Objektspeicherung oder Datenbank Das web
enthält einen Aufruf von npm run build
um im Rahmen der Bereitstellung Assets mit Webpack zu erstellen. Sie können dies manuell ausführen, um neuen statischen Inhalt in build/rootContent
zu erstellen (der von JRebel auf Änderungen überwacht wird).
Wenn Sie sich überhaupt nicht mit Webpack herumschlagen möchten, können Sie ./gradlew webpack
aufrufen, um die Assets neu zu erstellen.
Weitere nützliche npm
-Befehle:
npm run build
– alle Produktionsressourcen erstellen und beendennpm run dev
– Assets für Entwicklung und Exit erstellennpm run watch
– Achten Sie auf Änderungen an Dateien und erstellen Sie Entwicklungsressourcen neu Im Moment haben wir noch viele JS-Bibliotheken in src/main/assets/static/libs/
– diese sollten nach und nach durch eine ordnungsgemäße Abhängigkeitsverwaltung in package.json
ersetzt werden (wir tun dies bereits für ID7). Wenn Sie ID7 aktualisieren müssen, ändern Sie die Versionsnummer in package.json
und führen Sie npm install
aus (der Build führt dies automatisch durch).
config
servers
common
– Dinge, die die meisten Server für die Apache-Konfiguration usw. verwenden.scripts
schema
– SQL-Migrationsskripts für alle Datenbankschemaänderungen.api|common|web
– Tabula-Modulesrc
main
scala
– Scala-Quelldateienjava
– Java-Quelldateienresources
– Nicht-Code-Dateien, die im App-Klassenpfad verfügbar sindassets
– JS/CSS-Dateien usw., die vom Webpack verarbeitet werden müssen, bevor sie dem WAR hinzugefügt werdenwebapp
– andere Nicht-Code-Dateien, aus denen die WAR besteht.artwork
– Quellgrafiken, die nicht in der App enthalten sind, aber zur Generierung statischer Bilder verwendet werden. Normalerweise SVG/Inkscape.test
console
In einem Modul überlagert Gradle Ressourcen von common
, wenn es eine WAR erstellt. In einem Overlay werden vorhandene Dateien nicht überschrieben. Sie können also eine Datei mit demselben Namen definieren, um das im Overlay definierte Verhalten zu überschreiben.
common/.../WEB-INF
-> WEB-INF
– applicationContext.xml
und einige Includes, die überschrieben werden könnenweb/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
– überschreibt den leeren Standardwert von common Hier verfügbar: Entwicklerdokumentation