diff --git a/Dockerfile b/Dockerfile index a7c36b4..5643df3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM tomcat:9-jdk11-openjdk as mother LABEL maintainer="Alessandro Parma" -RUN apt-get update && apt-get install -y unzip +RUN apt-get update && apt-get install -y unzip wget # accepts local files and URLs. Tar(s) are automatically extracted WORKDIR /output/datadir @@ -13,6 +13,15 @@ WORKDIR /output/webapp ARG GEOSERVER_WEBAPP_SRC="./.placeholder" ADD "${GEOSERVER_WEBAPP_SRC}" "./" +# download and install libjpeg-2.0.6 from sources. +RUN wget https://nav.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6.tar.gz \ + && tar -zxf ./libjpeg-turbo-2.0.6.tar.gz \ + && cd libjpeg-turbo-2.0.6 && apt-get install cmake -yq && cmake -G"Unix Makefiles" && make deb \ + && dpkg -i ./libjpeg*.deb && apt-get -f install \ + && apt-get clean \ + && apt-get autoclean \ + && apt-get autoremove + # zip files require explicit extracion RUN \ if [ "${GEOSERVER_WEBAPP_SRC##*.}" = "zip" ]; then \ @@ -21,15 +30,9 @@ RUN \ fi \ && [ -d "./geoserver" ] || (mkdir -p ./geoserver && unzip ./geoserver.war -d ./geoserver && rm ./geoserver.war) -RUN apt-get update; apt-get upgrade --yes; apt-get install wget --yes - WORKDIR /output/plugins ARG PLUG_IN_URLS="" ADD .placeholder ${PLUG_IN_URLS} /output/plugins/ -# RUN \ -# if [ "$(echo ${PLUG_IN_URLS}| grep http)" != "" ]; then \ -# for URL in "${PLUG_IN_URLS}"; do wget $URL;done; unzip -o "./*zip"; rm -f ./*zip; \ -# fi RUN unzip -o "./*.zip";rm -f ./*zip WORKDIR /output/webapp @@ -56,11 +59,12 @@ ENV GRIB_CACHE_DIR="${GEOSERVER_HOME}/grib_cache_dir" # override at run time as needed JAVA_OPTS ENV INITIAL_MEMORY="2G" ENV MAXIMUM_MEMORY="4G" +ENV LD_LIBRARY_PATH="/opt/libjpeg-turbo/lib64" ENV JAIEXT_ENABLED="true" ENV GEOSERVER_OPTS=" \ -Dorg.geotools.coverage.jaiext.enabled=${JAIEXT_ENABLED} \ - -Duser.timezone=GMT \ + -Duser.timezone=UTC \ -Dorg.geotools.shapefile.datetime=true \ -DGEOSERVER_LOG_LOCATION=${GEOSERVER_LOG_LOCATION} \ -DGEOWEBCACHE_CONFIG_DIR=${GEOWEBCACHE_CONFIG_DIR} \ @@ -98,6 +102,7 @@ RUN apt-get update \ # copy from mother +COPY --from=mother "/opt/libjpeg-turbo" "/opt/libjpeg-turbo" COPY --from=mother "/output/datadir" "${GEOSERVER_DATA_DIR}" COPY --from=mother "/output/webapp/geoserver" "${CATALINA_BASE}/webapps/geoserver" COPY --from=mother "/output/plugins" "${CATALINA_BASE}/webapps/geoserver/WEB-INF/lib" @@ -108,4 +113,4 @@ WORKDIR "$CATALINA_BASE" ENV TERM xterm -EXPOSE 8080/tcp +EXPOSE 8080/tcp \ No newline at end of file diff --git a/README.md b/README.md index 7a75e2c..ed51bd1 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ docker stop gs start GeoServer with data persistence on saved datadir: ```bash -docker run -v ./datadir:/var/geoserver/datadir --name gs -p 8080:8080 geosolutionsit/geoserver` +docker run -v ./datadir:/var/geoserver/datadir --name gs -p 8080:8080 geosolutionsit/geoserver ``` Open your browser and point it to `http://localhost:8080/geoserver` . diff --git a/custom_build.sh b/custom_build.sh index ac3fdb6..efea0e6 100755 --- a/custom_build.sh +++ b/custom_build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -x set -e TAG=${1} @@ -9,38 +9,43 @@ readonly PULL=${5} readonly ALL_PARAMETERS=$* readonly BASE_BUILD_URL="https://build.geoserver.org/geoserver" readonly BASE_BUILD_URL_STABLE="https://netcologne.dl.sourceforge.net/project/geoserver/GeoServer" +#readonly BASE_BUILD_URL_STABLE="https://build.geoserver.org/geoserver" readonly EXTRA_FONTS_URL="https://www.dropbox.com/s/hs5743lwf1rktws/fonts.tar.gz?dl=1" +readonly MARLIN_VERSION=0.9.2 readonly ARTIFACT_DIRECTORY=./resources readonly GEOSERVER_ARTIFACT_DIRECTORY=${ARTIFACT_DIRECTORY}/geoserver/ readonly DATADIR_ARTIFACT_DIRECTORY=${ARTIFACT_DIRECTORY}/geoserver-datadir/ readonly PLUGIN_ARTIFACT_DIRECTORY=${ARTIFACT_DIRECTORY}/geoserver-plugins readonly FONTS_ARTIFACT_DIRECTORY=${ARTIFACT_DIRECTORY}/fonts/ +readonly MARLIN_ARTIFACT_DIRECTORY=${ARTIFACT_DIRECTORY}/marlin/ function help(){ if [ "$#" -ne 5 ] ; then - echo "Usage: $0 [docker image tag] [geoserver version] [geoserver master version] [datadir| nodatadir] [pull|no_pull];" + echo "Usage: $0 [docker image tag] [geoserver version] [geoserver main version] [datadir|nodatadir] [pull|no_pull];" echo ""; echo "[docker image tag] : the tag to be used for the docker iamge "; - echo "[geoserver version] : the release version of geoserver to be used; you can set it to master if you want the last release"; - echo "[geoserver master version] : if you use the master version for geoserver you need to set it to the numerical value for the next release;" + echo "[geoserver version] : the release version of geoserver to be used; you can set it to main if you want the last release"; + echo "[geoserver main version] : if you use the main version for geoserver you need to set it to the numerical value for the next release;" echo " if you use a released version you need to put it to the release number"; - echo "[datadir| nodatadir]: if this parameter is equal to nodatadir the datadir is not burned in the docker images "; - echo "[pull|no pull]: docker build use always a remote image or a local image"; + echo "[datadir|nodatadir]: datadir: copies ${DATADIR_ARTIFACT_DIRECTORY} in place into the containerr image, nodatadir: does nothing about any custom datadir"; + echo "[pull|no_pull]: docker build use always a remote image or a local image"; exit 1; fi } function clean_up_directory() { - rm -rf ${1}/* + # we shall never clean datadir + rm -rf ./resources/geoserver-plugins/* ./reosurces/geoserver/* +} +function create_plugins_folder() { + mkdir -p ./resources/geoserver-plugins + } function download_from_url_to_a_filepath { URL=${1} FILE_PATH=${2} FILE_DOWNLOADED=$(basename "${FILE_PATH}" ) - if [ -f "${FILE_PATH}" ]; then - rm -f "${FILE_PATH}" - fi if [ ! -f "${FILE_PATH}" ]; then curl -L "${URL}" --output "${FILE_PATH}" echo "* ${FILE_DOWNLOADED} artefact dowloaded *" @@ -54,13 +59,13 @@ function download_plugin() { PLUGIN_NAME=${2} case ${GEOSERVER_VERSION} in - "${GEOSERVER_MASTER_VERSION::-2}.x") - PLUGIN_FULL_NAME=geoserver-${GEOSERVER_VERSION::-2}-SNAPSHOT-${PLUGIN_NAME}-plugin.zip + "${GEOSERVER_MASTER_VERSION%.*}") + PLUGIN_FULL_NAME=geoserver-${GEOSERVER_VERSION%.*}-SNAPSHOT-${PLUGIN_NAME}-plugin.zip PLUGIN_ARTIFACT_URL=${BASE_BUILD_URL}/${GEOSERVER_VERSION}/${TYPE}-latest/${PLUGIN_FULL_NAME} ;; - "master") - PLUGIN_FULL_NAME=geoserver-${GEOSERVER_MASTER_VERSION::-2}-SNAPSHOT-${PLUGIN_NAME}-plugin.zip + "main") + PLUGIN_FULL_NAME=geoserver-${GEOSERVER_MASTER_VERSION%.*}-SNAPSHOT-${PLUGIN_NAME}-plugin.zip PLUGIN_ARTIFACT_URL=${BASE_BUILD_URL}/${GEOSERVER_VERSION}/${TYPE}-latest/${PLUGIN_FULL_NAME} ;; @@ -70,21 +75,14 @@ function download_plugin() { NEWTYPE=extensions PLUGIN_ARTIFACT_URL=${BASE_BUILD_URL_STABLE}/${GEOSERVER_VERSION}/${NEWTYPE}/${PLUGIN_FULL_NAME} else - VERSION="${GEOSERVER_VERSION::-2}-SNAPSHOT" + VERSION="${GEOSERVER_VERSION%.*}-SNAPSHOT" PLUGIN_FULL_NAME=geoserver-${VERSION}-${PLUGIN_NAME}-plugin.zip - PLUGIN_ARTIFACT_URL=${BASE_BUILD_URL}/${GEOSERVER_VERSION::-2}.x/${TYPE}-latest/${PLUGIN_FULL_NAME} + PLUGIN_ARTIFACT_URL=${BASE_BUILD_URL}/${GEOSERVER_VERSION%.*}.x/${TYPE}-latest/${PLUGIN_FULL_NAME} fi ;; esac - - if [ ! -e "${PLUGIN_ARTIFACT_DIRECTORY}" ]; then - mkdir -p "${PLUGIN_ARTIFACT_DIRECTORY}" - fi - - - download_from_url_to_a_filepath "${PLUGIN_ARTIFACT_URL}" "${PLUGIN_ARTIFACT_DIRECTORY}/${PLUGIN_FULL_NAME}" } @@ -95,6 +93,23 @@ function download_fonts() { download_from_url_to_a_filepath "${EXTRA_FONTS_URL}" "${FONTS_ARTIFACT_DIRECTORY}/fonts.tar.gz" } +function download_marlin() { + IFS='.' read -r -a marlin_v_arr <<< "$MARLIN_VERSION" + unset IFS + + marlin_major=${marlin_v_arr[0]} + marlin_minor=${marlin_v_arr[1]} + marlin_patch=${marlin_v_arr[2]} + + if [ ! -e "${MARLIN_ARTIFACT_DIRECTORY}" ]; then + mkdir -p "${MARLIN_ARTIFACT_DIRECTORY}" + fi + + marlin_url_1="https://github.com/bourgesl/marlin-renderer/releases/download/v${marlin_major}_${marlin_minor}_${marlin_patch}/marlin-${marlin_major}.${marlin_minor}.${marlin_patch}-Unsafe.jar" + marlin_url_2="https://github.com/bourgesl/marlin-renderer/releases/download/v${marlin_major}_${marlin_minor}_${marlin_patch}/marlin-${marlin_major}.${marlin_minor}.${marlin_patch}-Unsafe-sun-java2d.jar" + download_from_url_to_a_filepath "${marlin_url_1}" "${MARLIN_ARTIFACT_DIRECTORY}/marlin-${marlin_major}.${marlin_minor}.${marlin_patch}-Unsafe.jar" + download_from_url_to_a_filepath "${marlin_url_2}" "${MARLIN_ARTIFACT_DIRECTORY}/marlin-${marlin_major}.${marlin_minor}.${marlin_patch}-Unsafe-sun-java2d.jar" +} function download_geoserver() { clean_up_directory ${GEOSERVER_ARTIFACT_DIRECTORY} @@ -102,7 +117,7 @@ function download_geoserver() { local GEOSERVER_FILE_NAME_NIGHTLY="geoserver-${VERSION}-latest-war.zip" local GEOSERVER_FILE_NAME_STABLE="geoserver-${VERSION}-war.zip" - if [[ ( "${VERSION}" =~ "x" ) || ( "${VERSION}" == "master" ) ]]; then + if [[ ( "${VERSION}" =~ "x" ) || ( "${VERSION}" == "main" ) ]]; then local GEOSERVER_ARTIFACT_URL=${BASE_BUILD_URL}/${VERSION}/${GEOSERVER_FILE_NAME_NIGHTLY} else local GEOSERVER_ARTIFACT_URL=${BASE_BUILD_URL_STABLE}/${VERSION}/${GEOSERVER_FILE_NAME_STABLE} @@ -114,25 +129,39 @@ function download_geoserver() { if [ ! -e "${GEOSERVER_ARTIFACT_DIRECTORY}" ]; then mkdir -p "${GEOSERVER_ARTIFACT_DIRECTORY}" fi - download_from_url_to_a_filepath "${GEOSERVER_ARTIFACT_URL}" "/tmp/geoserver.war.zip" - unzip -p /tmp/geoserver.war.zip geoserver.war > ${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war + if [ -f "${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war" ]; then + rm "${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war" + fi + download_from_url_to_a_filepath "${GEOSERVER_ARTIFACT_URL}" "${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.${GEOSERVER_VERSION}.war.zip" + unzip "${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.${GEOSERVER_VERSION}.war.zip" geoserver.war -d "${GEOSERVER_ARTIFACT_DIRECTORY}" } function build_with_data_dir() { local TAG=${1} - local PULL_ENABLED=${2} - if [[ "${PULL_ENABLED}" == "pull" ]]; then - DOCKER_BUILD_COMMAND="docker build --pull" - else - DOCKER_BUILD_COMMAND="docker build" - fi; - ${DOCKER_BUILD_COMMAND} --no-cache \ - --build-arg GEOSERVER_WEBAPP_SRC=${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war \ + local PULL_ENABLED=${2} + DOCKER_VERSION="$(docker --version | grep "Docker version"| awk '{print $3}' | sed 's/,//')" + case $DOCKER_VERSION in + *"20"*) + if [[ "${PULL_ENABLED}" == "pull" ]]; then + DOCKER_BUILD_COMMAND="docker buildx build --pull" + else + DOCKER_BUILD_COMMAND="docker buildx build" + fi; + ;; + *"19"*) + if [[ "${PULL_ENABLED}" == "pull" ]]; then + DOCKER_BUILD_COMMAND="docker build --pull --no-cache" + else + DOCKER_BUILD_COMMAND="docker build --no-cache" + fi; + ;; + esac + ${DOCKER_BUILD_COMMAND} --build-arg GEOSERVER_WEBAPP_SRC=${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war \ --build-arg PLUG_IN_URLS=$PLUGIN_ARTIFACT_DIRECTORY \ - --build-arg GEOSERVER_DATA_DIR_SRC=${GEOSERVER_DATA_DIR_DIRECTORY} \ - -t geoserver/geoserver:"${TAG}-${GEOSERVER_VERSION}" \ + --build-arg GEOSERVER_DATA_DIR_SRC=${DATADIR_ARTIFACT_DIRECTORY} \ + -t geosolutionsit/geoserver:"${TAG}-${GEOSERVER_VERSION}" \ . } @@ -140,29 +169,47 @@ function build_without_data_dir() { local TAG=${1} local PULL_ENABLED=${2} - if [[ "${PULL_ENABLED}" == "pull" ]]; then - DOCKER_BUILD_COMMAND="docker build --pull" - else - DOCKER_BUILD_COMMAND="docker build" - fi; - ${DOCKER_BUILD_COMMAND} --no-cache \ - --build-arg GEOSERVER_WEBAPP_SRC=${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war \ + DOCKER_VERSION="$(docker --version | grep "Docker version"| awk '{print $3}' | sed 's/,//')" + case $DOCKER_VERSION in + *"20"*) + docker builder prune --all -f + if [[ "${PULL_ENABLED}" == "pull" ]]; then + DOCKER_BUILD_COMMAND="docker buildx build --pull" + else + DOCKER_BUILD_COMMAND="docker buildx build" + fi; + ;; + *"19"*) + if [[ "${PULL_ENABLED}" == "pull" ]]; then + DOCKER_BUILD_COMMAND="docker build --pull --no-cache" + else + DOCKER_BUILD_COMMAND="docker build --no-cache" + fi; + ;; + esac + ${DOCKER_BUILD_COMMAND} --build-arg GEOSERVER_WEBAPP_SRC=${GEOSERVER_ARTIFACT_DIRECTORY}/geoserver.war \ --build-arg PLUG_IN_URLS=$PLUGIN_ARTIFACT_DIRECTORY\ - -t geoserver/geoserver:"${TAG}-${GEOSERVER_VERSION}" \ + -t geosolutionsit/geoserver:"${TAG}-${GEOSERVER_VERSION}" \ . } function main { help ${ALL_PARAMETERS} + clean_up_directory download_geoserver "${GEOSERVER_VERSION}" - clean_up_directory ${PLUGIN_ARTIFACT_DIRECTORY} + create_plugins_folder + # download_plugin ext monitor + # download_plugin ext control-flow + # download_plugin ext geofence-plugin + # download_plugin ext geofence-server-plugin + # download_plugin community sec-oauth2-geonode + #download_marlin - if [[ ${GEOSERVER_DATA_DIR_RELEASE} = "nodatadir" ]]; then - build_without_data_dir "${TAG}" "${PULL}" - else - clean_up_directory ${DATADIR_ARTIFACT_DIRECTORY} - build_with_data_dir "${TAG}" "${PULL}" - fi + if [ "${GEOSERVER_DATA_DIR_RELEASE}" = "nodatadir" ]; then + build_without_data_dir "${TAG}" "${PULL}" + else + build_with_data_dir "${TAG}" "${PULL}" + fi } main diff --git a/hooks/build b/hooks/build index b6d52b1..312e0df 100644 --- a/hooks/build +++ b/hooks/build @@ -1,7 +1,6 @@ #!/bin/bash -x -#PLUG_IN_LIST="monitor control-flow" -PLUG_IN_LIST="" +PLUG_IN_LIST="monitor control-flow libjpeg-turbo" NIGHTLY_MASTER_PLUG_IN_VERSION="2.$(expr $MIDDLE_STABLE + 1)-SNAPSHOT" NIGHTLY_STABLE_PLUG_IN_VERSION="2.$MIDDLE_STABLE-SNAPSHOT" NIGHTLY_MAINT_PLUG_IN_VERSION="2.$(expr $MIDDLE_STABLE - 1)-SNAPSHOT" @@ -52,28 +51,5 @@ for VERSION in $STABLE_VERSION $MAINT_VERSION; do --build-arg PLUG_IN_URLS="./resources/geoserver-plugins" \ -f "$DOCKERFILE_PATH" \ -t "${DOCKER_REPO}:$VERSION" . - if [ "$VERSION" == "$LATEST_VERSION" ]; then - docker tag "${DOCKER_REPO}:$VERSION" "${DOCKER_REPO}:latest" - fi rm -rf ./resources/geoserver-plugins/* done - -for VERSION in RC_VERSION; do - GEOSERVER_URL="https://netcologne.dl.sourceforge.net/project/geoserver/GeoServer/$VERSION/geoserver-$VERSION-war.zip" - mkdir -p ./resources/geoserver-plugins - for PLUG_IN_NAME in $PLUG_IN_LIST; do - echo $PLUG_IN_NAME - echo $VERSION - mkdir -p ./resources/geoserver-plugins - URL="https://netcologne.dl.sourceforge.net/project/geoserver/GeoServer/$VERSION/extensions/geoserver-$VERSION-$PLUG_IN_NAME-plugin.zip" - wget $URL -O ./resources/geoserver-plugins/geoserver-$PLUG_IN_VERSION-$PLUG_IN_NAME-plugin.zip - done - var=$(IFS=$'\ '; echo "${PLUG_IN_URLS[*]}" ) - docker build \ - --build-arg GEOSERVER_WEBAPP_SRC="$GEOSERVER_URL" \ - --build-arg PLUG_IN_URLS="./resources/geoserver-plugins" \ - -f "$DOCKERFILE_PATH" \ - -t "${DOCKER_REPO}:$VERSION" . - rm -rf ./resources/geoserver-plugins/* -done - diff --git a/hooks/push b/hooks/push index 4334c3c..ba957ad 100644 --- a/hooks/push +++ b/hooks/push @@ -9,15 +9,6 @@ for NIGHTLY_VERSION in $NIGHTLY_MASTER_VERSION $NIGHTLY_STABLE_VERSION $NIGHTLY_ done for VERSION in $STABLE_VERSION $MAINT_VERSION; do - if [ "$(grep $VERSION /tmp/failed_versions)" == "" ]; then - docker push "${DOCKER_REPO}:$VERSION" - if [ "$VERSION" == "$LATEST_VERSION" ]; then - docker push "${DOCKER_REPO}:latest" - fi - fi -done - -for VERSION in $RC_VERSION; do if [ "$(grep $VERSION /tmp/failed_versions)" == "" ]; then docker push "${DOCKER_REPO}:$VERSION" fi diff --git a/hooks/test b/hooks/test index 5a01433..60add2f 100755 --- a/hooks/test +++ b/hooks/test @@ -9,7 +9,3 @@ for VERSION in $STABLE_VERSION $MAINT_VERSION; do #export VERSION=$VERSION timeout 10m docker-compose -f docker-compose.test.yml run --rm sut || ( echo "test for docker image geoserver:$VERSION failed" && echo $VERSION >> /tmp/failed_versions ) done - -for VERSION in $RC_VERSION; do - timeout 10m docker-compose -f docker-compose.test.yml run --rm sut || ( echo "test for docker image geoserver:$VERSION failed" && echo $VERSION >> /tmp/failed_versions ) -done