이것은 여러 모듈을 포함하는 University of Warwick의 학생 관리 시스템인 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
하는 대신 프로젝트 루트에서 실행합니다). 그러면 다음 세 가지 질문이 표시됩니다.
urn:localdev.warwick.ac.uk:tabula:service
비워 두세요. ITS 웹 팀에 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 기본 인증 프롬프트)가 표시됩니다.
이제 Tomcat의 Manager 애플리케이션에 연결하고 거기에 애플리케이션을 배포하는 ./gradlew cargoDeployRemote
를 사용하여 애플리케이션을 배포할 수 있습니다. 변경하고 처음부터 시작하지 않고 다시 배포하려면 ./gradlew cargoRedeployRemote
실행할 수 있습니다. JRebel을 사용하고 원격 서버에 올바르게 설정했다면 재배포 없이 실시간으로 변경 사항을 적용할 수 있습니다.
애플리케이션을 실행하면 데이터베이스나 Elasticsearch에 데이터가 없을 때 예상되는 몇 가지 오류가 발생합니다. https://localdev.warwick.ac.uk/sysadmin으로 이동해야 합니다. (참고: 로그인한 사용자가 in-tabula-local-dev-sysadmins
WebGroup의 구성원이어야 합니다. 편집할 수 있습니다. 다른 그룹을 사용하려면 생성된 docker/data/tomcat/lib/tabula.properties
)
WebGroups는 교직원이 WebGroups 시스템에서 생성할 수 있습니다. 또는 all-staff
와 같은 기존 그룹을 사용하여 대학의 모든 교직원을 허용할 수 있습니다(예:).
"다음에서 감사 이벤트 인덱스 다시 작성", "다음에서 프로필 인덱스 다시 작성" 및 "다음에서 알림 스트림 인덱스 다시 작성"에 대한 3개의 상자를 클릭하여 날짜가 채워지도록 하고 "색인"을 클릭합니다. 데이터가 색인화되지 않으므로 이 작업은 즉시 완료되어야 하지만 Elasticsearch에 색인 구조가 생성됩니다.
다음으로 오른쪽 상단에서 Imports를 시작합니다.
tabula.properties
에서는 이것이 샌드박스 인스턴스라고 지정하므로 완전히 가짜 데이터로 신속하게 완료됩니다.
그런 다음 "시스템의 부서 나열"로 이동하여 부서를 클릭하고 "부서 관리자 보기"를 클릭하여 권한을 부여할 수 있습니다. God 모드를 활성화하면 사용자가 권한 확인을 우회하고 일반 권한을 추가할 수 있습니다.
여기에서 최신 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 구성 헛소리입니다. 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
이를 로컬로 실행하려면 다음과 같은 몇 가지 옵션이 있습니다.
우분투의 경우:
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 가상 호스트를 설정하십시오. 전체 Tabula 개발을 위해서는 rewrites.inc
사용하십시오.
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은 증분 컴파일을 수행하기 위해 아연 서버를 초기화하지만 Gradle 데몬이 실행되는 기간 동안만 지속됩니다. 이로 인해 많은 컴파일을 수행하는 데 꽤 비효율적입니다(다행히도 컴파일 속도는 Scala의 경우에도 꽤 좋습니다).
Gradle 단위 테스트 결과는 꽤 좋은 HTML 파일로 이동하므로 콘솔 출력을 더 장황하게 만드는 데 너무 오랜 시간을 소비하고 싶지 않을 것입니다.
탭의 web
폴더 내부에서 npm run watch
실행하면 지속적으로 자산이 구축되고 JRebel은 이를 Freemarker 보기와 같은 WEB-INF 콘텐츠와 함께 전쟁에 동기화합니다.
기타 유용한 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
- 오이 테스트 실행(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
- 객체 스토리지 또는 데이터베이스용 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
- Tabula 모듈src
main
scala
- 스칼라 소스 파일java
- Java 소스 파일resources
- 앱 클래스 경로에서 사용할 수 있는 비코드 파일assets
- JS/CSS 파일 등이 WAR에 추가되기 전에 webpack에 의해 자산 처리됩니다.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
- 공통의 기본 빈 항목을 재정의합니다. 여기에서 확인 가능: 개발자 문서