Il s'agit de Tabula, le système d'administration des étudiants de l'Université de Warwick comprenant un certain nombre de modules. Il a un projet JIRA interne.
Actuellement, les modules présents dans Tabula sont :
Nous fournissons une configuration Docker qui peut être utilisée avec docker-compose
pour créer et déployer Tabula localement.
Vous devriez pouvoir accéder aux sources et aux binaires à partir de mvn.elab.warwick.ac.uk lorsque vous résolvez les dépendances. Si vous utilisez un IDE (nous recommandons IntelliJ IDEA), cela devrait signifier que vous obtiendrez l'achèvement du code et la source originale des dépendances qui n'ont pas été entièrement open source.
Le wrapper gradle devrait maintenant être capable de créer des guerres, si vous exécutez ./gradlew war
à partir du répertoire racine, il devrait construire api/build/libs/api.war
et web/build/libs/ROOT.war
.
Remarque macOS : le head
standard sur macOS peut être incompatible avec docker/init.sh
, vous souhaiterez peut-être obtenir ghead
depuis Homebrew et remplacer les instances dans le script avant de l'exécuter.
Tout d'abord, exécutez docker/init.sh
(c'est-à-dire exécutez-le à partir de la racine du projet, plutôt que cd
placer dans le répertoire docker). Cela vous posera trois questions :
urn:localdev.warwick.ac.uk:tabula:service
- vous l'obtiendrez lorsque vous vous inscrirez pour un identifiant de fournisseur SSO auprès de l'équipe Web ITS). Cela génère les fichiers de propriétés nécessaires pour exécuter Tabula dans docker/data
. Vous ne devriez pas avoir besoin d'exécuter à nouveau docker/init.sh
sauf en cas de modification des propriétés requises ; si vous modifiez simplement les fichiers de propriétés, vous pouvez simplement modifier ces fichiers directement sans les régénérer.
Vous pouvez maintenant démarrer les conteneurs Docker avec sudo docker-compose up --build
(encore une fois, vous n'aurez besoin de --build
que lorsque des modifications de configuration auront été apportées). Cela fera fonctionner tout et vous devriez obtenir un 404 pour https://localdev.warwick.ac.uk/ (et une invite d'authentification de base 401 pour http://localdev.warwick.ac.uk:8080/manager).
Maintenant, vous pouvez déployer l'application avec ./gradlew cargoDeployRemote
qui se connectera à l'application Manager sur Tomcat et y déploiera l'application. Si vous apportez des modifications et souhaitez redéployer sans repartir de zéro, vous pouvez exécuter ./gradlew cargoRedeployRemote
; si vous utilisez JRebel et que vous l'avez configuré correctement avec le serveur distant, vous devriez pouvoir apporter des modifications en direct sans redéploiement.
Une fois l'application exécutée, elle génère des erreurs attendues lorsqu'il n'y a aucune donnée dans la base de données ou dans Elasticsearch. Vous devrez vous rendre sur https://localdev.warwick.ac.uk/sysadmin (notez que cela nécessite que votre utilisateur connecté soit membre du WebGroup in-tabula-local-dev-sysadmins
, vous pouvez modifier le docker/data/tomcat/lib/tabula.properties
généré pour utiliser un groupe différent).
Les WebGroups peuvent être créés dans le système WebGroups par le personnel, ou vous pouvez utiliser un groupe existant tel que all-staff
pour autoriser n'importe quel membre du personnel de l'Université (par exemple).
Cliquez dans les 3 cases « Reconstruire l'index des événements d'audit à partir de », « Reconstruire l'index des profils à partir de » et « Reconstruire l'index du flux de notification à partir de » afin qu'elles soient renseignées avec une date, puis cliquez sur « Index ». Cela devrait se terminer immédiatement car aucune donnée ne sera indexée, mais cela créera la structure d'index dans Elasticsearch.
Ensuite, démarrez les Imports en haut à droite :
Comme tabula.properties
précise qu'il s'agit d'une instance sandbox, cela se terminera rapidement et avec des données complètement fausses.
Vous pouvez ensuite accéder à « Liste des départements dans le système », cliquer sur un département et « Afficher les administrateurs du département » pour accorder des autorisations. L'activation du mode Dieu permettra à votre utilisateur de contourner les vérifications d'autorisations et d'ajouter des autorisations ordinaires.
Installez la dernière version de Tomcat 8.5 à partir d'ici : http://tomcat.apache.org/download-80.cgi - sous Unix, il est logique d'extraire simplement Tomcat dans /opt
, puis de le lier symboliquement à /usr/local/tomcat-8
ou partout où cela vous convient. Vous pouvez ensuite mettre à niveau Tomcat sans rompre aucune configuration en modifiant simplement ce lien symbolique.
Créez un nouveau répertoire de base pour la configuration et le déploiement de Tabula, par exemple /var/tomcat/instances/tabula
. La structure et le contenu de ce répertoire doivent être les suivants :
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/
Vous trouverez peut-être utile de créer un lien symbolique /usr/local/tomcat-8/instances
vers /var/tomcat/instances
si vous êtes à l'aise avec les mises en page de style Jboss.
Le contenu de ces fichiers est le suivant :
bin/setenv.sh
Il s'agit d'un script exécuté pour définir les variables d'environnement pour l'instance en cours d'exécution. Vous souhaiterez probablement l'utiliser pour configurer la gestion de la mémoire, JRebel, le débogage, etc.
Un exemple de fichier peut être trouvé dans config/servers/augustus/bin
conf/context.xml
Celui-ci contient des ressources qui doivent être incluses dans le serveur - dans ce cas, uniquement les sources de données JNDI. Vous pouvez utiliser les inclusions XML d'entité pour les avoir dans des fichiers séparés.
Il existe un exemple de context.xml
et quelques exemples de sources de données dans config/servers/augustus/conf
conf/server.xml
Instructions sur la façon d'exécuter le serveur, y compris les ports auxquels se lier. C'est à peu près standard.
Il existe un exemple server.xml
dans config/servers/augustus/conf
conf/web.xml
Ceci est simplement copié à partir du répertoire conf
dans l'installation de Tomcat 8. Je ne pouvais pas faire fonctionner Tomcat sans qu'il soit copié, ce qui est un peu nul.
lib/warwick-logging-1.1.jar
Vous pouvez l'obtenir sur https://pkg.elab.warwick.ac.uk/ch.qos.logback/warwick-logging-1.1-all.jar
Notez que cette dépendance remplace les dépendances précédentes sur logback, logstash-logback-encoder, jackson et slf4j-api
lib/jtds-1.3.1.jar
Vous pouvez l'obtenir sur https://pkg.elab.warwick.ac.uk/net.sourceforge.jtds/jtds-1.3.1.jar
lib/ojdbc8.jar
Vous pouvez l'obtenir sur https://pkg.elab.warwick.ac.uk/oracle.com/ojdbc8.jar
lib/postgresql-42.2.5.jar
Vous pouvez l'obtenir sur http://central.maven.org/maven2/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar
lib/logback.xml
Configuration de connexion. Une alternative serait de regrouper cela avec les WAR, mais cela ne nous permettrait pas de modifier la configuration par serveur.
lib/tabula.properties
Propriétés transmises à l'application. Vous pouvez en obtenir un sur tabula-test, puis le personnaliser.
N'utilisez pas simplement les clés de tabula-test ou de toute autre instance, générez-en de nouvelles pour votre instance locale en exécutant ./gradlew generateEncryptionKey
et en l'utilisant pour objectstore.encryptionKey
, turnitin.tca.signingSecret
et tabula.database.encryptionKey
.
lib/tabula-sso-config.xml
Le guff habituel de configuration SSO. Vous devrez ajouter cette configuration à Web Sign-on pour que SSO fonctionne. Assurez-vous qu'il inclut une section <trustedapps />
ou vous verrez les NPE de l'une des bibliothèques de chiffrement Bouncycastle. Assurez-vous également que la source de données du cluster correspond à l'échantillon : les anciennes configurations peuvent ne pas correspondre, ce qui entraînera des exceptions de source de données introuvable .
Malheureusement, la seule façon de faire fonctionner cela sur Tomcat est d'installer ActiveMQ localement.
Installez ActiveMQ à partir du référentiel de packages et ajoutez une nouvelle configuration avec le nom de courtier Tabula.
Le package ActiveMQ dans le dépôt utopique est complètement cassé, nous allons donc utiliser un dépôt externe pour obtenir la dernière version.
sudo apt-add-repository 'deb http://dl.bintray.com/jmkgreen/deb /'
sudo apt-get update
sudo apt-get install activemq
Ignorez l'avertissement concernant les packages non authentifiés. Une fois terminé, modifiez /etc/activemq/activemq.xml
et recherchez où il est indiqué brokerName="localhost"
- remplacez-le par brokerName="tabula"
. Redémarrez ActiveMQ avec sudo service activemq restart
.
Définissez les éléments suivants dans votre tabula.properties
:
activemq.broker=tcp://localhost:61616
Pour l'exécuter localement, vous disposez de quelques options :
Pour 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
Vous devrez modifier /etc/elasticsearch/elasticsearch.yml
pour définir cluster.name: tabula
(ou définir elasticsearch.cluster.name=elasticsearch
dans tabula.properties
.
Lorsque je l'exécutais localement, il ne démarrait pas au démarrage par défaut, mais je pouvais le démarrer avec sudo systemctl start elasticsearch
. Exécutez sudo systemctl enable elasticsearch
pour qu'il s'exécute au démarrage.
Définissez les propriétés suivantes dans votre tabula.properties
:
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
Veuillez vous assurer de modifier votre elasticsearch.index.prefix
ou vous pourriez finir par écraser l'index de quelqu'un d'autre. Si vous rencontrez des problèmes de pare-feu, criez #devops
Remarque : sur Ubuntu, au moins, vous devrez peut-être redémarrer pour nettoyer votre environnement après avoir changé de JDK. C'est nul, si quelqu'un peut l'améliorer, ce sera génial.
Ajoutez le PPA webupd8team si vous ne l'avez pas déjà fait :
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
Définir Java 8 comme JDK par défaut : sudo apt-get install oracle-java8-set-default
Vous devrez définir deux variables d'environnement, CATALINA_HOME
et CATALINA_BASE
lors du démarrage de Tomcat. CATALINA_HOME
est le répertoire dans lequel Tomcat est installé et CATALINA_BASE
est le répertoire où se trouvent vos fichiers de configuration ci-dessus.
Vous pouvez ensuite utiliser $CATALINA_HOME/bin/catalina.sh
pour démarrer le serveur au premier plan, ou startup.sh
pour le démarrer en arrière-plan.
Un exemple de script de démarrage pour Tabula peut être :
#!/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 $@
Configurez un hôte virtuel Apache faisant référence aux fichiers d'inclusion dans config/servers/common/vhosts
- utilisez rewrites.inc
pour le développement complet de Tabula.
Vous avez besoin d'un hôte virtuel HTTPS pour SSO, donc si vous ne configurez qu'un seul hôte virtuel, ce devrait être celui HTTPS. Les fichiers d'inclusion font référence à une carte pour que le port soit utilisé. Vous devrez donc peut-être définir le vôtre avec trois lignes telles que
RewriteMap api txt:/etc/apache2/tabulaport.txt
RewriteMap proxy txt:/etc/apache2/tabulaport.txt
RewriteMap scheduler txt:/etc/apache2/tabulaport.txt
La ligne ci-dessus doit pointer vers un fichier contenant cette ligne (en supposant que le port Tomcat par défaut 8080) :
port 8080
Copiez gradle-local-example.properties
sous gradle-local.properties
et modifiez les propriétés qu'il contient pour qu'elles correspondent à votre système. gradle-local.properties
sera ignoré par Git.
Si vous effectuez une mise à jour à partir d'une ancienne version de Tabula, n'oubliez pas d'appliquer les migrations de bases de données récentes à partir de config/scripts/schema
. Si vous recevez une IllegalStateException
de Lucene, cela signifie qu'un de vos index est obsolète. Trouvez son emplacement (recherchez dans tabula.properties
base.data.dir
et regardez dans le répertoire index
à l'intérieur). Supprimez l'index concerné (par exemple rm -fr BASE_DATA_DIR/index/notifications
) et reconstruisez-le à partir de /sysadmin dans l'application.
Exécutez ./gradlew deployToTomcat
pour créer l'application et copier un WAR éclaté à l'emplacement que vous avez spécifié dans votre fichier de propriétés.
Gradle initialisera un serveur zinc pour effectuer des compilations incrémentielles, mais cela ne dure que pendant la durée d'exécution du démon Gradle - cela le rend assez inefficace pour effectuer de nombreuses compilations (heureusement, la vitesse de compilation est plutôt bonne, même pour Scala).
Les résultats des tests unitaires Gradle sont envoyés dans un fichier HTML qui est plutôt bon, vous ne voulez donc probablement pas passer trop de temps à essayer de rendre la sortie de la console plus verbeuse.
Si vous exécutez npm run watch
depuis le dossier web
dans un onglet, cela créera constamment des actifs et JRebel les synchronisera ensuite avec la guerre, ainsi que le contenu WEB-INF tel que les vues Freemarker.
Quelques autres commandes Gradle utiles :
./gradlew test deployToTomcat
- exécute également des tests pendant le déploiement (aucun test n'est exécuté par défaut)./gradlew web:deployToTomcat
- déployez un seul module, mais créez des dépendances de module comme communes (rappelez-vous que Tomcat déploiera toujours les anciennes guerres à moins que vous ne les supprimiez !)./gradlew test
- exécute des tests, affichant la trace des échecs de la pile dans la console et une sortie appropriée dans un fichier HTML./gradlew web:test --tests *.ApplicationTest
- exécuter un test spécifique./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk
- exécuter des tests fonctionnels (démarrer d'abord l'instance Tomcat)./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk --tests *.CourseworkModuleManagerTest
- exécuter un test fonctionnel spécifique./gradlew cucumber
- exécutez des tests de concombre (contre tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
- exécute des tests Cucumber en production./gradlew cucumber -Dfeature.name=gzip
- exécute des scénarios Cucumber pour une seule fonctionnalité./gradlew --continuous
- compile continuellement les sources au fur et à mesure qu'elles sont enregistrées dans votre IDE./gradlew test --continuous
- compile en continu les sources et exécute les tests au fur et à mesure qu'ils sont enregistrés dans votre IDE (les tests ne s'exécutent que s'ils réussissent)./gradlew web:test --tests *.ApplicationTest --continuous
- compile et exécute en continu un seul test./gradlew generateEncryptionKey
- imprime une clé de chiffrement codée en Base64 à utiliser dans tabula.properties
pour le stockage d'objets ou la base de données Le module web
contient un appel à npm run build
pour créer des actifs avec Webpack dans le cadre du déploiement. Vous pouvez l'exécuter manuellement pour créer un nouveau contenu statique dans build/rootContent
(qui est surveillé par JRebel pour les modifications).
Si vous ne voulez pas du tout jouer avec Webpack, vous pouvez appeler ./gradlew webpack
pour reconstruire les actifs.
Autres commandes npm
utiles :
npm run build
- créez tous les actifs de production et quitteznpm run dev
- créer des actifs pour le développement et quitternpm run watch
- surveillez les modifications apportées aux fichiers et reconstruisez les actifs de développement Pour le moment, nous avons encore beaucoup de bibliothèques JS dans src/main/assets/static/libs/
- celles-ci devraient être progressivement remplacées par une gestion appropriée des dépendances dans package.json
(nous le faisons déjà pour ID7). Si vous devez mettre à jour ID7, modifiez le numéro de version dans package.json
et exécutez npm install
(la build le fera automatiquement).
config
servers
common
- éléments que la plupart des serveurs utilisent pour la configuration Apache, etc.scripts
schema
- Scripts de migration SQL pour toute modification du schéma de base de données.api|common|web
- Modules de tabulationsrc
main
scala
- Fichiers sources Scalajava
- Fichiers sources Javaresources
- fichiers non codés qui seront disponibles dans le chemin de classe de l'applicationassets
- fichiers JS/CSS, etc. à traiter par webpack avant d'être ajoutés au WARwebapp
- autres fichiers non codés qui composent le WAR.artwork
- graphiques sources non inclus dans l'application, mais utilisés pour générer des images statiques. Généralement SVG/Inkscape.test
console
Dans un module, Gradle superposera les ressources common
lors de la construction d'un WAR. Dans une superposition, les fichiers existants ne sont pas écrasés. Vous pouvez donc définir un fichier portant le même nom pour remplacer le comportement qui serait défini dans la superposition.
common/.../WEB-INF
-> WEB-INF
- applicationContext.xml
par défaut et certaines inclusions qui peuvent être remplacéesweb/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
- remplace le vide par défaut du commun Disponible ici : Documentation du développeur