これは、多数のモジュールを含むウォリック大学の学生管理システムである Tabula です。内部 JIRA プロジェクトがあります。
現在、Tabula にあるモジュールは次のとおりです。
Tabula をローカルに構築してデプロイするためにdocker-compose
とともに使用できる Docker セットアップを提供します。
依存関係を解決すると、mvn.elab.warwick.ac.uk からソースとバイナリにアクセスできるようになります。 IDE (IntelliJ IDEA をお勧めします) を使用している場合は、コード補完と完全にオープンソース化されていない依存関係の元のソースを取得できることを意味します。
gradle ラッパーは war をビルドできるようになりました。ルート ディレクトリから./gradlew war
を実行すると、 api/build/libs/api.war
とweb/build/libs/ROOT.war
がビルドされるはずです。
macOS の注意: macOS の標準のhead
docker/init.sh
と互換性がない可能性があります。Homebrew からghead
取得し、実行前にスクリプト内のインスタンスを置き換えることをお勧めします。
まず、 docker/init.sh
を実行します (つまり、docker ディレクトリにcd
するのではなく、プロジェクトのルートから実行します)。これにより、次の 3 つの質問が表示されます。
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 に移動する必要があります (注: これには、ログインしているユーザーが Web グループ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 DataSource のみ) が含まれます。エンティティ XML インクルードを使用して、これらを別のファイルに含めることができます。
サンプルcontext.xml
といくつかのサンプル データソースがconfig/servers/augustus/conf
にあります。
conf/server.xml
どのポートにバインドするかを含む、サーバーの実行方法に関する説明。これはかなり標準的です。
サンプルのserver.xml
はconfig/servers/augustus/conf
にあります。
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 設定のふざけ方。 SSO が機能するには、この構成を Web サインオンに追加する必要があります。 <trustedapps />
セクションが含まれていることを確認してください。そうでない場合は、bouncycastle 暗号ライブラリの 1 つからの 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
という 2 つの環境変数を設定する必要があります。 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 vhost をセットアップします。完全な Tabula 開発にはrewrites.inc
を使用します。
SSO には HTTPS 仮想ホストが必要なので、仮想ホストを 1 つだけ設定する場合は、HTTPS 仮想ホストを使用する必要があります。インクルード ファイルはマップを参照して使用するポートを取得するため、次のような 3 行でマップを定義する必要がある場合があります。
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
受け取った場合は、インデックスの 1 つが期限切れであることを意味します。その場所を見つけます ( 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 はこれらを Freemarker ビューなどの WEB-INF コンテンツとともに war に同期します。
その他の便利な Gradle コマンドは次のとおりです。
./gradlew test deployToTomcat
- デプロイ中にテストも実行します (デフォルトではテストは実行されません)./gradlew web:deployToTomcat
- 単一のモジュールをデプロイしますが、モジュールの依存関係を共通のものにします (削除しない限り、Tomcat は古い war をデプロイし続けることに注意してください)。./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
- オブジェクト ストレージまたはデータベースのtabula.properties
で使用する Base64 でエンコードされた暗号化キーを出力します。web
モジュールには、デプロイメントの一部として Webpack を使用してアセットを構築するためのnpm run build
への呼び出しが含まれています。これを手動で実行して、新しい静的コンテンツを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
- 表モジュールsrc
main
scala
- Scala ソース ファイルjava
- Java ソース ファイルresources
- アプリのクラスパスで使用できる非コード ファイルassets
- WAR に追加される前に Webpack によってアセット処理される JS/CSS ファイルなど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
- 共通のデフォルトの空のものをオーバーライドします。 ここから入手可能:開発者ドキュメント