Este é o Tabula, o sistema de administração estudantil da Universidade de Warwick, incluindo vários módulos. Possui um projeto JIRA interno.
Atualmente os módulos que estão no Tabula são:
Fornecemos uma configuração do Docker que pode ser usada com docker-compose
para construir e implantar o Tabula localmente.
Você deve ser capaz de acessar o código-fonte e os binários em mvn.elab.warwick.ac.uk ao resolver dependências. Se você estiver usando um IDE (recomendamos o IntelliJ IDEA), isso significa que você obterá a conclusão do código e a fonte original de dependências que não foram totalmente de código aberto.
O wrapper gradle agora deve ser capaz de construir wars, se você executar ./gradlew war
a partir do diretório raiz, ele deverá construir api/build/libs/api.war
e web/build/libs/ROOT.war
.
Nota do macOS : O head
padrão no macOS pode ser incompatível com docker/init.sh
, você pode querer obter ghead
do Homebrew e substituir as instâncias no script antes de executar.
Primeiro, execute docker/init.sh
(ou seja, execute-o a partir da raiz do projeto, em vez de cd
'ing no diretório docker). Isso fará três perguntas:
urn:localdev.warwick.ac.uk:tabula:service
- você obterá isso ao se registrar para obter um ID de provedor de SSO com a equipe da Web do ITS). Isso gera os arquivos de propriedades necessários para executar Tabula em docker/data
. Você não deve precisar executar docker/init.sh
novamente, exceto quando houver uma alteração nas propriedades necessárias; se você estiver apenas alterando arquivos de propriedades, poderá alterar esses arquivos diretamente, sem regenerá-los.
Agora você pode iniciar os contêineres do Docker com sudo docker-compose up --build
(novamente, você só precisará de --build
quando alterações na configuração forem feitas). Isso fará com que tudo funcione e você deverá obter um 404 para https://localdev.warwick.ac.uk/ (e um prompt de autenticação básico 401 para http://localdev.warwick.ac.uk:8080/manager).
Agora, você pode implantar o aplicativo com ./gradlew cargoDeployRemote
que se conectará ao aplicativo Manager no Tomcat e implantará o aplicativo lá. Se você fizer alterações e quiser reimplantar sem começar do zero, poderá executar ./gradlew cargoRedeployRemote
; se você usar o JRebel e configurá-lo corretamente com o servidor remoto, poderá fazer alterações ao vivo sem reimplantar.
Depois que o aplicativo estiver em execução, ele gerará alguns erros esperados quando não houver dados no banco de dados ou no Elasticsearch. Você precisará acessar https://localdev.warwick.ac.uk/sysadmin (observe que isso requer que seu usuário logado seja membro do WebGroup in-tabula-local-dev-sysadmins
, você pode editar o docker/data/tomcat/lib/tabula.properties
gerado para usar um grupo diferente).
WebGroups podem ser criados no sistema WebGroups pela equipe, ou você pode usar um grupo existente, como all-staff
para permitir qualquer membro da equipe da Universidade (por exemplo).
Clique nas 3 caixas para "Reconstruir índice de eventos de auditoria de", "Reconstruir índice de perfis de" e "Reconstruir índice de fluxo de notificação de" para que sejam preenchidas com uma data e clique em "Índice". Isso deve ser concluído imediatamente, pois nenhum dado será indexado, mas criará a estrutura do índice no Elasticsearch.
Em seguida, inicie as Importações no canto superior direito:
Como tabula.properties
especifica que esta é uma instância de sandbox, isso será concluído rapidamente e com dados completamente falsos.
Você pode então ir para "Listar departamentos no sistema", clicar em um departamento e "Ver administradores de departamento" para conceder permissões, ativar o modo Deus permitirá que seu usuário ignore as verificações de permissões e adicione permissões comuns.
Instale o Tomcat 8.5 mais recente aqui: http://tomcat.apache.org/download-80.cgi - no Unix, faz sentido apenas extrair o Tomcat em /opt
e depois vinculá-lo simbolicamente a /usr/local/tomcat-8
ou onde for conveniente. Você pode então atualizar o Tomcat sem quebrar nenhuma configuração, apenas alterando esse link simbólico.
Crie um novo diretório base para configuração e implantação do Tabula, por exemplo /var/tomcat/instances/tabula
. A estrutura e o conteúdo deste diretório devem ser os seguintes:
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/
Você pode achar útil vincular /usr/local/tomcat-8/instances
a /var/tomcat/instances
se estiver confortável com layouts no estilo Jboss.
O conteúdo desses arquivos é o seguinte:
bin/setenv.sh
Este é um script executado para definir variáveis de ambiente para a instância em execução. Você provavelmente desejará usá-lo para configurar o gerenciamento de memória, JRebel, depuração, etc.
Um arquivo de amostra pode ser encontrado em config/servers/augustus/bin
conf/context.xml
Contém recursos que serão incluídos no servidor - neste caso, apenas JNDI DataSources. Você pode usar inclusões de XML de entidade para tê-los em arquivos separados.
Há um exemplo de context.xml
e alguns exemplos de fontes de dados em config/servers/augustus/conf
conf/server.xml
Instruções sobre como executar o servidor, incluindo quais portas vincular. Isso é praticamente padrão.
Há um exemplo server.xml
em config/servers/augustus/conf
conf/web.xml
Isso foi copiado do diretório conf
na instalação do Tomcat 8. Não consegui fazer o Tomcat rodar sem que ele fosse copiado, o que é um pouco chato.
lib/warwick-logging-1.1.jar
Você pode obter isso em https://pkg.elab.warwick.ac.uk/ch.qos.logback/warwick-logging-1.1-all.jar
Observe que esta dependência substitui as dependências anteriores em logback, logstash-logback-encoder, jackson e slf4j-api
lib/jtds-1.3.1.jar
Você pode obter isso em https://pkg.elab.warwick.ac.uk/net.sourceforge.jtds/jtds-1.3.1.jar
lib/ojdbc8.jar
Você pode obter isso em https://pkg.elab.warwick.ac.uk/oracle.com/ojdbc8.jar
lib/postgresql-42.2.5.jar
Você pode obter isso em http://central.maven.org/maven2/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar
lib/logback.xml
Configuração de logback. Uma alternativa seria empacotar isso com os WARs, mas isso não nos permitiria alterar a configuração por servidor.
lib/tabula.properties
Propriedades passadas para o aplicativo. Você pode obter um desses no tabula-test e personalizá-lo.
Não use apenas as chaves de tabula-test ou qualquer outra instância, gere novas para sua instância local executando ./gradlew generateEncryptionKey
e usando-as para objectstore.encryptionKey
, turnitin.tca.signingSecret
e tabula.database.encryptionKey
.
lib/tabula-sso-config.xml
A bobagem usual de configuração de SSO. Você precisará adicionar essa configuração ao Web Sign-on para que o SSO funcione. Certifique-se de incluir uma seção <trustedapps />
ou você verá NPEs de uma das bibliotecas de criptografia do bouncycastle. Além disso, certifique-se de que a fonte de dados do cluster corresponda à amostra – configurações mais antigas podem não corresponder, o que causará exceções de fonte de dados não encontrada .
Infelizmente, a única maneira de fazer isso funcionar no Tomcat é instalar o ActiveMQ localmente.
Instale o ActiveMQ do repositório de pacotes e adicione uma nova configuração com o nome do corretor Tabula.
O pacote ActiveMQ no repositório utópico está completamente quebrado, então usaremos um repositório externo para obter a versão mais recente.
sudo apt-add-repository 'deb http://dl.bintray.com/jmkgreen/deb /'
sudo apt-get update
sudo apt-get install activemq
Ignore o aviso sobre pacotes não autenticados. Quando terminar, edite /etc/activemq/activemq.xml
e procure onde diz brokerName="localhost"
- mude para brokerName="tabula"
. Reinicie o ActiveMQ com sudo service activemq restart
.
Defina o seguinte em seu tabula.properties
:
activemq.broker=tcp://localhost:61616
Para executar isso localmente, você tem algumas opções:
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
Você precisará editar /etc/elasticsearch/elasticsearch.yml
para definir cluster.name: tabula
(ou definir elasticsearch.cluster.name=elasticsearch
em tabula.properties
.
Quando eu o executei localmente, ele não iniciava na inicialização por padrão, mas eu poderia iniciá-lo com sudo systemctl start elasticsearch
. Execute sudo systemctl enable elasticsearch
para que ele seja executado na inicialização.
Defina as seguintes propriedades em seu 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
Certifique -se de alterar seu elasticsearch.index.prefix
ou você pode acabar substituindo o índice de outra pessoa. Se você tiver problemas de firewall, grite #devops
Nota: No Ubuntu, pelo menos, pode ser necessário reinicializar para limpar seu ambiente após trocar de JDKs. Isso é uma merda, se alguém puder melhorar, será ótimo.
Adicione o PPA webupd8team se ainda não o fez:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
Defina Java 8 como JDK padrão: sudo apt-get install oracle-java8-set-default
Você precisará definir duas variáveis de ambiente, CATALINA_HOME
e CATALINA_BASE
ao iniciar o Tomcat. CATALINA_HOME
é o diretório onde o Tomcat está instalado e CATALINA_BASE
é o diretório onde estão seus arquivos de configuração acima.
Você pode então usar $CATALINA_HOME/bin/catalina.sh
para iniciar o servidor em primeiro plano ou startup.sh
para iniciá-lo em segundo plano.
Um exemplo de script de inicialização para Tabula pode 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 um vhost Apache referenciando os arquivos incluídos em config/servers/common/vhosts
- use rewrites.inc
para desenvolvimento completo do Tabula.
Você precisa de um vhost HTTPS para SSO, portanto, se for configurar apenas um vhost, deve ser o HTTPS. Os arquivos incluídos fazem referência a um mapa para usar a porta, então você pode precisar definir o seu com três linhas, como
RewriteMap api txt:/etc/apache2/tabulaport.txt
RewriteMap proxy txt:/etc/apache2/tabulaport.txt
RewriteMap scheduler txt:/etc/apache2/tabulaport.txt
A linha acima deve apontar para um arquivo contendo esta linha (assumindo a porta padrão do Tomcat 8080):
port 8080
Copie gradle-local-example.properties
como gradle-local.properties
e edite as propriedades para corresponder ao seu sistema. gradle-local.properties
será ignorado pelo Git.
Se estiver atualizando de uma versão mais antiga do Tabula, lembre-se de aplicar as migrações recentes do banco de dados de config/scripts/schema
. Se você receber uma IllegalStateException
do Lucene, significa que um dos seus índices está desatualizado. Encontre sua localização (procure em tabula.properties
por base.data.dir
e procure dentro do diretório index
). Exclua o índice relevante (por exemplo, rm -fr BASE_DATA_DIR/index/notifications
) e reconstrua-o a partir de /sysadmin dentro do aplicativo.
Execute ./gradlew deployToTomcat
para construir o aplicativo e copie um WAR explodido para o local especificado em seu arquivo de propriedades.
Gradle inicializará um servidor zinc para fazer compilações incrementais, mas isso dura apenas enquanto o daemon Gradle é executado - isso o torna bastante ineficiente para fazer muitas compilações (felizmente, a velocidade de compilação é muito boa, mesmo para Scala).
Os resultados do teste de unidade Gradle vão para um arquivo HTML que é muito bom, então você provavelmente não vai querer gastar muito tempo tentando tornar a saída do console mais detalhada.
Se você executar npm run watch
de dentro da pasta web
em uma guia, isso criará ativos constantemente e o JRebel os sincronizará com a guerra, junto com o conteúdo WEB-INF, como visualizações do Freemarker.
Alguns outros comandos úteis do Gradle:
./gradlew test deployToTomcat
- também executa testes durante a implantação (nenhum teste é executado por padrão)./gradlew web:deployToTomcat
- implanta um único módulo, mas torna as dependências do módulo comuns (lembre-se que o Tomcat ainda implantará guerras antigas, a menos que você as exclua!)./gradlew test
- executa testes, mostrando o rastreamento de pilha de falhas no console e a saída adequada para um arquivo HTML./gradlew web:test --tests *.ApplicationTest
- execute um teste específico./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk
- execute testes funcionais (iniciar a instância do Tomcat primeiro)./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk --tests *.CourseworkModuleManagerTest
- execute um teste funcional específico./gradlew cucumber
- execute testes de pepino (em tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
- executa testes de pepino em produção./gradlew cucumber -Dfeature.name=gzip
- executa cenários Cucumber para um único recurso./gradlew --continuous
- compila fontes continuamente à medida que são salvas em seu IDE./gradlew test --continuous
- compila fontes continuamente e executa testes conforme eles são salvos em seu IDE (os testes só são executados se forem aprovados)./gradlew web:test --tests *.ApplicationTest --continuous
- compila e executa continuamente um único teste./gradlew generateEncryptionKey
- imprime uma chave de criptografia codificada em Base64 para uso em tabula.properties
para armazenamento de objetos ou banco de dados O módulo web
contém uma chamada para npm run build
para construir ativos com Webpack como parte da implantação. Você pode executar isso manualmente para construir novo conteúdo estático em build/rootContent
(que é monitorado pelo JRebel para alterações).
Se você não quiser mexer com o webpack, você pode chamar ./gradlew webpack
para reconstruir os ativos.
Outros comandos npm
úteis:
npm run build
- construa todos os ativos de produção e saianpm run dev
- construa ativos para desenvolvimento e saídanpm run watch
- observe as alterações nos arquivos e reconstrua os ativos de desenvolvimento No momento, ainda temos muitas bibliotecas JS em src/main/assets/static/libs/
- elas devem ser gradualmente substituídas por um gerenciamento de dependência adequado em package.json
(já fazemos isso para ID7). Se você precisar atualizar o ID7, altere o número da versão em package.json
e execute npm install
(a compilação fará isso automaticamente).
config
servers
common
- coisas que a maioria dos servidores usa para configuração do Apache, etc.scripts
schema
- scripts de migração SQL para quaisquer alterações no esquema do banco de dados.api|common|web
- Módulos Tabulasrc
main
scala
- arquivos de origem Scalajava
- arquivos fonte Javaresources
- arquivos sem código que estarão disponíveis no classpath do aplicativoassets
- arquivos JS/CSS etc. para serem processados por ativos pelo webpack antes de serem adicionados ao WARwebapp
- outros arquivos sem código que compõem o WAR.artwork
- gráficos de origem não incluídos no aplicativo, mas usados para gerar imagens estáticas. Geralmente SVG/Inkscape.test
console
Em um módulo, o Gradle sobreporá recursos common
ao construir um WAR. Em uma sobreposição, os arquivos existentes não são substituídos, portanto, você pode definir um arquivo com o mesmo nome para substituir o comportamento que seria definido na sobreposição.
common/.../WEB-INF
-> WEB-INF
- padrão applicationContext.xml
e algumas inclusões que podem ser substituídasweb/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
- substitui o vazio padrão do comum Disponível aqui: Documentação do desenvolvedor