From bf28d5a27d2e3ada3e75c81e755a28d397930ff3 Mon Sep 17 00:00:00 2001 From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu> Date: Thu, 30 Nov 2023 15:25:43 +0100 Subject: [PATCH] Add springboot image and integration test plan --- pom.xml | 5 +- .../compose/sprinboot-mysql-smp/README.md | 25 +++ .../sprinboot-mysql-smp/docker-compose.yml | 35 +++ .../compose/sprinboot-mysql-smp/runCompose.sh | 64 ++++++ .../sprinboot-mysql-smp/stopClearCompose.sh | 19 ++ smp-docker/images/build-docker-images.sh | 45 +++- .../images/shared-artefacts/smp-logback.xml | 42 ++++ .../images/smp-springboot-mysql/Dockerfile | 61 ++++++ .../images/smp-springboot-mysql/README.md | 37 ++++ .../images/smp-springboot-mysql/entrypoint.sh | 148 +++++++++++++ smp-docker/images/springboot-mysql/Dockerfile | 64 ------ smp-docker/images/springboot-mysql/README.md | 37 ---- .../images/springboot-mysql/entrypoint.sh | 201 ------------------ .../images/tomcat-mysql-smp-sml/Dockerfile | 1 + .../images/tomcat-mysql-smp-sml/README.md | 12 +- smp-springboot/pom.xml | 15 +- 16 files changed, 492 insertions(+), 319 deletions(-) create mode 100755 smp-docker/compose/sprinboot-mysql-smp/README.md create mode 100644 smp-docker/compose/sprinboot-mysql-smp/docker-compose.yml create mode 100755 smp-docker/compose/sprinboot-mysql-smp/runCompose.sh create mode 100755 smp-docker/compose/sprinboot-mysql-smp/stopClearCompose.sh create mode 100644 smp-docker/images/shared-artefacts/smp-logback.xml create mode 100755 smp-docker/images/smp-springboot-mysql/Dockerfile create mode 100755 smp-docker/images/smp-springboot-mysql/README.md create mode 100755 smp-docker/images/smp-springboot-mysql/entrypoint.sh delete mode 100755 smp-docker/images/springboot-mysql/Dockerfile delete mode 100755 smp-docker/images/springboot-mysql/README.md delete mode 100755 smp-docker/images/springboot-mysql/entrypoint.sh diff --git a/pom.xml b/pom.xml index cbbb19638..6e54575c2 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,8 @@ <junit-jupiter.version>5.10.0</junit-jupiter.version> <junit-platform-surefire-provider.version>1.3.2</junit-platform-surefire-provider.version> <junitparams.version>1.1.1</junitparams.version> - <logback.version>1.3.8</logback.version> + <!-- Use logback 1.2.x because is the one used by springboot 5.7. Changing to 1.3+ will break springboot logging. --> + <logback.version>1.2.12</logback.version> <mysql.jdbc.version>8.2.0</mysql.jdbc.version> <metro.version>2.2.1-1</metro.version> <mockito.version>4.11.0</mockito.version> @@ -102,7 +103,7 @@ <servlet-api.version>3.0.1</servlet-api.version> <slf4j.version>2.0.9</slf4j.version> <spring-modules-jakarta-commons.version>0.8</spring-modules-jakarta-commons.version> - <spring-boot.version>2.7.17</spring-boot.version> + <spring-boot.version>2.7.18</spring-boot.version> <spring-boot.tomcat.version>9.0.82</spring-boot.tomcat.version> <spring.security.version>5.8.8</spring.security.version> <spring.version>5.3.30</spring.version> diff --git a/smp-docker/compose/sprinboot-mysql-smp/README.md b/smp-docker/compose/sprinboot-mysql-smp/README.md new file mode 100755 index 000000000..e7bee7e65 --- /dev/null +++ b/smp-docker/compose/sprinboot-mysql-smp/README.md @@ -0,0 +1,25 @@ +# Experimental SMP docker image with springboot + +Purpose of compose plan is to startup fully functional SMP environment for demo and testing. The plan contains MySql database +JDK8, it has disabled SML integration + +# Run environment +docker-compose -f docker-compose.yml up -d + + +## SMP +url: http://localhost:8282/smp/ + +### MYSQL +Database client connection (for testing and debugging ) +url: jdbc:mysql://localhost:3208/smp +Username: smp +Password: smp + +### Volume (-v /opt/dockerdata/sml:/data) +Mysql database files and tomcat configuration (and logs) can be externalized for experimenting with different SMP settings. + +## Mail server +Mock mail server for monitoring send alert mails. +url: http://localhost:9005/monitor + diff --git a/smp-docker/compose/sprinboot-mysql-smp/docker-compose.yml b/smp-docker/compose/sprinboot-mysql-smp/docker-compose.yml new file mode 100644 index 000000000..47a6d19ee --- /dev/null +++ b/smp-docker/compose/sprinboot-mysql-smp/docker-compose.yml @@ -0,0 +1,35 @@ +version: "3.0" +services: + smp-springboot: + image: smp-springboot-mysql:${SMP_VERSION} + container_name: smp-springboot-mysql + environment: + - SMP_INIT_PROPERTIES=smp.passwordPolicy.expired.forceChange=false + ||smp.automation.authentication.external.tls.SSLClientCert.enabled=true + ||smp.cluster.enabled=false + ||smp.mode.development=true + ||smp.ui.authentication.types=PASSWORD + ||bdmsl.integration.enabled=false + ||mail.smtp.host=mail-server.smp.local + ||mail.smtp.port=2500 + ||smp.alert.user.login_failure.enabled=true + ||smp.alert.user.suspended.enabled=true + ||smp.alert.password.imminent_expiration.enabled=true + ||smp.alert.password.expired.enabled=true + ||smp.alert.accessToken.imminent_expiration.enabled=true + ||smp.alert.accessToken.expired.enabled=true + ||smp.alert.certificate.imminent_expiration.enabled=true + ||smp.alert.certificate.expired.enabled=true + ||smp.alert.accessToken.expired.enabled=true + volumes: + - ./properties/db-scripts:/tmp/custom-data/ + - ./properties/keystores:/tmp/keystores/ + ports: + - "8282:8084" +# - "3208:3306" +# - "5005:5005" + mail-service: + image: inbucket/inbucket:3.0.0 + hostname: mail-server.smp.local + ports: + - "9205:9000" diff --git a/smp-docker/compose/sprinboot-mysql-smp/runCompose.sh b/smp-docker/compose/sprinboot-mysql-smp/runCompose.sh new file mode 100755 index 000000000..0337bbcd7 --- /dev/null +++ b/smp-docker/compose/sprinboot-mysql-smp/runCompose.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +WORKING_DIR="$(dirname $0)" +SMP_INIT_DATABASE="../../../smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb.ddl" +#SMP_INIT_DATABASE_DATA="../../../smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb-data.sql" +SMP_INIT_DATABASE_DATA="../../../smp-soapui-tests/groovy/mysql-4.1_integration_test_data.sql" +# soap ui data +PREFIX="smp-springboot-mysql" +SMP_VERSION= + + +# READ arguments +while getopts i:v: option +do + case "${option}" + in + i) SMP_INIT_DATABASE_DATA=${OPTARG};; + v) SMP_VERSION=${OPTARG};; + esac +done + + +if [ -z "${SMP_VERSION}" ] +then + # get version from POM file + SMP_VERSION="$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout)" + +fi + +echo "SMP version: $SMP_VERSION" +echo "Working Directory: ${WORKING_DIR}" +cd "$WORKING_DIR" + + + +# check if property folder exists if not create it +if [ ! -d "./properties/db-scripts/" ] +then + mkdir -p "./properties/db-scripts/" +fi + +# create database init script from l +cp "${SMP_INIT_DATABASE}" ./properties/db-scripts/mysql5innodb.ddl +cp "${SMP_INIT_DATABASE_DATA}" ./properties/db-scripts/mysql5innodb-data.sql +cp + + +function clearOldContainers { + echo "Clear containers and volumes" + docker-compose -p "${PREFIX}" rm -s -f -v + echo "Clear containers and volumes" +} + + +export SMP_VERSION="${SMP_VERSION}" +echo "Clear old containers" +clearOldContainers +# start " +echo "Start compose" +docker-compose -p ${PREFIX} up -d --force-recreate + +# wait until service is up +for i in `seq 100`; do timeout 1 bash -c 'curl --silent --fail http://localhost:8282/smp/'; if [ $? -eq 0 ] ; then break;fi; echo "$i. Wait for tomcat to start!"; sleep 5; done; + diff --git a/smp-docker/compose/sprinboot-mysql-smp/stopClearCompose.sh b/smp-docker/compose/sprinboot-mysql-smp/stopClearCompose.sh new file mode 100755 index 000000000..53e39789e --- /dev/null +++ b/smp-docker/compose/sprinboot-mysql-smp/stopClearCompose.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +WORKING_DIR="$(dirname $0)" +echo "Working Directory: ${WORKING_DIR}" +cd "$WORKING_DIR" + +PREFIX="smp-springboot-mysql" + +# clear volume and containers - to run restart from scratch +function clearOldContainers { + echo "Save docker log to docker-file" + docker logs ${PREFIX} > smp-container.log 2>&1 + echo "Clear containers and volumes" + docker-compose -p "${PREFIX}" rm -s -f -v +} + + +# stop and clear +clearOldContainers diff --git a/smp-docker/images/build-docker-images.sh b/smp-docker/images/build-docker-images.sh index 1a2b78158..3a3b17dd2 100755 --- a/smp-docker/images/build-docker-images.sh +++ b/smp-docker/images/build-docker-images.sh @@ -36,6 +36,8 @@ SMP_VERSION= ORACLE_ARTEFACTS="/CEF/repo" SMP_ARTEFACTS="../../smp-webapp/target/" +SMP_SPRINGBOOT_ARTEFACTS="../../smp-springboot/target/" +SMP_PLUGIN_EXAMPLE="../../smp-examples/smp-spi-payload-validation-example/target/" SMP_ARTEFACTS_CLEAR="false" SMP_IMAGE_PUBLISH="false" @@ -45,12 +47,13 @@ DOCKER_REGISTRY_HOST=${bamboo_DOCKER_REGISTRY_HOST} DOCKER_FOLDER=${bamboo_DOCKER_FOLDER:-${bamboo_DOCKER_USER}} # READ arguments -while getopts v:o:s:c:p: option; do +while getopts v:o:a:s:c:p: option; do case "${option}" in v) SMP_VERSION=${OPTARG} ;; o) ORACLE_ARTEFACTS=${OPTARG} ;; - s) SMP_ARTEFACTS=${OPTARG} ;; + a) SMP_ARTEFACTS=${OPTARG} ;; + s) SMP_SPRINGBOOT_ARTEFACTS=${OPTARG} ;; c) SMP_ARTEFACTS_CLEAR=${OPTARG} ;; p) SMP_IMAGE_PUBLISH=${OPTARG} ;; esac @@ -65,17 +68,16 @@ if [[ -z "${SMP_VERSION}" ]]; then echo "Try to get version from artefacts: $(ls -ltr $SMP_ARTEFACTS)" SMP_VERSION="$(ls ${SMP_ARTEFACTS}/smp-*-setup.zip | sed -e 's/.*smp-//g' | sed -e 's/-setup\.zip$//g')" fi - fi -SMP_PLUGIN_EXAMPLE="../../smp-examples/smp-spi-payload-validation-example/target/" DIRNAME=$(dirname "$0") cd "$DIRNAME" DIRNAME="$(pwd -P)" echo "*****************************************************************" echo "* SMP artefact folders: $SMP_ARTEFACTS, (Clear folder after build: $SMP_ARTEFACTS_CLEAR )" -echo "* Plugin example: $SMP_PLUGIN_EXAMPLE " +echo "* SMP artefact springboot folders: $SMP_SPRINGBOOT_ARTEFACTS" +echo "* SMP Plugin example: $SMP_PLUGIN_EXAMPLE " echo "* Build SMP image for version $SMP_VERSION" echo "* Oracle artefact folders: $ORACLE_ARTEFACTS" echo "*****************************************************************" @@ -145,10 +147,14 @@ validateAndPrepareArtefacts() { cp "${ORACLE_ARTEFACTS}/${WEBLOGIC_14_FILE}" ./oracle/weblogic-14.1.1.0/ fi - if [[ ! -d "./tomcat-mysql-smp-sml/artefacts/" ]]; then - mkdir -p "./tomcat-mysql-smp-sml/artefacts" + if [[ ! -d "./smp-springboot-mysql/artefacts/" ]]; then + mkdir -p "./smp-springboot-mysql/artefacts" fi + if [[ ! -d "./tomcat-mysql-smp-sml/artefacts/" ]]; then + mkdir -p "./tomcat-mysql-smp-sml/artefacts" + fi + if [[ ! -d "./weblogic-14.1-smp/artefacts/" ]]; then mkdir -p "./weblogic-14.1-smp/artefacts" fi @@ -157,15 +163,16 @@ validateAndPrepareArtefacts() { mkdir -p "./weblogic-12.2-smp/artefacts" fi - # SMP artefats + # SMP artefacts if [[ ! -f "${SMP_ARTEFACTS}/smp.war" ]]; then - echo "SMP artefact '${SMP_ARTEFACTS}/smp.war' not found. Was project built!" + echo "SMP artefact '${SMP_ARTEFACTS}/smp.war' not found. Was project built?" exit 1 else # copy artefact to docker build folder cp -r shared-artefacts ./weblogic-12.2-smp/artefacts/ cp -r shared-artefacts ./weblogic-14.1-smp/artefacts/ cp -r shared-artefacts ./tomcat-mysql-smp-sml/artefacts/ + cp -r shared-artefacts ./smp-springboot-mysql/artefacts/ # for weblogic cp "${SMP_ARTEFACTS}/smp.war" ./weblogic-12.2-smp/artefacts/smp.war cp "${SMP_ARTEFACTS}/smp.war" ./weblogic-14.1-smp/artefacts/smp.war @@ -173,6 +180,15 @@ validateAndPrepareArtefacts() { cp "${SMP_ARTEFACTS}/smp.war" ./tomcat-mysql-smp-sml/artefacts/smp.war fi + # add SMP smp-springboot artefacts to smp-springboot-mysql imag + if [[ ! -f "${SMP_SPRINGBOOT_ARTEFACTS}/smp-springboot-$SMP_VERSION-exec.jar" ]]; then + echo "SMP artefact '${SMP_SPRINGBOOT_ARTEFACTS}/smp-springboot-$SMP_VERSION-exec.jar' not found!" + exit 1 + else + # for mysql tomcat + cp "${SMP_SPRINGBOOT_ARTEFACTS}/smp-springboot-$SMP_VERSION-exec.jar" ./smp-springboot-mysql/artefacts/smp-springboot-exec.jar + fi + # SMP setup zip if [[ ! -f "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ]]; then echo "SMP setup bundle '${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip' not found. Was project built!" @@ -182,6 +198,7 @@ validateAndPrepareArtefacts() { cp "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ./weblogic-12.2-smp/artefacts/smp-setup.zip cp "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ./weblogic-14.1-smp/artefacts/smp-setup.zip cp "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ./tomcat-mysql-smp-sml/artefacts/smp-setup.zip + cp "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ./smp-springboot-mysql/artefacts/smp-setup.zip fi if [[ ! -d "${SMP_PLUGIN_EXAMPLE}" ]]; then @@ -202,8 +219,18 @@ buildImages() { buildWebLogicOracleImages12 buildWebLogicOracleImages14 buildTomcatMysqlImages + buildSpringbootMysqlImages buildUtils } +buildSpringbootMysqlImages() { + # build tomcat mysql image deployment. + docker build -t "smp-springboot-mysql:${SMP_VERSION}" ./smp-springboot-mysql/ --build-arg SMP_VERSION=${SMP_VERSION} + if [ $? -ne 0 ]; then + echo "Error occurred while building image [smp-springboot-mysql:${SMP_VERSION}]!" + exit 10 + fi +} + buildTomcatMysqlImages() { # build tomcat mysql image deployment. docker build -t "smp-sml-tomcat-mysql:${SMP_VERSION}" ./tomcat-mysql-smp-sml/ --build-arg SMP_VERSION=${SMP_VERSION} diff --git a/smp-docker/images/shared-artefacts/smp-logback.xml b/smp-docker/images/shared-artefacts/smp-logback.xml new file mode 100644 index 000000000..b0ce15987 --- /dev/null +++ b/smp-docker/images/shared-artefacts/smp-logback.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<configuration> + <!-- pattern definition --> + <property name="encoderPattern" value="%d{ISO8601} [%X{smp_user}] [%X{smp_session_id}] [%X{smp_request_id}] [%thread] %5p %c{1}:%L - %m%n" scope="global"/> + <property name="consolePattern" value="%d{ISO8601} [%X{smp_user}] [%X{smp_session_id}] [%X{smp_request_id}] [%thread] %5p %c{1}:%L - %m%n" scope="global"/> + <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.folder:-logs}/edelivery-smp.log</file> + <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> + <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> + <marker>SECURITY</marker> + <marker>BUSINESS</marker> + </evaluator> + <onMismatch>NEUTRAL</onMismatch> + <onMatch>DENY</onMatch> + </filter> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <!-- rollover daily --> + <fileNamePattern>${log.folder:-logs}/edelivery-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <!-- each file should be at most 30MB, keep 60 days worth of history, but at most 20GB --> + <maxFileSize>30MB</maxFileSize> + <maxHistory>60</maxHistory> + <totalSizeCap>20GB</totalSizeCap> + </rollingPolicy> + <encoder> + <pattern>${encoderPattern}</pattern> + </encoder> + </appender> + <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> + <Target>System.out</Target> + <encoder> + <pattern>${consolePattern}</pattern> + </encoder> + </appender> + <logger name="eu.europa.ec.edelivery" level="INFO" /> + <logger name="eu.europa.ec.smp" level="INFO" /> + <logger name="org.springframework.security.cas" level="INFO" /> + <root level="WARN"> + <appender-ref ref="file"/> + <appender-ref ref="stdout"/> + </root> +</configuration> \ No newline at end of file diff --git a/smp-docker/images/smp-springboot-mysql/Dockerfile b/smp-docker/images/smp-springboot-mysql/Dockerfile new file mode 100755 index 000000000..0cb5af3e1 --- /dev/null +++ b/smp-docker/images/smp-springboot-mysql/Dockerfile @@ -0,0 +1,61 @@ +FROM ubuntu:22.04 +MAINTAINER Joze Rihtarsic + +ARG SMP_VERSION +ARG SMP_LOGICAL_ADDRESS="${SMP_LOGICAL_ADDRESS:-http://localhost:8080/smp/}" + +# Set the SMP_VERSION env variable \ +ENV SMP_HOME=/opt/smp \ + SMP_DB_SCHEMA=smp \ + SMP_DB_USER=smp \ + SMP_INIT_PROPERTY_DELIMITER="||" \ + SMP_INIT_PROPERTIES="" \ + SMP_DB_USER_PASSWORD=smp \ + MYSQL_ROOT_PASSWORD=root \ +# misc variables + LANG=en_US.utf8 \ + LD_LIBRARY_PATH=/usr/local/apr/lib \ + # set debug + JPDA_ADDRESS="5005" \ + JPDA_TRANSPORT="dt_socket" + + +# Exposing ports used in entrypoint.sh .. +# - 3306 Mysql port +# - 8080 springboot port +# - 5005 JDPA debug port +EXPOSE 3306 8084 5005 + + +VOLUME ["/data"] + +# install utils, java, mysql \ +RUN apt-get -y update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + mysql-server \ + openjdk-8-jdk \ + locales\ + curl \ + unzip \ + haveged \ + && rm -rf /var/lib/apt/lists/* +RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \ +# set user + && addgroup mysql mysql \ + && groupadd smp \ + && useradd -s /bin/false -g smp -d ${SMP_HOME} smp \ + && mkdir -p $SMP_HOME/logs \ + && cd $SMP_HOME \ + && export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") \ + && echo "server.port=8084" > $SMP_HOME/application.properties + +ADD ./artefacts /tmp/artefacts +COPY ./entrypoint.sh /sbin/entrypoint.sh + +RUN unzip /tmp/artefacts/smp-setup.zip -d /tmp/ \ + && mv /tmp/smp-$SMP_VERSION /tmp/smp-setup \ + && mv /tmp/artefacts/smp-springboot-exec.jar $SMP_HOME/ \ + && chmod u+x /sbin/entrypoint.sh + + +ENTRYPOINT ["/sbin/entrypoint.sh"] diff --git a/smp-docker/images/smp-springboot-mysql/README.md b/smp-docker/images/smp-springboot-mysql/README.md new file mode 100755 index 000000000..548e63b38 --- /dev/null +++ b/smp-docker/images/smp-springboot-mysql/README.md @@ -0,0 +1,37 @@ +DomiSMP with sprinboot and mysql database. +================================ + +The Image is intended for internal testing of the DomiSMP snapshots builds. The images should not +be used in production environment. + +Image contains SMP deployed on the spring Embedded Tomcat 9 server with the MYSQL. + +# How to build + +To build an image with DomiSMP application first copy and rename arterfacts into folder: + + cp "${SMP_ARTEFACTS}/smp-springboot-${SMP_VERSION}-exec.jar" ./artefacts/smp-springboot.jar + cp "${SMP_ARTEFACTS}/smp-${SMP_VERSION}-setup.zip" ./artefacts/smp-setup.zip + +Then build image with command: + + r build -t smp_springboot_mysql --build-arg SMP_VERSION=5.1-SNAPSHOT . + + +# How to run + +Tu run image execute command: + + docker run --name smp -p 8084:8080 -p 3304:3306 smp_springboot_mysql + + +In your browser, enter `https://localhost:8080/smp` . + + + +# how to run image from edelivery nexus. + +The edelivery nexus contains prebuild images for the testing. To start the Tomcat Mysql image +login to docker registry 'edelivery-docker.devops.tech.ec.europa.eu' and execute the following command. + + docker run --name smp edelivery-docker.devops.tech.ec.europa.eu/smp_springboot_mysql:5.1-SNAPSHOT -p 3306:3306 -p 8080:8080 diff --git a/smp-docker/images/smp-springboot-mysql/entrypoint.sh b/smp-docker/images/smp-springboot-mysql/entrypoint.sh new file mode 100755 index 000000000..ee88b363c --- /dev/null +++ b/smp-docker/images/smp-springboot-mysql/entrypoint.sh @@ -0,0 +1,148 @@ +#!/bin/bash + +#set -e + +# parameters +MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-"root"} +SMP_DB_USER=${SMP_DB_USER:-"smp"} +SMP_DB_USER_PASSWORD=${SMP_DB_USER_PASSWORD:-"secret123"} +SMP_DB_SCHEMA=${SMP_DB_SCHEMA:-"smp"} + +DATA_DIR=/data +MYSQL_DATA_DIR=${DATA_DIR}/mysql + +if [ ! -d ${DATA_DIR} ]; then + mkdir -p ${DATA_DIR} +fi + +init_mysql() { + echo "[INFO] init database:" + if [ ! -d "/run/mysqld" ]; then + mkdir -p /run/mysqld + chown -R mysql:mysql /run/mysqld + fi + + if [ ! -d ${MYSQL_DATA_DIR} ]; then + # sleep a little to avoid mv issues + sleep 3s + mv /var/lib/mysql ${DATA_DIR} + fi + + rm -rf /var/lib/mysql + ln -sf ${MYSQL_DATA_DIR} /var/lib/mysql + chmod -R 0777 ${MYSQL_DATA_DIR} + chown -R mysql:mysql ${MYSQL_DATA_DIR} + echo '[INFO] start MySQL' + sleep 5s + service mysql start + echo "[INFO] ----------------------------------------" + echo "[INFO] create SMP database: ${SMP_DB_SCHEMA}" + if [ -d ${MYSQL_DATA_DIR}/${SMP_DB_SCHEMA} ]; then + echo "[INFO] MySQL ${SMP_DB_SCHEMA} already present, skipping creation" + else + echo "[INFO] MySQL ${SMP_DB_SCHEMA} not found, creating initial DBs" + + echo 'Create smp database' + mysql -h localhost -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';drop schema if exists $SMP_DB_SCHEMA;DROP USER IF EXISTS $SMP_DB_USER; create schema $SMP_DB_SCHEMA;alter database $SMP_DB_SCHEMA charset=utf8; create user $SMP_DB_USER identified by '$SMP_DB_USER_PASSWORD';grant all on $SMP_DB_SCHEMA.* to $SMP_DB_USER;" + + if [ -f "/tmp/custom-data/mysql5innodb.sql" ]; then + echo "Use custom database script! " + mysql -h localhost -u root --password=$MYSQL_ROOT_PASSWORD $SMP_DB_SCHEMA <"tmp/custom-data/mysql5innodb.ddl" + else + echo "Use default database ddl script!" + mysql -h localhost -u root --password=$MYSQL_ROOT_PASSWORD $SMP_DB_SCHEMA <"/tmp/smp-setup/database-scripts/mysql5innodb.ddl" + fi + + if [ -f "/tmp/custom-data/mysql5innodb-data.sql" ]; then + echo "Use custom init script! " + mysql -h localhost -u root --password=$MYSQL_ROOT_PASSWORD $SMP_DB_SCHEMA <"/tmp/custom-data/mysql5innodb-data.sql" + else + echo "Use default init script!" + mysql -h localhost -u root --password=$MYSQL_ROOT_PASSWORD $SMP_DB_SCHEMA < "/tmp/smp-setup/database-scripts/mysql5innodb-data.sql" + fi + fi + sleep 5s +} + +addOrReplaceProperties() { + + PROP_FILE=$1 + INIT_PROPERTIES=$2 + INIT_PROPERTY_DELIMITER=$3 + + # replace domibus properties + if [ -n "$INIT_PROPERTIES" ]; then + echo "Parse init properties: $INIT_PROPERTIES" + # add delimiter also to end :) + s="$INIT_PROPERTIES$INIT_PROPERTY_DELIMITER" + + array=() + while [[ $s ]]; do + array+=("${s%%"$INIT_PROPERTY_DELIMITER"*}") + s=${s#*"$INIT_PROPERTY_DELIMITER"} + done + + # replace parameters + IFS='=' + for property in "${array[@]}"; do + read -r key value <<<"$property" + # escape regex chars and remove trailing and leading spaces.. + keyRE="$(printf '%s' "${key// /}" | sed 's/[[\*^$()+?{|]/\\&/g')" + propertyRE="$(printf '%s' "${property// /}" | sed 's/[[\*^$()+?{|/]/\\&/g')" + + echo "replace or add property: [$keyRE] with value [$propertyRE]" + # replace key line and commented #key line with new property + sed -i "s/^$keyRE=.*/$propertyRE/;s/^#$keyRE=.*/$propertyRE/" $PROP_FILE + # test if replaced if the line not exists add in on the end + grep -qF -- "$propertyRE" "$PROP_FILE" || echo "$propertyRE" >>"$PROP_FILE" + done + + fi +} + +init_smp() { + # set smp data/security folder + mkdir -p "${SMP_HOME}/smp/" + mkdir -p "${SMP_HOME}/smp-libs" + # copy smp keystore with sml authorized sml certificates + cp /tmp/artefacts/shared-artefacts/smp-logback.xml "${SMP_HOME}/logback.xml" + cp "/tmp/artefacts/shared-artefacts/smp-keystore-docker-demo.p12" "${SMP_HOME}/smp/smp-keystore-docker-demo.p12" + cp "/tmp/artefacts/shared-artefacts/smp-truststore-docker-demo.p12" "${SMP_HOME}/smp/smp-truststore-docker-demo.p12" + chown -R smp:smp "${SMP_HOME}" +} + +init_smp_properties() { + echo "[INFO] init application.properties:" + { + echo "# mysql database configuration" + echo "smp.jdbc.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect" + echo "smp.jdbc.driver=com.mysql.cj.jdbc.Driver" + echo "smp.jdbc.url=jdbc:mysql://localhost:3306/${SMP_DB_SCHEMA}?allowPublicKeyRetrieval=true" + echo "smp.jdbc.user=${SMP_DB_USER}" + echo "smp.jdbc.password=${SMP_DB_USER_PASSWORD}" + echo "# SMP init parameters" + echo "smp.security.folder=${SMP_HOME}/smp/" + echo "smp.libraries.folder=${SMP_HOME}/smp-libs" + echo "smp.automation.authentication.external.tls.clientCert.enabled=true" + echo "bdmsl.integration.enabled=false" + echo "bdmsl.participant.multidomain.enabled=false" + echo "smp.keystore.filename=smp-keystore-docker-demo.p12" + echo "smp.keystore.type=PKCS12" + echo "smp.truststore.filename=smp-truststore-docker-demo.p12" + echo "smp.truststore.type=PKCS12" + echo "smp.keystore.password={DEC}{test123}" + echo "smp.truststore.password={DEC}{test123}" + } >>"$SMP_HOME/application.properties" + + addOrReplaceProperties "$SMP_HOME/application.properties" "$SMP_INIT_PROPERTIES" "$SMP_INIT_PROPERTY_DELIMITER" +} + +init_mysql +init_smp_properties +init_smp + +echo '[INFO] start running SMP' +"${JAVA_HOME}/bin/java" -version +cd $SMP_HOME/ +ls -ltr +su -s /bin/sh smp -c "${JAVA_HOME}/bin/java -jar smp-springboot-exec.jar" diff --git a/smp-docker/images/springboot-mysql/Dockerfile b/smp-docker/images/springboot-mysql/Dockerfile deleted file mode 100755 index 12be43b7d..000000000 --- a/smp-docker/images/springboot-mysql/Dockerfile +++ /dev/null @@ -1,64 +0,0 @@ -FROM ubuntu:22.04 - -MAINTAINER jrc - -ENV BDMSL_VERSION=5.0-SNAPSHOT \ - DATA_DIR=/data \ - JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ \ - DB_SCHEMA=smp \ - DB_USER=smp \ - DB_USER_PASSWORD=smp \ - MYSQL_ROOT_PASSWORD=root - -ENV BDMSL_HOME=/opt/bdmsl - -RUN apt-get update \ -# get utils, bind9, java, mysql - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - mysql-server \ - openjdk-8-jdk \ - unzip \ - wget \ - curl \ - vim \ - haveged \ - apache2-utils \ - && rm -rf /var/lib/apt/lists/* \ -# create bdmsl user - && mkdir "${BDMSL_HOME}" \ - && groupadd smp \ - && useradd -s /bin/false -g bdmsl -d ${BDMSL_HOME} smp \ - && cd /opt -#install -RUN cd /opt \ - && mkdir -p /opt/smpconf \ - && echo "[mysqld]" >> /etc/mysql/my.cnf \ - && echo "lower_case_table_names=1" >> /etc/mysql/my.cnf \ - && echo "collation-server=utf8_unicode_ci" >> /etc/mysql/my.cnf \ - && echo "init-connect='SET NAMES utf8'" >> /etc/mysql/my.cnf \ - && echo "character-set-server=utf8" >> /etc/mysql/my.cnf \ - && echo "default_authentication_plugin=mysql_native_password" >> /etc/mysql/my.cnf \ - && sed -i -e "s/127.0.0.1/0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf - - -# deploy application -COPY entrypoint.sh /sbin/entrypoint.sh -COPY ./artefacts/smp-springboot-exec.jar ${BDMSL_HOME}/smp-springboot-exec.jar -COPY ./artefacts/smp-setup.zip /tmp/smp-setup.zip - -# set configuration -RUN jar -xf /tmp/smp-setup.zip \ - && cp bdmsl-webapp-*/encriptionPrivateKey.private /opt/smlconf/encriptionPrivateKey.private \ - && cp bdmsl-webapp-*/keystore.jks /opt/smlconf/keystore.jks \ - && cp bdmsl-webapp-*/truststore.p12 /opt/smlconf/truststore.p12 \ - && mv bdmsl-webapp-*/database-scripts /opt/smlconf/database-scripts \ - && mv bdmsl-webapp-*/sml.config.properties /tmp/sml.config.properties \ - && rm -rf bdmsl-webapp-*/ \ - && chown -R bdmsl:bdmsl /opt/smlconf/ \ - && chmod 755 /sbin/entrypoint.sh - -EXPOSE 3306 8084 - -VOLUME /data - -ENTRYPOINT ["/sbin/entrypoint.sh"] diff --git a/smp-docker/images/springboot-mysql/README.md b/smp-docker/images/springboot-mysql/README.md deleted file mode 100755 index 3db2b9089..000000000 --- a/smp-docker/images/springboot-mysql/README.md +++ /dev/null @@ -1,37 +0,0 @@ -BDMSL with sprin-boot and mysql database. -================================ - -The Images are intended for internal testing of the BDSML nightly snapshots builds. The images should not -be used in production environment. - -Image contains BDMSL deployed on the Tomcat 9 server with the MYSQL. - -# How to build - -To build an image with BDMSL application first copy and rename arterfacts into folder: - - cp "${SML_ARTEFACTS}/bdmsl-springboot-${BDMSL_VERSION}-exec.jar" ./springboot-mysql/artefacts/bdmsl-springboot.jar - cp "${SML_ARTEFACTS}/bdmsl-webapp-${BDMSL_VERSION}-setup.zip" ./springboot-mysql/artefacts/bdmsl-webapp-setup.zip - -Then build image with command: - - docker build -t bdmsl_springboot_mysql ./springboot-mysql/ - - -# How to run - -Tu run image execute command: - - docker run --name bdmsl -p 8084:8080 -p 3304:3306 bdmsl_springboot_mysql:4.2-SNAPSHOT - - -In your browser, enter `https://localhost:8080/edelivery-sml` . - - - -# how to run image from edelivery nexus. - -The edelivery nexus contains prebuild images for the testing. To start the Tomcat Mysql image -login to docker registry 'edelivery-docker.devops.tech.ec.europa.eu' and execute the following command. - - docker run --name bdmsl-tomcat edelivery-docker.devops.tech.ec.europa.eu/bdmsl_springboot_mysql:4.2-SNAPSHOT -p 3306:3306 -p 8080:8080 \ No newline at end of file diff --git a/smp-docker/images/springboot-mysql/entrypoint.sh b/smp-docker/images/springboot-mysql/entrypoint.sh deleted file mode 100755 index ac2d42539..000000000 --- a/smp-docker/images/springboot-mysql/entrypoint.sh +++ /dev/null @@ -1,201 +0,0 @@ -#!/bin/bash -set -e - -ROOT_PASSWORD=${ROOT_PASSWORD:-password} -export JAVA_HOME=`type -p javac|xargs readlink -f|xargs dirname|xargs dirname` - -BIND_DATA_DIR=${DATA_DIR}/bind -MYSQL_DATA_DIR=${DATA_DIR}/mysql -BDMSL_DIR=${DATA_DIR}/smp - -if [ ! -d ${DATA_DIR} ]; then - mkdir -p ${DATA_DIR} -fi - - -init_mysql() { - # start MYSQL - echo "[INFO] Initialize mysql service: $(service mysql status)." - #service mysql start - # reinitialize mysql to start it with enabled lowercase tables, 'root' password and change the data folder - service mysql stop - rm -rf /var/lib/mysql - if [ ! -d ${MYSQL_DATA_DIR} ]; then - mkdir -p ${MYSQL_DATA_DIR} - fi - ln -sf ${MYSQL_DATA_DIR} /var/lib/mysql - - chmod -R 0775 ${MYSQL_DATA_DIR} - usermod -d ${MYSQL_DATA_DIR} mysql - - chown mysql:mysql ${MYSQL_DATA_DIR} - chmod 0775 ${MYSQL_DATA_DIR} - echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';" > /tmp/mysql-init - - mysqld --defaults-file=/etc/mysql/my.cnf --initialize --lower_case_table_names=1 --init-file=/tmp/mysql-init --user=mysql --console - service mysql start - - PID_MYSQL=$(cat /var/run/mysqld/mysqld.sock.lock); - if [ ! -d ${MYSQL_DATA_DIR}/${DB_SCHEMA} ]; then - # create database - mysql -h localhost -u root --password=${MYSQL_ROOT_PASSWORD} -e "drop schema if exists $DB_SCHEMA;DROP USER IF EXISTS $DB_USER; create schema $DB_SCHEMA;alter database $DB_SCHEMA charset=utf8; create user $DB_USER identified by '$DB_USER_PASSWORD';grant all on $DB_SCHEMA.* to $DB_USER;" - # initialize database - mysql -h localhost -u root --password=${MYSQL_ROOT_PASSWORD} $DB_SCHEMA < /opt/smlconf/database-scripts/mysql5innodb.ddl - # init data - mysql -h localhost -u root --password=${MYSQL_ROOT_PASSWORD} $DB_SCHEMA < /opt/smlconf/database-scripts/mysql5innodb-data.sql - fi -} - - -init_bdmsl() { - - echo "[INFO] init smp folders: ${BDMSL_HOME}/application.properties" - { - echo "# BDMSL application configuration" - echo "server.port=8080" - echo "# Database configuration" - echo "sml.hibernate.dialect=org.hibernate.dialect.MySQLDialect" - echo "sml.jdbc.driver=com.mysql.cj.jdbc.Driver" - echo "sml.jdbc.url=jdbc:mysql://localhost:3306/$DB_SCHEMA?allowPublicKeyRetrieval=true" - echo "sml.jdbc.user=$DB_USER" - echo "sml.jdbc.password=$DB_USER_PASSWORD" - } >> ${BDMSL_HOME}/application.properties - - - - - echo "[INFO] copy smp to shared folders: ${BDMSL_DIR}" - if [ ! -d ${BDMSL_DIR} ]; then - mv ${BDMSL_HOME} ${BDMSL_DIR} - fi - - rm -rf ${BDMSL_HOME} - ln -sf ${BDMSL_DIR} ${BDMSL_HOME} - - - # override init artefacts as keystore, truststore, keys, ... - if [ -d /opt/smlconf/init-configuration ]; then - cp -r /opt/smlconf/init-configuration/*.* /opt/smlconf/ - fi - - # add trusted hostname certificate for CRL download over HTTPS test - if [ -f /opt/smlconf/init-configuration/sml_crl_hostname.cer ]; then - "${JAVA_HOME}"/bin/keytool -importcert -alias test-host -keystore "/etc/ssl/certs/java/cacerts" -storepass changeit -file /opt/smlconf/init-configuration/sml_crl_hostname.cer -noprompt - fi - -} - -# -# Function initialize and star squid proxy. Prepositions for function are -# installed packages squid and apache2-utils! -# -function init_squid() { - - PROXY_FOLDER=${PROXY_FOLDER:-/data/proxy} - PROXY_CONFIG_LOGS="${PROXY_FOLDER}/logs" - PROXY_CONFIG_FILE="${PROXY_FOLDER}/squid.conf" - PROXY_USERS_FILE=/etc/squid/passwd - PROXY_AUTHENTICATION=${PROXY_AUTHENTICATION:-true} - PROXY_USERS=${PROXY_USERS:-proxyuser1:test123,proxyuser2:test123} - PROXY_PORT=${PROXY_PORT:-3127} - # system dependant - PROXY_LIBS=${PROXY_LIBS:-/usr/lib/squid} - - echo "[INFO] starting squid configuration" - echo "---------------------------< suquid conf >---------------------------" - echo "PROXY_CONFIG_FILE=${PROXY_CONFIG_FILE}" - echo "PROXY_FOLDER=${PROXY_FOLDER}" - echo "PROXY_USERS_FILE=${PROXY_USERS_FILE}" - echo "PROXY_AUTHENTICATION=${PROXY_AUTHENTICATION}" - echo "PROXY_USERS=${PROXY_USERS}" - echo "------------------------------[ suquid conf ]-------------------------------"; echo - - - # set configuration - [[ ! -d "${PROXY_FOLDER}" ]] && mkdir -p "${PROXY_FOLDER}" - [[ ! -d "${PROXY_CONFIG_LOGS}" ]] && mkdir -p "${PROXY_CONFIG_LOGS}" - [[ ! -d "/var/run/squid/" ]] && mkdir -p "/var/run/squid/" - - - echo "# BDMSL squid configuration" > "${PROXY_CONFIG_FILE}" - - { - echo "cache_access_log ${PROXY_CONFIG_LOGS}/access.log" - echo "cache_log ${PROXY_CONFIG_LOGS}/cache.log" - echo "cache_store_log ${PROXY_CONFIG_LOGS}/store.log" - echo "" - echo "pid_filename /var/run/squid/squidm.pid" - echo "cache_effective_user smp" - echo "" - echo "http_port ${PROXY_PORT}" - echo "" - } >> "${PROXY_CONFIG_FILE}" - - if [ "${PROXY_AUTHENTICATION}" == "true" ]; then - local users=(${PROXY_USERS//,/ }) - local userNames=() - - # clear file - echo "# BDMSL proxy users" > "${PROXY_USERS_FILE}" - for user in "${users[@]}"; do - local userCredentials=(${user//:/ }) - userNames+=(${userCredentials[0]}) - # create a user - htpasswd -b ${PROXY_USERS_FILE} ${userCredentials[0]} ${userCredentials[1]} || exit $? - done - echo "Created proxy users: ${userNames[*]}" - - # create squid property file - { - echo "auth_param basic program ${PROXY_LIBS}/basic_ncsa_auth ${PROXY_USERS_FILE}" - echo "auth_param basic children 5" - echo "auth_param basic realm Squid proxy-caching web server" - echo "auth_param basic credentialsttl 1 minute" - echo "auth_param basic casesensitive off" - echo "" - echo "acl ncsa_users proxy_auth REQUIRED" - echo "http_access allow ncsa_users" - echo "" - } >> ${PROXY_CONFIG_FILE} - # example to test - # wget -e use_proxy=yes --proxy-user=proxyuser2 --proxy-password=test123 -e http_proxy=http://127.0.0.1:3127 -e https_proxy=http://127.0.0.1:3127 https://www.google.com/ --no-check-certificate - else - { - echo "http_access allow all" - echo "" - } >> ${PROXY_CONFIG_FILE} - fi - chown -R smp:smp ${PROXY_FOLDER} - echo "Start squid proxy server" - $(nohup $(which squid) -f ${PROXY_CONFIG_FILE} -NYCd 1 &> ${PROXY_CONFIG_LOGS}/squid.out &) -} - -init_squid -init_bind -init_mysql -init_bdmsl - - -#---------------------------------------------------- -# stard bind 9 -# allow arguments to be passed to named -echo "[INFO] Start bind" -if [[ ${1:0:1} = '-' ]]; then - EXTRA_ARGS="$@" - set -- -elif [[ ${1} == named || ${1} == $(which named) ]]; then - EXTRA_ARGS="${@:2}" - set -- -fi - -echo "Starting named..." -service named stop -$(which named) -4 -u ${BIND_USER} ${EXTRA_ARGS} -d 0 -L ${BIND_DATA_DIR}/logs/stdout.txt & - -#---------------------------------------------------- -# start tomcat -echo "[INFO] Start smp" -cd ${BDMSL_DIR} -ls -ltr -su -s /bin/sh smp -c "${JAVA_HOME}/bin/java -jar smp-springboot-exec.jar" - diff --git a/smp-docker/images/tomcat-mysql-smp-sml/Dockerfile b/smp-docker/images/tomcat-mysql-smp-sml/Dockerfile index 973a8bf89..a0ab2a01a 100755 --- a/smp-docker/images/tomcat-mysql-smp-sml/Dockerfile +++ b/smp-docker/images/tomcat-mysql-smp-sml/Dockerfile @@ -60,6 +60,7 @@ RUN apt-get update \ bind9 \ bind9utils \ dnsutils \ + haveged \ libapr1 \ libapr1-dev \ libssl-dev \ diff --git a/smp-docker/images/tomcat-mysql-smp-sml/README.md b/smp-docker/images/tomcat-mysql-smp-sml/README.md index cfc09f732..1bb1ae521 100755 --- a/smp-docker/images/tomcat-mysql-smp-sml/README.md +++ b/smp-docker/images/tomcat-mysql-smp-sml/README.md @@ -1,13 +1,17 @@ -# Experiamental SMP docker image -Purpose of image is to help SMP and AP sofware developers to create development environment for localy testing Dynamic Discovery using SML and SMP. -Image uses latest version of eDelivery SMP setup on tomcat, mysql ubuntu +# Test and Domo SMP docker image + +The Image is intended for internal testing of the DomiSMP snapshots builds. The images should not +be used in production environment. + # Image build docker build -t smp . # Run container based on smp image - + + docker run --name smp -p 8080:8080 smp + docker run --name smp -it --rm -p [http-port]:8080 edelivery-docker.devops.tech.ec.europa.eu/edeliverytest/smp-sml-tomcat-mysql:${SMP_VERSION} example: diff --git a/smp-springboot/pom.xml b/smp-springboot/pom.xml index 26ed3fd33..fbc2b81bd 100644 --- a/smp-springboot/pom.xml +++ b/smp-springboot/pom.xml @@ -60,7 +60,7 @@ limitations under the License. <configuration> <classifier>exec</classifier> <mainClass>eu.europa.ec.springboot.smp.SMPApplication</mainClass> - <layout>ZIP</layout> + <layout>JAR</layout> <!-- Don't copy the war as a dependency, it's included as a resource --> <excludes> <exclude> @@ -68,7 +68,6 @@ limitations under the License. <artifactId>smp</artifactId> </exclude> </excludes> - </configuration> <executions> <execution> @@ -86,10 +85,22 @@ limitations under the License. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> + <exclusions> + <exclusion> + <artifactId>logback-classic</artifactId> + <groupId>ch.qos.logback</groupId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> + <exclusions> + <exclusion> + <artifactId>logback-classic</artifactId> + <groupId>ch.qos.logback</groupId> + </exclusion> + </exclusions> </dependency> <!--add latest jackson which is used also by the smp.war --> <dependency> -- GitLab