Skip to content

Commit

Permalink
Merge pull request 'release_1.1.4' (#8) from release_1.1.4 into master
Browse files Browse the repository at this point in the history
  • Loading branch information
Dominick Leppich committed Oct 24, 2024
2 parents ab87956 + e099d09 commit 992ad5d
Show file tree
Hide file tree
Showing 54 changed files with 831 additions and 426 deletions.
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM eclipse-temurin:17-jre

ENV VOCABULARY_DB_SERVER vocabulary-db
ENV VOCABULARY_DB_USER vocabulary
ENV VOCABULARY_DB_PASSWORD vocabulary
ENV VOCABULARY_DB_DATABASE vocabulary
ENV VOCABULARY_SERVER_TOKEN secret
ENV VOCABULARY_SERVER_PORT 8081

RUN mkdir -p /opt/digiverso/vocabulary
COPY module-core/target/vocabulary-server-core.jar /opt/digiverso/vocabulary/
COPY module-core/src/main/resources/application.properties /opt/digiverso/vocabulary/
RUN sed -re "s|^(server.port=).*|\1${VOCABULARY_SERVER_PORT}|" \
-e "s|^#?(security.token=).*|\1${VOCABULARY_SERVER_TOKEN}|" \
-e "s|^(spring.datasource.username=).*|\1${VOCABULARY_DB_USER}|" \
-e "s|^(spring.datasource.password=).*|\1${VOCABULARY_DB_PASSWORD}|" \
-e "s|^(spring.datasource.url=).*|\1jdbc:mariadb://$VOCABULARY_DB_SERVER:3306/${VOCABULARY_DB_DATABASE}|" \
-i /opt/digiverso/vocabulary/application.properties

EXPOSE $VOCABULARY_SERVER_PORT
WORKDIR /opt/digiverso/vocabulary
CMD [ "java", "-jar", "vocabulary-server-core.jar"]
122 changes: 90 additions & 32 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,23 @@
def latestTag = ''
pipeline {

agent {
docker {
/* using a custom build image with a defined home directory for UID 1000 among other things */
image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
registryUrl 'https://nexus.intranda.com:4443'
registryCredentialsId 'jenkins-docker'
args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
agent none

options {
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '15', daysToKeepStr: '90', numToKeepStr: '')
disableConcurrentBuilds()
}

stages {
stage('prepare') {
steps {
sh 'git reset --hard HEAD && git clean -fdx'
}
}
stage('build-snapshot') {
agent {
docker {
/* using a custom build image with a defined home directory for UID 1000 among other things */
image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
registryUrl 'https://nexus.intranda.com:4443'
registryCredentialsId 'jenkins-docker'
args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
when {
not {
anyOf {
Expand All @@ -36,10 +32,34 @@ pipeline {
}
}
steps {
sh 'git reset --hard HEAD && git clean -fdx'
sh 'mvn clean verify -U -P snapshot-build'
junit "**/target/surefire-reports/*.xml"
step([
$class : 'JacocoPublisher',
execPattern : '**/target/jacoco.exec',
classPattern : '**/target/classes/',
sourcePattern : 'src/main/java',
exclusionPattern : '**/*Test.class'
])
recordIssues (
enabledForFailure: true, aggregatingResults: false,
tools: [checkStyle(pattern: '**/target/checkstyle-result.xml', reportEncoding: 'UTF-8')]
)
archiveArtifacts artifacts: 'module-*/target/*.jar, install/*, module-core/src/main/resources/application.properties, migration/**', fingerprint: true
stash includes: '**/target/*', name: 'target'
}
}
stage('build-release') {
agent {
docker {
/* using a custom build image with a defined home directory for UID 1000 among other things */
image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
registryUrl 'https://nexus.intranda.com:4443'
registryCredentialsId 'jenkins-docker'
args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
when {
anyOf {
branch 'master'
Expand All @@ -52,7 +72,22 @@ pipeline {
}
}
steps {
sh 'git reset --hard HEAD && git clean -fdx'
sh 'mvn clean verify -U -P release-build'
junit "**/target/surefire-reports/*.xml"
step([
$class : 'JacocoPublisher',
execPattern : '**/target/jacoco.exec',
classPattern : '**/target/classes/',
sourcePattern : 'src/main/java',
exclusionPattern : '**/*Test.class'
])
recordIssues (
enabledForFailure: true, aggregatingResults: false,
tools: [checkStyle(pattern: '**/target/checkstyle-result.xml', reportEncoding: 'UTF-8')]
)
archiveArtifacts artifacts: 'module-*/target/*.jar, install/*, module-core/src/main/resources/application.properties, migration/**', fingerprint: true
stash includes: '**/target/*', name: 'target'
}
}
/*stage('sonarcloud') {
Expand All @@ -75,6 +110,15 @@ pipeline {
}
}*/
stage('deploy') {
agent {
docker {
/* using a custom build image with a defined home directory for UID 1000 among other things */
image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
registryUrl 'https://nexus.intranda.com:4443'
registryCredentialsId 'jenkins-docker'
args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
when {
anyOf {
branch 'master'
Expand All @@ -83,17 +127,28 @@ pipeline {
}
}
steps {
unstash 'target'
sh 'mvn -f module-exchange/pom.xml deploy -U'
}
}
stage('tag release') {
agent {
docker {
/* using a custom build image with a defined home directory for UID 1000 among other things */
image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
registryUrl 'https://nexus.intranda.com:4443'
registryCredentialsId 'jenkins-docker'
args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
when {
anyOf {
branch 'master'
branch 'hotfix_release_*'
}
}
steps {
unstash 'target'
withCredentials([gitUsernamePassword(credentialsId: '93f7e7d3-8f74-4744-a785-518fc4d55314',
gitToolName: 'git-tool')]) {
sh '''#!/bin/bash -xe
Expand All @@ -109,28 +164,31 @@ pipeline {
echo "${projectversion}"
git tag -a "v${projectversion}" -m "releasing v${projectversion}" && git push origin v"${projectversion}"
'''
script {
latestTag = sh(returnStdout: true, script:'git describe --tags --abbrev=0').trim()
}
}
}
}
stage('build and publish production image to GitHub container registry') {
agent any
steps {
unstash 'target'
script {
docker.withRegistry('https://ghcr.io','jenkins-github-container-registry') {
dockerimage_public = docker.build("intranda/goobi-vocabulary-server:${env.BUILD_ID}_${env.GIT_COMMIT}")
if (env.GIT_BRANCH == 'origin/develop' || env.GIT_BRANCH == 'develop') {
dockerimage_public.push("develop")
}
if (!latestTag == '' ) {
dockerimage_public.push(latestTag)
}
}
}
}
}
}
post {
always {
junit "**/target/surefire-reports/*.xml"
step([
$class : 'JacocoPublisher',
execPattern : 'target/jacoco.exec',
classPattern : 'target/classes/',
sourcePattern : 'src/main/java',
exclusionPattern : '**/*Test.class'
])
recordIssues (
enabledForFailure: true, aggregatingResults: false,
tools: [checkStyle(pattern: 'target/checkstyle-result.xml', reportEncoding: 'UTF-8')]
)
}
success {
archiveArtifacts artifacts: 'module-*/target/*.jar, install/*, module-core/src/main/resources/application.properties, migration/**', fingerprint: true
}
changed {
emailext(
subject: '${DEFAULT_SUBJECT}',
Expand Down
2 changes: 1 addition & 1 deletion docs/de/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Dokumentation
Dieses Dokument beschreibt den neuen Vokabularserver. Bis zur Version 24.06 waren Vokabulare Teil von Goobi Workflow und wurden in der Goobi-Datenbank gespeichert. Ab Version 24.07 ist alles, was mit Vokabularen zu tun hat, in eine eigenständige Anwendung, den Vokabularserver, umgezogen. Der Vokabularserver benötigt eine eigene Datenbank, um alle Daten zu speichern, und ermöglicht den Zugriff auf die Vokabulare und Datensätze über eine REST-API. Goobi Workflow wurde aktualisiert, um den neuen Vokabularserver anstelle seiner eigenen, eingebetteten Vokabulare zu verwenden. Falls gewünscht, kann der Vokabularserver öffentlich zugänglich sein. Wenn Sie bereits vorher Vokabulare verwendet haben, lesen Sie bitte die Migrationsanleitung in dieser Dokumentation, um Ihre Daten auf den neuen Vokabularserver zu übertragen.
Dieses Dokument beschreibt den Goobi Vokabularserver. Bis zur Version 24.06 waren Vokabulare Teil von Goobi Workflow und wurden in der Goobi-Datenbank gespeichert. Ab Version 24.07 ist alles, was mit Vokabularen zu tun hat, in eine eigenständige Anwendung, den Vokabularserver, umgezogen. Der Vokabularserver benötigt eine eigene Datenbank, um alle Daten zu speichern, und ermöglicht den Zugriff auf die Vokabulare und Datensätze über eine REST-API. Goobi Workflow wurde aktualisiert, um den neuen Vokabularserver anstelle seiner eigenen, eingebetteten Vokabulare zu verwenden. Falls gewünscht, kann der Vokabularserver öffentlich zugänglich sein. Wenn Sie bereits vorher Vokabulare verwendet haben, lesen Sie bitte die Migrationsanleitung in dieser Dokumentation, um Ihre Daten auf den neuen Vokabularserver zu übertragen.

## Installation
Bevor Sie den Vokabularserver nutzen können, folgen Sie den [Installations Anweisungen](setup.md).
Expand Down
4 changes: 2 additions & 2 deletions docs/de/creation.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Sie müssen den `BASE_PART` auf `localhost:8081/api/v1` setzen, den Hostnamen un
Ändern Sie nur die Teile `API_ENDPOINT` und `DATA`, abhängig von der Art der Abfrage, die Sie durchführen:

```bash
curl -s --location "http://BASE_PART/API_ENDPOINT" --header 'Content-Type: application/json' --data "DATA"
curl -s --location "http://BASE_PART/API_ENDPOINT" --header "Authorization: Bearer TOKEN" --header 'Content-Type: application/json' --data "DATA"
```

Wenn Sie Fehler erhalten, werden die Fehlerinformationen als komplexe JSON-Objekte zurückgegeben.
Expand Down Expand Up @@ -89,7 +89,7 @@ Sie können genau den gleichen Feldtypen auch erreichen, indem Sie dies durch ei

Wenn Sie es versäumt haben, die IDs zu speichern, können Sie den folgenden Befehl aufrufen, um alle vorhandenen Feldtypen mit ihren IDs abzurufen:
```bash
curl -s --location "http://BASE_PART/types" --header 'Content-Type: application/json' | jq '._embedded .fieldTypeList .[] | "\(.id) \(.name)"'
curl -s --location "http://BASE_PART/types" --header "Authorization: Bearer TOKEN" --header 'Content-Type: application/json' | jq '._embedded .fieldTypeList .[] | "\(.id) \(.name)"'
```

*Bitte beachten Sie den fehlenden `--data` Parameter in diesem Aufruf.*
Expand Down
18 changes: 11 additions & 7 deletions docs/de/migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,23 @@ Detaillierte Anweisungen hierzu werden später gegeben.

Wenn Sie keine Feldtypen erstellen wollen, können Sie die Datenmigration mit dem folgenden Befehl starten:
```bash
python vocabulary-migrator.py --vocabulary-server-host localhost --vocabulary-server-port 8081 --goobi-database-host localhost --goobi-database-port 3306 --goobi-database-name goobi --goobi-database-user goobi --goobi-database-password goobi --continue-on-error --fallback-language eng
python vocabulary-migrator.py --vocabulary-server-host localhost --vocabulary-server-port 8081 --vocabulary-server-token TOKEN --goobi-database-host localhost --goobi-database-port 3306 --goobi-database-name goobi --goobi-database-user goobi --goobi-database-password goobi --continue-on-error --fallback-language eng
```

### Skript
Die obigen beiden Puntke, die virtuelle Python-Umgebung und die Migration der Vokabulardaten in einer typischen Installation:
Die obigen beiden Puntke, die virtuelle Python-Umgebung und die Migration der Vokabulardaten in einer typischen Installation, als root:
```bash
cd /opt/digiverso/vocabulary/migration
python3 -m venv vmenv
. vmenv/bin/activate
pip install requests mysql-connector-python==8.4.0 alive_progress lxml
VOC_PORT=$(sudo grep -oP '^server.port=\K.*' /opt/digiverso/vocabulary/application.properties)
VOC_TOKEN=$(sudo grep -oP '^security.token=\K.*' /opt/digiverso/vocabulary/application.properties)
DB_GOOBI_PW=$(sudo xmlstarlet sel -t -v '//Resource/@password' -n /etc/tomcat9/Catalina/localhost/goobi.xml)
python vocabulary-migrator.py --vocabulary-server-host localhost --vocabulary-server-port "${VOC_PORT}" --goobi-database-host localhost --goobi-database-port 3306 --goobi-database-name goobi --goobi-database-user goobi --goobi-database-password "${DB_GOOBI_PW}" --continue-on-error --fallback-language ger
python vocabulary-migrator.py --vocabulary-server-host localhost --vocabulary-server-port "${VOC_PORT}" --vocabulary-server-token "${VOC_TOKEN}" --goobi-database-host localhost --goobi-database-port 3306 --goobi-database-name goobi --goobi-database-user goobi --goobi-database-password "${DB_GOOBI_PW}" --continue-on-error --fallback-language ger

# Test
curl -s http://localhost:8081/api/v1/vocabularies --header "Authorization: Bearer $VOC_TOKEN" | jq -r '._embedded.vocabularyList[] .name'
```

**Hinweis** Ändern Sie die Parameter entsprechend Ihrer Konfiguration. Der Parameter `fallback-language` definiert die Standardsprache, die für ein mehrsprachiges Vokabularfeld verwendet wird, für das keine Standardsprache abgeleitet werden konnte. Die Option `continue-on-error` verhindert, dass das Migrationstool bei Fehlern bei der Datenmigration anhält. Diese Fehler können auftreten, wenn die Daten nicht in den neuen Vokabularserver eingefügt werden konnten. Mögliche Gründe dafür könnten sein:
Expand Down Expand Up @@ -140,11 +144,11 @@ Diese Datei ordnet allen Datensatzwerten die entsprechende Datensatz-IDs im Refe
### Test der Vokabulardaten-Migration
- Wenn eine Datenmigration stattgefunden hat, prüfen Sie, ob alle Vokabulare migriert wurden:
```bash
curl -s http://localhost:8081/api/v1/vocabularies | jq -r '._embedded.vocabularyList[] .name'
curl -s http://localhost:8081/api/v1/vocabularies --header "Authorization: Bearer $VOC_TOKEN" | jq -r '._embedded.vocabularyList[] .name'
```
- Prüfen Sie, ob die Links korrekt aufgelöst werden (siehe Konfiguration):
```bash
curl http://localhost:8081/api/v1/records/1 | jq
curl http://localhost:8081/api/v1/records/1 --header "Authorization: Bearer $VOC_TOKEN" | jq
```
Das JSON-Element `_links` sollte Verweise auf andere Ressourcen enthalten.
Diese URLs sollten gültig und auflösbar sein.
Expand All @@ -159,9 +163,9 @@ cd /opt/digiverso/vocabulary/migration
sudo -s
. vmenv/bin/activate
# dry-run:
python metadata-migrator.py --verbose --log INFO -m migration.csv -d /opt/digiverso/goobi/metadata --dry
python metadata-migrator.py --vocabulary-server-token "${VOC_TOKEN}" --verbose --log INFO -m migration.csv -d /opt/digiverso/goobi/metadata --dry
# metadata migration
python metadata-migrator.py -m migration.csv -d /opt/digiverso/goobi/metadata
python metadata-migrator.py --vocabulary-server-token "${VOC_TOKEN}" -m migration.csv -d /opt/digiverso/goobi/metadata
```

Dadurch werden alle mets-Dateien in allen Prozessverzeichnissen rekursiv verarbeitet.
Expand Down
Loading

0 comments on commit 992ad5d

Please sign in to comment.