هذا هو تابولا، نظام إدارة الطلاب بجامعة وارويك والذي يتضمن عددًا من الوحدات. لديها مشروع JIRA داخلي.
حاليا، الوحدات الموجودة في تابولا هي:
نحن نوفر إعداد 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
- ستحصل عليه عندما تقوم بالتسجيل للحصول على معرف موفر تسجيل الدخول الموحد (SSO) مع فريق ويب 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 (لاحظ أن هذا يتطلب أن يكون المستخدم الذي قام بتسجيل الدخول عضوًا في WebGroup in-tabula-local-dev-sysadmins
، ويمكنك تعديله docker/data/tomcat/lib/tabula.properties
الذي تم إنشاؤه لاستخدام مجموعة مختلفة).
يمكن إنشاء مجموعات الويب في نظام WebGroups بواسطة الموظفين، أو يمكنك استخدام مجموعة موجودة مثل 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 DataSources. يمكنك استخدام الكيان الذي يتضمنه XML لوضعها في ملفات منفصلة.
يوجد نموذج context.xml
وبعض نماذج مصادر البيانات في config/servers/augustus/conf
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
تكوين تسجيل العودة سيكون البديل هو تجميع هذا مع WARs، لكن هذا لن يسمح لنا بتغيير التكوين لكل خادم.
lib/tabula.properties
الخصائص التي تم تمريرها إلى التطبيق. يمكنك الحصول على واحدة منها من اختبار الجدولة ومن ثم تخصيصها.
لا تستخدم المفاتيح من tabula-test أو أي مثيل آخر فحسب، بل قم بإنشاء مفاتيح جديدة لمثيلك المحلي عن طريق تشغيل ./gradlew generateEncryptionKey
واستخدام ذلك لـ objectstore.encryptionKey
و turnitin.tca.signingSecret
و tabula.database.encryptionKey
.
lib/tabula-sso-config.xml
خدعة تكوين SSO المعتادة. ستحتاج إلى إضافة هذا التكوين إلى Web Sign-on حتى يعمل الدخول الموحد (SSO). تأكد من أنه يتضمن قسم <trustedapps />
وإلا ستشاهد NPEs من إحدى مكتبات التشفير bouncycastle. تأكد أيضًا من تطابق مصدر بيانات المجموعة مع العينة - فقد لا تتطابق التكوينات الأقدم، مما سيؤدي إلى حدوث استثناءات لم يتم العثور على مصدر البيانات .
لسوء الحظ، الطريقة الوحيدة لتشغيل هذا على Tomcat هي تثبيت ActiveMQ محليًا.
قم بتثبيت ActiveMQ من مستودع الحزمة وأضف تكوينًا جديدًا باسم الوسيط Tabula.
حزمة 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"
. أعد تشغيل 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: 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، على الأقل، قد تحتاج إلى إعادة التشغيل لتنظيف بيئتك بعد تبديل JDKs. هذا أمر سيئ، إذا كان بإمكان أي شخص تحسينه، فسيكون ذلك رائعًا.
أضف webupd8team PPA إذا لم تكن قد قمت بالفعل بما يلي:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
قم بتعيين Java 8 باعتباره JDK الافتراضي: sudo apt-get install oracle-java8-set-default
ستحتاج إلى تعيين متغيري بيئة، CATALINA_HOME
و CATALINA_BASE
عند بدء تشغيل Tomcat. 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 vhost الذي يشير إلى ملفات التضمين في config/servers/common/vhosts
- استخدم rewrites.inc
لتطوير Tabula بالكامل.
أنت بحاجة إلى HTTPS vhost للدخول الموحّد (SSO)، لذا إذا كنت ستقوم بإعداد مضيف vhost واحد فقط، فيجب أن يكون 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
- إجراء اختبارات الخيار (ضد tabula-test.warwick.ac.uk)./gradlew cucumber -Dserver.environment=production
- إجراء اختبارات الخيار مقابل الإنتاج./gradlew cucumber -Dfeature.name=gzip
- تشغيل سيناريوهات الخيار لميزة واحدة./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
- ملفات مصدر سكالاjava
- ملفات مصدر جافاresources
- الملفات غير البرمجية التي ستكون متاحة في مسار فئة التطبيقassets
- ملفات JS/CSS وما إلى ذلك لتتم معالجتها بواسطة حزمة الويب قبل إضافتها إلى WARwebapp
- الملفات الأخرى غير البرمجية التي تشكل الحرب.artwork
- الرسومات المصدر غير مضمنة في التطبيق، ولكنها تستخدم لإنشاء صور ثابتة. عادةً ما يكون بتنسيق SVG/إنكسكيب.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
- يتجاوز العنصر الفارغ الافتراضي من المشترك متاح هنا: وثائق المطور