Это Tabula, система управления студентами Университета Уорика, включающая ряд модулей. У него есть внутренний проект JIRA.
На данный момент в Tabula есть следующие модули:
Мы предоставляем настройку Docker, которую можно использовать с docker-compose
для локальной сборки и развертывания Tabula.
У вас должна быть возможность доступа к исходному коду и двоичным файлам с сайта mvn.elab.warwick.ac.uk при разрешении зависимостей. Если вы используете IDE (мы рекомендуем IntelliJ IDEA), это должно означать, что вы получите автодополнение кода и исходный источник зависимостей, которые не были полностью открыты.
Обертка gradle теперь должна иметь возможность создавать войны. Если вы запустите ./gradlew war
из корневого каталога, она должна построить api/build/libs/api.war
и web/build/libs/ROOT.war
.
Примечание для macOS . Стандартный head
в macOS может быть несовместим с docker/init.sh
. Возможно, вы захотите получить ghead
из Homebrew и заменить экземпляры в скрипте перед запуском.
Сначала запустите docker/init.sh
(т. е. запустите его из корня проекта, а не заходите с cd
в каталог docker). Это задаст вам три вопроса:
urn:localdev.warwick.ac.uk:tabula:service
— вы получите его, когда зарегистрируетесь для получения идентификатора поставщика единого входа в веб-группе ITS). При этом создаются необходимые файлы свойств для запуска Tabula в docker/data
. Вам не нужно снова запускать docker/init.sh
за исключением случаев, когда были изменены необходимые свойства; если вы просто меняете файлы свойств, вы можете просто изменить эти файлы напрямую, не создавая их заново.
Теперь вы можете запустить контейнеры Docker с помощью sudo docker-compose up --build
(опять же, --build
вам понадобится только после внесения изменений в конфигурацию). После этого все заработает, и вы должны получить код 404 для https://localdev.warwick.ac.uk/ (и базовый запрос аутентификации 401 для http://localdev.warwick.ac.uk:8080/manager).
Теперь вы можете развернуть приложение с помощью ./gradlew cargoDeployRemote
, который подключится к приложению Manager на Tomcat и развернет приложение там. Если вы внесли изменения и хотите выполнить повторное развертывание, не начиная с нуля, вы можете запустить ./gradlew cargoRedeployRemote
; Если вы используете JRebel и правильно настроили его на удаленном сервере, вы сможете вносить изменения в реальном времени без повторного развертывания.
После запуска приложения оно выдаст некоторые ошибки, которые ожидаются при отсутствии данных ни в базе данных, ни в Elasticsearch. Вам нужно будет перейти на https://localdev.warwick.ac.uk/sysadmin (обратите внимание: для этого необходимо, чтобы ваш вошедший в систему пользователь был членом веб-группы in-tabula-local-dev-sysadmins
, вы можете редактировать созданный docker/data/tomcat/lib/tabula.properties
для использования другой группы).
Веб-группы могут создаваться в системе веб-групп сотрудниками, или вы можете использовать существующую группу, например all-staff
чтобы разрешить любому сотруднику университета (например).
Установите три поля «Перестроить индекс событий аудита из», «Перестроить индекс профилей из» и «Перестроить индекс потока уведомлений из», чтобы в них была указана дата, и нажмите «Индекс». Это должно завершиться немедленно, поскольку никакие данные не будут индексироваться, но будет создана структура индекса в Elasticsearch.
Затем запустите импорт в правом верхнем углу:
Как указано tabula.properties
, это экземпляр песочницы, он завершится быстро и с полностью поддельными данными.
Затем вы можете перейти к «Списку отделов в системе», щелкнуть отдел и «Просмотреть администраторов отдела», чтобы предоставить разрешения. Включение режима Бога позволит вашему пользователю обходить проверки разрешений и добавлять обычные разрешения.
Установите последнюю версию Tomcat 8.5 отсюда: http://tomcat.apache.org/download-80.cgi. В Unix имеет смысл просто извлечь Tomcat в /opt
, а затем создать символическую ссылку на него в /usr/local/tomcat-8
или где удобно. Затем вы можете обновить Tomcat, не нарушая никакой конфигурации, просто изменив эту символическую ссылку.
Создайте новый базовый каталог для конфигурации и развертывания Tabula, например /var/tomcat/instances/tabula
. Структура и содержимое этого каталога должны быть следующими:
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/
Возможно, вам будет полезно создать символическую ссылку /usr/local/tomcat-8/instances
на /var/tomcat/instances
если вам нравятся макеты в стиле Jboss.
Содержимое этих файлов следующее:
bin/setenv.sh
Это сценарий, который запускается для установки переменных среды для работающего экземпляра. Вероятно, вы захотите использовать его для настройки управления памятью, JRebel, отладки и т. д.
Пример файла можно найти в config/servers/augustus/bin
conf/context.xml
Он содержит ресурсы, которые должны быть включены в сервер — в данном случае только источники данных JNDI. Вы можете использовать XML-объекты, чтобы хранить их в отдельных файлах.
В файле config/servers/augustus/conf
есть образец context.xml
и несколько примеров источников данных.
conf/server.xml
Инструкции по запуску сервера, в том числе к каким портам привязываться. Это во многом стандартно.
Образец файла server.xml
находится в config/servers/augustus/conf
conf/web.xml
Это просто скопировано из каталога conf
установки Tomcat 8. Я не смог запустить Tomcat без его копирования, и это немного отстой.
lib/warwick-logging-1.1.jar
Вы можете получить это по адресу https://pkg.elab.warwick.ac.uk/ch.qos.logback/warwick-logging-1.1-all.jar.
Обратите внимание, что эта зависимость заменяет предыдущие зависимости от logback, logstash-logback-encoder, jackson и slf4j-api.
lib/jtds-1.3.1.jar
Вы можете получить это по адресу https://pkg.elab.warwick.ac.uk/net.sourceforge.jtds/jtds-1.3.1.jar.
lib/ojdbc8.jar
Вы можете получить это по адресу https://pkg.elab.warwick.ac.uk/oracle.com/ojdbc8.jar.
lib/postgresql-42.2.5.jar
Вы можете получить это по адресу http://central.maven.org/maven2/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar.
lib/logback.xml
Конфигурация журнала. Альтернативой было бы объединить это с WAR, но это не позволило бы нам изменять конфигурацию для каждого сервера.
lib/tabula.properties
Свойства, переданные в приложение. Вы можете получить один из них из теста-таблицы, а затем персонализировать его.
Не просто используйте ключи из tabula-test или любого другого экземпляра, сгенерируйте новые для своего локального экземпляра, запустив ./gradlew generateEncryptionKey
и используя его для objectstore.encryptionKey
, turnitin.tca.signingSecret
и tabula.database.encryptionKey
.
lib/tabula-sso-config.xml
Обычная болтовня о настройке SSO. Вам нужно будет добавить эту конфигурацию в веб-вход, чтобы SSO работал. Убедитесь, что он включает раздел <trustedapps />
, иначе вы увидите NPE из одной из криптобиблиотек надувного замка. Кроме того, убедитесь, что источник данных кластера соответствует образцу — старые конфигурации могут не совпадать, что приведет к возникновению исключений «источник данных не найден» .
К сожалению, единственный способ заставить это работать на Tomcat — установить ActiveMQ локально.
Установите ActiveMQ из репозитория пакетов и добавьте новую конфигурацию с именем брокера Tabula.
Пакет ActiveMQ в репозитории utopic полностью сломан, поэтому мы воспользуемся внешним репозиторием, чтобы получить последнюю версию.
sudo apt-add-repository 'deb http://dl.bintray.com/jmkgreen/deb /'
sudo apt-get update
sudo apt-get install activemq
Игнорируйте предупреждение о неаутентифицированных пакетах. После завершения отредактируйте /etc/activemq/activemq.xml
и найдите место, где brokerName="localhost"
— измените его brokerName="tabula"
. Перезапустите ActiveMQ с помощью sudo service activemq restart
.
Установите в tabula.properties
следующее:
activemq.broker=tcp://localhost:61616
Чтобы запустить это локально, у вас есть несколько вариантов:
Для Убунту:
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
Вам нужно будет отредактировать /etc/elasticsearch/elasticsearch.yml
, чтобы установитьcluster.name cluster.name: tabula
(или установить elasticsearch.cluster.name=elasticsearch
в tabula.properties
.
Когда я запускал его локально, он не запускался при загрузке по умолчанию, но я мог запустить его с помощью sudo systemctl start elasticsearch
. Запустите sudo systemctl enable elasticsearch
, чтобы он запускался при загрузке.
Установите следующие свойства в 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
Обязательно измените свой elasticsearch.index.prefix
, иначе вы можете перезаписать чужой индекс. Если у вас возникнут проблемы с брандмауэром, кричите #devops
Примечание. По крайней мере, в Ubuntu вам может потребоваться перезагрузка, чтобы очистить среду после переключения JDK. Это отстой, если кто-то сможет это улучшить, это будет здорово.
Добавьте PPA webupd8team, если вы еще этого не сделали:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
Установите Java 8 в качестве JDK по умолчанию: sudo apt-get install oracle-java8-set-default
При запуске Tomcat вам нужно будет установить две переменные среды: CATALINA_HOME
и CATALINA_BASE
. CATALINA_HOME
— это каталог, в котором установлен Tomcat, а CATALINA_BASE
— это каталог, в котором находятся ваши файлы конфигурации, указанные выше.
Затем вы можете использовать $CATALINA_HOME/bin/catalina.sh
чтобы запустить сервер на переднем плане, или startup.sh
, чтобы запустить его в фоновом режиме.
Примером сценария запуска Tabula может быть:
#!/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 $@
Настройте виртуальный хост Apache, ссылаясь на включаемые файлы в config/servers/common/vhosts
— используйте rewrites.inc
для полной разработки Tabula.
Для единого входа вам понадобится виртуальный хост HTTPS, поэтому, если вы собираетесь настроить только один виртуальный хост, это должен быть HTTPS. Включаемые файлы ссылаются на карту, чтобы получить используемый порт, поэтому вам может потребоваться определить свой порт с помощью трех строк, например:
RewriteMap api txt:/etc/apache2/tabulaport.txt
RewriteMap proxy txt:/etc/apache2/tabulaport.txt
RewriteMap scheduler txt:/etc/apache2/tabulaport.txt
Приведенная выше строка должна указывать на файл, содержащий эту строку (при условии, что порт Tomcat по умолчанию 8080):
port 8080
Скопируйте gradle-local-example.properties
как gradle-local.properties
и отредактируйте там свойства в соответствии с вашей системой. gradle-local.properties
будет игнорироваться Git.
При обновлении с более старой версии Tabula не забудьте применить последние миграции базы данных из config/scripts/schema
. Если вы получаете исключение IllegalStateException
от Lucene, это означает, что один из ваших индексов устарел. Найдите его местоположение (найдите в tabula.properties
файл base.data.dir
и загляните в index
каталог). Удалите соответствующий индекс (например, rm -fr BASE_DATA_DIR/index/notifications
) и перестройте его из /sysadmin в приложении.
Запустите ./gradlew deployToTomcat
, чтобы собрать приложение, и скопируйте развернутый WAR-файл в расположение, указанное в файле свойств.
Gradle инициализирует цинковый сервер для выполнения инкрементальной компиляции, но это длится только в течение того времени, пока работает демон Gradle — это делает его довольно неэффективным для выполнения большого количества компиляций (к счастью, скорость компиляции довольно хорошая, даже для Scala).
Результаты модульного теста Gradle передаются в HTML-файл, что довольно хорошо, поэтому вы, вероятно, не захотите тратить слишком много времени, пытаясь сделать вывод консоли более подробным.
Если вы запустите npm run watch
из web
папки на вкладке, это будет постоянно создавать ресурсы, а JRebel затем синхронизирует их с войной вместе с содержимым WEB-INF, таким как представления Freemarker.
Некоторые другие полезные команды Gradle:
./gradlew test deployToTomcat
— также запускать тесты во время развертывания (по умолчанию тесты не запускаются)./gradlew web:deployToTomcat
— разверните один модуль, но сделайте зависимости модулей общими (помните, что Tomcat все равно будет развертывать старые войны, если вы их не удалите!)./gradlew test
— запуск тестов, показывающий трассировку стека ошибок в консоли и правильный вывод в HTML-файл../gradlew web:test --tests *.ApplicationTest
— запустить определенный тест./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk
— запустить функциональные тесты (сначала запустите экземпляр Tomcat)./gradlew -PintegrationTest test -Dtoplevel.url=https://yourhost.warwick.ac.uk --tests *.CourseworkModuleManagerTest
— запустить определенный функциональный тест./gradlew cucumber
— запустить тесты Cucumber (против tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
— запустить тесты Cucumber на производстве./gradlew cucumber -Dfeature.name=gzip
— запускать сценарии Cucumber для одной функции./gradlew --continuous
— непрерывно компилировать исходные коды по мере их сохранения в вашей IDE../gradlew test --continuous
— непрерывно компилировать исходные коды и запускать тесты по мере их сохранения в вашей IDE (тесты запускаются только в том случае, если они пройдены)./gradlew web:test --tests *.ApplicationTest --continuous
— непрерывно компилировать и запускать один тест./gradlew generateEncryptionKey
— распечатать ключ шифрования в кодировке Base64 для использования в tabula.properties
для хранилища объектов или базы данных. web
модуль содержит вызов npm run build
для создания ресурсов с помощью Webpack в рамках развертывания. Вы можете запустить это вручную, чтобы создать новый статический контент в build/rootContent
(который отслеживается на наличие изменений JRebel).
Если вы вообще не хотите связываться с веб-пакетом, вы можете вызвать ./gradlew webpack
чтобы пересобрать ресурсы.
Другие полезные команды npm
:
npm run build
— построить все производственные активы и выйтиnpm run dev
— собрать ресурсы для разработки и выйтиnpm run watch
— следите за изменениями в файлах и перестраивайте ресурсы разработки. На данный момент у нас все еще есть много JS-библиотек в src/main/assets/static/libs/
— их следует постепенно заменить на правильное управление зависимостями в package.json
(мы уже делаем это для ID7). Если вам нужно обновить ID7, измените номер версии в package.json
и запустите npm install
(сборка сделает это автоматически).
config
servers
common
— материал, который большинство серверов используют для конфигурации Apache и т. д.scripts
schema
— сценарии миграции SQL для любых изменений схемы базы данных.api|common|web
— модули таблицыsrc
main
scala
— исходные файлы Scalajava
— исходные файлы Javaresources
— файлы без кода, которые будут доступны в пути к классам приложения.assets
— файлы JS/CSS и т. д., которые будут обработаны веб-пакетом перед добавлением в WAR.webapp
— другие некодовые файлы, составляющие WAR.artwork
— исходная графика, не включенная в приложение, но используемая для создания статических изображений. Обычно SVG/Inkscape.test
console
В модуле Gradle будет накладывать common
ресурсы при создании WAR. В наложении существующие файлы не перезаписываются, поэтому вы можете определить файл с тем же именем, чтобы переопределить поведение, определенное в наложении.
common/.../WEB-INF
-> WEB-INF
— applicationContext.xml
по умолчанию и некоторые включения, которые можно переопределитьweb/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
— переопределяет пустой по умолчанию из общего Доступно здесь: Документация разработчика.