這是 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
- 覆蓋通用的預設空值此處提供:開發者文檔