Este es Tabula, el sistema de administración de estudiantes de la Universidad de Warwick que incluye varios módulos. Tiene un proyecto JIRA interno.
Actualmente, los módulos que se encuentran en Tabula son:
Proporcionamos una configuración de Docker que se puede usar con docker-compose
para crear e implementar Tabula localmente.
Debería poder acceder a los archivos fuente y binarios desde mvn.elab.warwick.ac.uk cuando resuelva las dependencias. Si está utilizando un IDE (recomendamos IntelliJ IDEA), esto debería significar que obtendrá la finalización del código y la fuente original de las dependencias que no han sido completamente de código abierto.
El contenedor gradle ahora debería poder compilar wars, si ejecuta ./gradlew war
desde el directorio raíz, debería compilar api/build/libs/api.war
y web/build/libs/ROOT.war
.
Nota de macOS : el head
estándar en macOS puede ser incompatible con docker/init.sh
; es posible que desee obtener ghead
de Homebrew y reemplazar instancias en el script antes de ejecutarlo.
Primero, ejecute docker/init.sh
(es decir, ejecútelo desde la raíz del proyecto, en lugar de ingresar cd
al directorio de Docker). Esto le hará tres preguntas:
urn:localdev.warwick.ac.uk:tabula:service
? Obtendrá esto cuando se registre para obtener un ID de proveedor de SSO con el equipo web de ITS). Esto genera los archivos de propiedades necesarios para ejecutar Tabula en docker/data
. No debería necesitar ejecutar docker/init.sh
nuevamente excepto cuando haya habido un cambio en las propiedades requeridas; Si solo está cambiando archivos de propiedades, puede cambiar estos archivos directamente sin regenerarlos.
Ahora puede iniciar los contenedores Docker con sudo docker-compose up --build
(nuevamente, solo necesitará --build
cuando se hayan realizado cambios en la configuración). Esto hará que todo funcione y debería obtener un 404 para https://localdev.warwick.ac.uk/ (y un mensaje de autenticación básica 401 para http://localdev.warwick.ac.uk:8080/manager).
Ahora puede implementar la aplicación con ./gradlew cargoDeployRemote
, que se conectará a la aplicación Manager en Tomcat e implementará la aplicación allí. Si realiza cambios y desea volver a implementar sin comenzar desde cero, puede ejecutar ./gradlew cargoRedeployRemote
; Si usa JRebel y lo ha configurado correctamente con el servidor remoto, debería poder realizar cambios en vivo sin tener que volver a implementar.
Una vez que haya ejecutado la aplicación, arrojará algunos errores que se esperan cuando no hay datos ni en la base de datos ni en Elasticsearch. Deberá ir a https://localdev.warwick.ac.uk/sysadmin (tenga en cuenta que esto requiere que el usuario que inició sesión sea miembro del grupo web in-tabula-local-dev-sysadmins
, puede editar el docker/data/tomcat/lib/tabula.properties
generado para usar un grupo diferente).
El personal puede crear WebGroups en el sistema WebGroups, o puede usar un grupo existente, como all-staff
para permitir que cualquier miembro del personal esté en la Universidad (por ejemplo).
Haga clic en los 3 cuadros para "Reconstruir índice de eventos de auditoría desde", "Reconstruir índice de perfiles desde" y "Reconstruir índice de flujo de notificaciones desde" para que se completen con una fecha y haga clic en "Indexar". Esto debería completarse inmediatamente ya que no se indexarán datos, pero creará la estructura de índice en Elasticsearch.
A continuación, inicie las Importaciones en la parte superior derecha:
Como tabula.properties
especifica que se trata de una instancia de zona de pruebas, se completará rápidamente y con datos completamente falsos.
Luego puede ir a "Listar departamentos en el sistema", hacer clic en un departamento y "Ver administradores de departamento" para otorgar permisos. Habilitar el modo Dios permitirá a su usuario omitir las verificaciones de permisos y agregar permisos ordinarios.
Instale la última versión de Tomcat 8.5 desde aquí: http://tomcat.apache.org/download-80.cgi - en Unix, tiene sentido simplemente extraer Tomcat en /opt
y luego vincularlo simbólicamente a /usr/local/tomcat-8
o donde sea conveniente. Luego puede actualizar Tomcat sin alterar ninguna configuración simplemente cambiando ese enlace simbólico.
Cree un nuevo directorio base para la configuración y la implementación de Tabula, por ejemplo, /var/tomcat/instances/tabula
. La estructura y contenido de este directorio debe ser el siguiente:
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/
Puede resultarle útil vincular /usr/local/tomcat-8/instances
a /var/tomcat/instances
si se siente cómodo con los diseños de estilo Jboss.
El contenido de estos archivos es el siguiente:
bin/setenv.sh
Este es un script que se ejecuta para establecer variables de entorno para la instancia en ejecución. Probablemente quieras usarlo para configurar la administración de memoria, JRebel, depuración, etc.
Puede encontrar un archivo de muestra en config/servers/augustus/bin
conf/context.xml
Contiene recursos que se incluirán en el servidor; en este caso, solo fuentes de datos JNDI. Puede utilizar las inclusiones XML de entidad para tenerlas en archivos separados.
Hay un context.xml
de muestra y algunas fuentes de datos de muestra en config/servers/augustus/conf
conf/server.xml
Instrucciones sobre cómo ejecutar el servidor, incluidos los puertos a los que conectarse. Esto es bastante estándar.
Hay un server.xml
de muestra en config/servers/augustus/conf
conf/web.xml
Esto simplemente se copia del directorio conf
en la instalación de Tomcat 8. No pude ejecutar Tomcat sin copiarlo, lo cual apesta un poco.
lib/warwick-logging-1.1.jar
Puede obtenerlo en https://pkg.elab.warwick.ac.uk/ch.qos.logback/warwick-logging-1.1-all.jar
Tenga en cuenta que esta dependencia reemplaza las dependencias anteriores de logback, logstash-logback-encoder, jackson y slf4j-api.
lib/jtds-1.3.1.jar
Puede obtenerlo en https://pkg.elab.warwick.ac.uk/net.sourceforge.jtds/jtds-1.3.1.jar
lib/ojdbc8.jar
Puede obtenerlo en https://pkg.elab.warwick.ac.uk/oracle.com/ojdbc8.jar
lib/postgresql-42.2.5.jar
Puede obtener esto desde http://central.maven.org/maven2/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar
lib/logback.xml
Configuración de inicio de sesión. Una alternativa sería empaquetar esto con los WAR, pero eso no nos permitiría cambiar la configuración por servidor.
lib/tabula.properties
Propiedades pasadas a la aplicación. Puede obtener uno de estos de tabula-test y luego personalizarlo.
No use simplemente las claves de tabula-test o cualquier otra instancia, genere claves nuevas para su instancia local ejecutando ./gradlew generateEncryptionKey
y usándolas para objectstore.encryptionKey
, turnitin.tca.signingSecret
y tabula.database.encryptionKey
.
lib/tabula-sso-config.xml
La típica tontería de configuración de SSO. Deberá agregar esta configuración al inicio de sesión web para que SSO funcione. Asegúrese de que incluya una sección <trustedapps />
o verá NPE de una de las bibliotecas criptográficas de bouncycastle. Además, asegúrese de que la fuente de datos del clúster coincida con la muestra; es posible que las configuraciones anteriores no coincidan, lo que provocará excepciones de fuente de datos no encontrada .
Desafortunadamente, la única forma de hacer que esto funcione en Tomcat es instalar ActiveMQ localmente.
Instale ActiveMQ desde el repositorio de paquetes y agregue una nueva configuración con el nombre del agente Tabula.
El paquete ActiveMQ en el repositorio de utopic está completamente roto, por lo que usaremos un repositorio externo para obtener la última versión.
sudo apt-add-repository 'deb http://dl.bintray.com/jmkgreen/deb /'
sudo apt-get update
sudo apt-get install activemq
Ignore la advertencia sobre paquetes no autenticados. Una vez que haya terminado, edite /etc/activemq/activemq.xml
y busque donde dice brokerName="localhost"
; cámbielo a brokerName="tabula"
. Reinicie ActiveMQ con sudo service activemq restart
.
Configure lo siguiente en su tabula.properties
:
activemq.broker=tcp://localhost:61616
Para ejecutar esto localmente, tiene algunas opciones:
Para 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
Deberá editar /etc/elasticsearch/elasticsearch.yml
para configurar cluster.name: tabula
(o configurar elasticsearch.cluster.name=elasticsearch
en tabula.properties
.
Cuando lo ejecuté localmente, no se iniciaba al arrancar de forma predeterminada, pero podía iniciarlo con sudo systemctl start elasticsearch
. Ejecute sudo systemctl enable elasticsearch
para que se ejecute al arrancar.
Establezca las siguientes propiedades en su 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
Asegúrese de cambiar su elasticsearch.index.prefix
o podría terminar sobrescribiendo el índice de otra persona. Si tiene problemas con el firewall, grite #devops
Nota: Al menos en Ubuntu, es posible que tengas que reiniciar para limpiar tu entorno después de cambiar los JDK. Esto apesta, si alguien puede mejorarlo, sería genial.
Agregue el PPA de webupd8team si aún no lo ha hecho:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
Configure Java 8 como JDK predeterminado: sudo apt-get install oracle-java8-set-default
Deberá configurar dos variables de entorno, CATALINA_HOME
y CATALINA_BASE
al iniciar Tomcat. CATALINA_HOME
es el directorio donde está instalado Tomcat y CATALINA_BASE
es el directorio donde están los archivos de configuración anteriores.
Luego puede usar $CATALINA_HOME/bin/catalina.sh
para iniciar el servidor en primer plano, o startup.sh
para iniciarlo en segundo plano.
Un script de inicio de ejemplo para Tabula puede ser:
#!/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 $@
Configure un vhost Apache que haga referencia a los archivos incluidos en config/servers/common/vhosts
; use rewrites.inc
para el desarrollo completo de Tabula.
Necesitas un vhost HTTPS para SSO, por lo que si solo vas a configurar un vhost, debería ser el HTTPS. Los archivos de inclusión hacen referencia a un mapa para utilizar el puerto, por lo que es posible que deba definir el suyo con tres líneas, como
RewriteMap api txt:/etc/apache2/tabulaport.txt
RewriteMap proxy txt:/etc/apache2/tabulaport.txt
RewriteMap scheduler txt:/etc/apache2/tabulaport.txt
La línea anterior debería apuntar a un archivo que contenga esta línea (asumiendo el puerto predeterminado de Tomcat 8080):
port 8080
Copie gradle-local-example.properties
como gradle-local.properties
y edite las propiedades allí para que coincidan con su sistema. Git ignorará gradle-local.properties
.
Si actualiza desde una versión anterior de Tabula, recuerde aplicar las migraciones de bases de datos recientes desde config/scripts/schema
. Si recibe una IllegalStateException
de Lucene, significa que uno de sus índices no está actualizado. Encuentre su ubicación (busque en tabula.properties
base.data.dir
y busque dentro del directorio index
). Elimine el índice relevante (por ejemplo, rm -fr BASE_DATA_DIR/index/notifications
) y reconstrúyalo desde /sysadmin dentro de la aplicación.
Ejecute ./gradlew deployToTomcat
para compilar la aplicación y copie un WAR desglosado en la ubicación que especificó en su archivo de propiedades.
Gradle inicializará un servidor zinc para realizar compilaciones incrementales, pero eso solo dura mientras se ejecuta el demonio Gradle; esto lo hace bastante ineficiente para realizar muchas compilaciones (afortunadamente, la velocidad de compilación es bastante buena, incluso para Scala).
Los resultados de las pruebas unitarias de Gradle van a un archivo HTML que es bastante bueno, por lo que probablemente no quieras perder mucho tiempo intentando que la salida de la consola sea más detallada.
Si ejecuta npm run watch
desde dentro de la carpeta web
en una pestaña, eso generará recursos constantemente y JRebel los sincronizará con la guerra, junto con el contenido WEB-INF, como las vistas de Freemarker.
Algunos otros comandos útiles de Gradle:
./gradlew test deployToTomcat
: también ejecuta pruebas durante la implementación (no se ejecutan pruebas de forma predeterminada)./gradlew web:deployToTomcat
: implemente un solo módulo, pero haga que las dependencias de los módulos sean comunes (recuerde que Tomcat seguirá implementando guerras antiguas a menos que las elimine)../gradlew test
: ejecuta pruebas que muestran el seguimiento de las fallas en la consola y la salida adecuada a un archivo HTML./gradlew web:test --tests *.ApplicationTest
: ejecuta una prueba específica./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk
- ejecute pruebas funcionales (inicie primero la instancia de Tomcat)./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk --tests *.CourseworkModuleManagerTest
: ejecuta una prueba funcional específica./gradlew cucumber
: ejecuta pruebas de pepino (contra tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
- ejecuta pruebas de pepino contra producción./gradlew cucumber -Dfeature.name=gzip
- ejecuta escenarios de Cucumber para una sola característica./gradlew --continuous
- compila fuentes continuamente a medida que se guardan en su IDE./gradlew test --continuous
- compila continuamente fuentes y ejecuta pruebas a medida que se guardan en tu IDE (las pruebas solo se ejecutan si se aprueba)./gradlew web:test --tests *.ApplicationTest --continuous
- compila y ejecuta continuamente una única prueba./gradlew generateEncryptionKey
: imprime una clave de cifrado codificada en Base64 para usar en tabula.properties
para almacenamiento de objetos o base de datos El módulo web
contiene una llamada a npm run build
para crear activos con Webpack como parte de la implementación. Puede ejecutar esto manualmente para crear nuevo contenido estático en build/rootContent
(que JRebel supervisa para detectar cambios).
Si no quiere meterse con el paquete web en absoluto, puede llamar a ./gradlew webpack
para reconstruir los activos.
Otros comandos npm
útiles:
npm run build
: construye todos los activos de producción y salenpm run dev
: crea activos para el desarrollo y la salidanpm run watch
: observe los cambios en los archivos y reconstruya los activos de desarrollo Por el momento, todavía tenemos muchas bibliotecas JS en src/main/assets/static/libs/
; estas deberían reemplazarse gradualmente con una gestión de dependencia adecuada en package.json
(ya hacemos esto para ID7). Si necesita actualizar ID7, cambie el número de versión en package.json
y ejecute npm install
(la compilación lo hará automáticamente).
config
servers
common
: cosas que la mayoría de los servidores usan para la configuración de Apache, etc.scripts
schema
: scripts de migración SQL para cualquier cambio en el esquema de la base de datos.api|common|web
- Módulos de tabulasrc
main
scala
: archivos fuente de Scalajava
: archivos fuente de Javaresources
: archivos sin código que estarán disponibles en la ruta de clases de la aplicaciónassets
: archivos JS/CSS, etc., que el paquete web procesará como activos antes de agregarlos a WARwebapp
: otros archivos sin código que componen WAR.artwork
: gráficos de origen no incluidos en la aplicación, pero que se utilizan para generar imágenes estáticas. Generalmente SVG/Inkscape.test
console
En un módulo, Gradle superpondrá recursos common
cuando cree una WAR. En una superposición, los archivos que existen no se sobrescriben, por lo que puede definir un archivo con el mismo nombre para anular el comportamiento que se definiría en la superposición.
common/.../WEB-INF
-> WEB-INF
- applicationContext.xml
predeterminado y algunas inclusiones que se pueden anularweb/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
: anula el vacío predeterminado de común Disponible aquí: documentación para desarrolladores