这是 Tabula,华威大学的学生管理系统,包括许多模块。它有一个内部 JIRA 项目。
目前,Tabula 中的模块有:
我们提供了一个 Docker 设置,可以与docker-compose
一起使用来在本地构建和部署 Tabula。
解决依赖关系时,您应该能够从 mvn.elab.warwick.ac.uk 访问源代码和二进制文件。如果您使用 IDE(我们推荐 IntelliJ IDEA),这应该意味着您将获得代码完成和尚未完全开源的依赖项的原始来源。
gradle 包装器现在应该能够构建 wars,如果您从根目录运行./gradlew war
它应该构建api/build/libs/api.war
和web/build/libs/ROOT.war
。
macOS 注意:macOS 上的标准head
可能与docker/init.sh
不兼容,您可能需要从 Homebrew 获取ghead
并在运行之前替换脚本中的实例。
首先,运行docker/init.sh
(即从项目的根目录运行它,而不是cd
进入 docker 目录)。这会问你三个问题:
urn:localdev.warwick.ac.uk:tabula:service
留空 - 当您向 ITS Web 团队注册 SSO 提供商 ID 时,您将获得此信息)。这会生成在docker/data
中运行 Tabula 所需的属性文件。除非所需的属性发生更改,否则您不需要再次运行docker/init.sh
;如果您只是更改属性文件,则可以直接更改这些文件而无需重新生成它们。
现在,您可以使用sudo docker-compose up --build
启动 Docker 容器(同样,只有在进行配置更改时才需要--build
)。这将使一切运行起来,您应该得到 https://localdev.warwick.ac.uk/ 的 404(以及 http://localdev.warwick.ac.uk:8080/manager 的 401 基本身份验证提示)。
现在,您可以使用./gradlew cargoDeployRemote
部署应用程序,它将连接到 Tomcat 上的 Manager 应用程序并在那里部署应用程序。如果您进行更改并希望重新部署而不从头开始,您可以运行./gradlew cargoRedeployRemote
;如果您使用 JRebel 并且已正确设置远程服务器,您应该能够在不重新部署的情况下进行更改。
应用程序运行后,当数据库或 Elasticsearch 中没有任何数据时,它会抛出一些预期的错误。您需要访问 https://localdev.warwick.ac.uk/sysadmin (注意,这要求您登录的用户是 WebGroup in-tabula-local-dev-sysadmins
的成员,您可以编辑生成的docker/data/tomcat/lib/tabula.properties
以使用不同的组)。
WebGroups 可以由员工在 WebGroups 系统中创建,或者您可以使用现有组(例如all-staff
来允许大学中的任何员工(例如)。
单击“重建审核事件索引自”、“重建配置文件索引自”和“重建通知流索引自”的 3 个框,以便填充日期,然后单击“索引”。这应该立即完成,因为不会对任何数据建立索引,但它将在 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/
如果您对 Jboss 风格的布局感到满意,您可能会发现将/usr/local/tomcat-8/instances
符号链接到/var/tomcat/instances
很有用。
这些文件的内容如下:
bin/setenv.sh
这是一个运行脚本来为正在运行的实例设置环境变量。您可能想用它来设置内存管理、JRebel、调试等。
示例文件可以在config/servers/augustus/bin
中找到
conf/context.xml
它包含要包含在服务器中的资源 - 在本例中,只是 JNDI 数据源。您可以使用实体 XML 包含将它们放在单独的文件中。
config/servers/augustus/conf
中有一个示例context.xml
和一些示例数据源
conf/server.xml
有关如何运行服务器的说明,包括要绑定到哪些端口。这几乎是标准的。
config/servers/augustus/conf
中有一个示例server.xml
conf/web.xml
这只是从 Tomcat 8 安装中的conf
目录复制的。我无法让 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 中获取其中之一,然后对其进行个性化设置。
不要只使用 tabula-test 或任何其他实例中的密钥,通过运行./gradlew generateEncryptionKey
并将其用于objectstore.encryptionKey
、 turnitin.tca.signingSecret
和tabula.database.encryptionKey
来为本地实例生成新密钥。
lib/tabula-sso-config.xml
通常的 SSO 配置废话。您需要将此配置添加到 Web Sign-on 中才能使 SSO 正常工作。确保它包含<trustedapps />
部分,否则您将看到来自 bouncycastle 加密库之一的 NPE。另外,请确保集群数据源与示例匹配 - 较旧的配置可能不匹配,这将导致数据源未找到异常。
不幸的是,在 Tomcat 上实现此功能的唯一方法是在本地安装 ActiveMQ。
从软件包存储库安装 ActiveMQ 并添加代理名为 Tabula 的新配置。
utopic 存储库中的 ActiveMQ 包已完全损坏,因此我们将使用外部存储库来获取最新版本。
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"
。使用sudo service activemq restart
重新启动 ActiveMQ。
在tabula.properties
中设置以下内容:
activemq.broker=tcp://localhost:61616
要在本地运行此程序,您有以下几种选择:
对于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
您需要编辑/etc/elasticsearch/elasticsearch.yml
来设置cluster.name: tabula
(或在tabula.properties
中设置elasticsearch.cluster.name=elasticsearch
。
当我在本地运行它时,默认情况下它不会在启动时启动,但我可以使用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 后您可能需要重新启动以清理环境。这很糟糕,如果有人能改进它,那就太好了。
添加 webupd8team PPA(如果尚未添加):
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 $@
设置引用config/servers/common/vhosts
中的包含文件的 Apache 虚拟主机 - 使用rewrites.inc
进行完整的 Tabula 开发。
您需要一个用于 SSO 的 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
应用最近的数据库迁移。如果您从 Lucene 收到IllegalStateException
,则意味着您的索引之一已过期。找到它的位置(在tabula.properties
中查找base.data.dir
并在index
目录中查找)。删除相关索引(例如rm -fr BASE_DATA_DIR/index/notifications
),然后从应用程序内的 /sysadmin 重建它。
运行./gradlew deployToTomcat
来构建应用程序并将分解的 WAR 复制到您在属性文件中指定的位置。
Gradle 将初始化一个 zinc 服务器来进行增量编译,但这仅持续 Gradle 守护进程运行的持续时间 - 这使得它在进行大量编译时效率非常低(幸运的是,编译速度相当不错,即使对于 Scala 也是如此)。
Gradle 单元测试结果会保存到 HTML 文件中,这非常好,因此您可能不想花费太长时间来尝试使控制台输出更详细。
如果您从选项卡中的web
文件夹内运行npm run watch
,这将不断构建资产,然后 JRebel 会将它们与 WEB-INF 内容(例如 Freemarker 视图)同步到 war。
其他一些有用的 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 监视更改)。
如果你根本不想搞乱 webpack,你可以调用./gradlew webpack
来重建资源。
其他有用的npm
命令:
npm run build
- 构建所有生产资产并退出npm run dev
- 构建用于开发和退出的资产npm run watch
- 监视文件的更改并重新构建开发资产目前,我们在src/main/assets/static/libs/
中仍然有很多 JS 库 - 这些库应该逐渐被package.json
中适当的依赖管理所取代(我们已经为 ID7 做到了这一点)。如果需要更新 ID7,请更改package.json
中的版本号并运行npm install
(构建会自动执行此操作)。
config
servers
common
- 大多数服务器用于 Apache 配置等的东西。scripts
schema
- 用于任何数据库架构更改的 SQL 迁移脚本。api|common|web
- Tabula 模块src
main
scala
- Scala 源文件java
- Java 源文件resources
- 将在应用程序类路径中可用的非代码文件assets
- JS/CSS 文件等,在添加到 WAR 之前由 webpack 进行 asset 处理webapp
- 构成 WAR 的其他非代码文件。artwork
- 源图形不包含在应用程序中,但用于生成静态图像。通常是 SVG/Inkscape。test
console
在模块中,Gradle 在构建 WAR 时将覆盖common
资源。在覆盖中,存在的文件不会被覆盖,因此您可以定义具有相同名称的文件来覆盖将在覆盖中定义的行为。
common/.../WEB-INF
-> WEB-INF
- 默认applicationContext.xml
和一些可以覆盖的包含web/.../WEB-INF/spring-component-scan-context.xml
-> WEB-INF/spring-component-scan-context.xml
- 覆盖通用的默认空值此处提供:开发者文档