diff --git a/.gitignore b/.gitignore index aa28f31a2eaacfaceca21c7b173d98b5dce00c5a..726ebb434b9b643c55b402c1878f633ee28d1119 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ /target -/source \ No newline at end of file +/source +/.metadata +/.settings +/.classpath +/.project \ No newline at end of file diff --git a/README.md b/README.md index 16f68583706091e37220afb1405f017ab1842e1a..8dfa6b478b16957b1d39eb1e193064b39833dd6c 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ +# Geosource - - +## Download dependency ```bash mkdir source cd source -wget -O geonetwork-3.8.3-0.war https://sourceforge.net/projects/geonetwork/files/GeoNetwork_opensource/v3.8.3/geonetwork.war/download +wget -O geonetwork-3.10.2-0.war https://sourceforge.net/projects/geonetwork/files/GeoNetwork_opensource/v3.10.2/geonetwork.war/download cd .. ``` +## Build geosource war in local maven repository -# install geosource war in local maven repository -#./mvnw install:install-file -DgroupId=org.geonetwork-opensource -DartifactId=geosource -Dversion=3.0.1-0 -Dpackaging=war -Dfile=./source/geosource-3.0.1-0.war - -./mvnw install:install-file -DgroupId=org.geonetwork-opensource -DartifactId=geonetwork -Dversion=3.8.3-0 -Dpackaging=war -Dfile=./source/geonetwork-3.8.3-0.war && ./mvnw clean package - -# build war overlay -./mvnw clean package \ No newline at end of file +```bash +./mvnw install:install-file -DgroupId=org.geonetwork-opensource -DartifactId=geonetwork -Dversion=3.10.2-0 -Dpackaging=war -Dfile=./source/geonetwork-3.10.2-0.war && ./mvnw clean package +``` \ No newline at end of file diff --git a/cicd/Jenkinsfile b/cicd/Jenkinsfile new file mode 100644 index 0000000000000000000000000000000000000000..e04e3700593d7b8cc7b7589c1bd9084980e02c01 --- /dev/null +++ b/cicd/Jenkinsfile @@ -0,0 +1,54 @@ +pipeline { + agent any + options { disableConcurrentBuilds() } + stages { + stage('Fetch dependencies') { + agent any + steps { + sh 'cicd/build/0_fetch-dependencies.sh' + stash includes: 'node_modules/', name: 'node_modules' + } + } + stage('Lint') { + agent any + steps { + unstash 'node_modules' + sh 'cicd/build/1_lint.sh' + } + } + stage('Build prod') { + agent any + steps { + unstash 'node_modules' + sh 'cicd/build/3_build-prod.sh' + stash includes: 'dist/', name: 'dist' + } + } + stage('Make release') { + agent any + steps { + unstash 'dist' + sh 'cicd/build/5_make_release.sh' + stash includes: 'jenkins_release/', name: 'jenkins_release' + } + } + stage('Make docker') { + agent any + steps { + unstash 'jenkins_release' + sh 'cicd/build/6_make_docker.sh' + stash includes: 'jenkins_release/', name: 'jenkins_release' + } + } + } + post { + success { + unstash 'jenkins_release' + archiveArtifacts artifacts: 'jenkins_release/*.tar.gz', onlyIfSuccessful: true + archiveArtifacts artifacts: 'jenkins_release/*.docker', onlyIfSuccessful: true + } + always { + sh 'cicd/build/99_clean.sh' + } + } +} diff --git a/cicd/build/0_fetch-dependencies.sh b/cicd/build/0_fetch-dependencies.sh new file mode 100755 index 0000000000000000000000000000000000000000..419f20cd4386d0f58479d1f8ac289188f87f21dc --- /dev/null +++ b/cicd/build/0_fetch-dependencies.sh @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +. $SCRIPTDIR/env.sh + +# Create docker +docker run \ + -d \ + --name $DOCKER_NAME \ + -v "$SCRIPTDIR/../..":/home/node/app \ + -w /home/node/app \ + node:12-stretch \ + sh -c 'while sleep 3600; do :; done' +# Run in daemon process +# Define the container name +# Mount this code in the container +# Define the default working directory +# Docker image used +# Command wait infinitly compatible with many docker image + +# Modify user right +docker exec $DOCKER_NAME \ + /bin/bash -c "chown -R node:node /home/node/app;" + +# Exec +docker exec --user node:node $DOCKER_NAME /bin/bash -c " \ + set -e; \ + npm install;" + +# Reset user right +USER_ID=`id -u` +GROUP_ID=`id -g` +docker exec $DOCKER_NAME /bin/bash -c " \ + chown -R $USER_ID:$GROUP_ID /home/node/app" + +# Stop docker +docker rm -f $DOCKER_NAME diff --git a/cicd/build/1_lint.sh b/cicd/build/1_lint.sh new file mode 100755 index 0000000000000000000000000000000000000000..3ed6c0f691a657eec00a0f4cb2103d78e65bd56c --- /dev/null +++ b/cicd/build/1_lint.sh @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +. $SCRIPTDIR/env.sh + +# Create docker +docker run \ + -d \ + --name $DOCKER_NAME \ + -v "$SCRIPTDIR/../..":/home/node/app \ + -w /home/node/app \ + node:12-stretch \ + sh -c 'while sleep 3600; do :; done' +# Run in daemon process +# Define the container name +# Mount this code in the container +# Define the default working directory +# Docker image used +# Command wait infinitly compatible with many docker image + +# Modify user right +docker exec $DOCKER_NAME \ + /bin/bash -c "chown -R node:node /home/node/app;" + +# Exec +docker exec --user node:node $DOCKER_NAME /bin/bash -c " \ + set -e; \ + npm run lint;" + +# Reset user right +USER_ID=`id -u` +GROUP_ID=`id -g` +docker exec $DOCKER_NAME /bin/bash -c " \ + chown -R $USER_ID:$GROUP_ID /home/node/app" + +# Stop docker +docker rm -f $DOCKER_NAME diff --git a/cicd/build/2_test-end-to-end.sh b/cicd/build/2_test-end-to-end.sh new file mode 100755 index 0000000000000000000000000000000000000000..99cd133883737c2ed4e9e51bd22d88a666c8699f --- /dev/null +++ b/cicd/build/2_test-end-to-end.sh @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +. $SCRIPTDIR/env.sh + +# Create docker +docker run \ + -d \ + --name $DOCKER_NAME \ + -v "$SCRIPTDIR/../..":/home/node/app \ + -w /home/node/app \ + node:12-stretch \ + sh -c 'while sleep 3600; do :; done' +# Run in daemon process +# Define the container name +# Mount this code in the container +# Define the default working directory +# Docker image used +# Command wait infinitly compatible with many docker image + +# Modify user right +docker exec $DOCKER_NAME \ + /bin/bash -c "chown -R node:node /home/node/app;" + +# Exec +docker exec --user node:node $DOCKER_NAME /bin/bash -c " \ + set -e; \ + npm run e2e;" + +# Reset user right +USER_ID=`id -u` +GROUP_ID=`id -g` +docker exec $DOCKER_NAME /bin/bash -c " \ + chown -R $USER_ID:$GROUP_ID /home/node/app" + +# Stop docker +docker rm -f $DOCKER_NAME diff --git a/cicd/build/3_build-prod.sh b/cicd/build/3_build-prod.sh new file mode 100755 index 0000000000000000000000000000000000000000..5a3ee1b556db921ed12781df00edc8cd87cbae24 --- /dev/null +++ b/cicd/build/3_build-prod.sh @@ -0,0 +1,41 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +. $SCRIPTDIR/env.sh + +# Create docker +docker run \ + -d \ + --name $DOCKER_NAME \ + -v "$SCRIPTDIR/../..":/home/node/app \ + -w /home/node/app \ + node:12-stretch \ + sh -c 'while sleep 3600; do :; done' +# Run in daemon process +# Define the container name +# Mount this code in the container +# Define the default working directory +# Docker image used +# Command wait infinitly compatible with many docker image + +# Modify user right +docker exec $DOCKER_NAME \ + /bin/bash -c "chown -R node:node /home/node/app;" + +# Exec +docker exec --user node:node $DOCKER_NAME /bin/bash -c " \ + set -e; \ + npm run prod;" + +# Reset user right +USER_ID=`id -u` +GROUP_ID=`id -g` +docker exec $DOCKER_NAME /bin/bash -c " \ + chown -R $USER_ID:$GROUP_ID /home/node/app" + +# Stop docker +docker rm -f $DOCKER_NAME diff --git a/cicd/build/5_make_release.sh b/cicd/build/5_make_release.sh new file mode 100755 index 0000000000000000000000000000000000000000..3141e56f22049fad4bb81dc88beb887a9e724e6c --- /dev/null +++ b/cicd/build/5_make_release.sh @@ -0,0 +1,17 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +COMMIT=`git rev-parse --short=8 HEAD` +DATE="`date '+%Y%m%dT%H%M'`" +. $SCRIPTDIR/env.sh + +# Make release +mkdir -p jenkins_release/${PROJECT_NAME} + +cp -r dist/jpr_prodige_geosource/* jenkins_release/${PROJECT_NAME}/ +cd jenkins_release +tar -czf ${PROJECT_NAME}_${COMMIT}_${DATE}.tar.gz ${PROJECT_NAME} diff --git a/cicd/build/6_make_docker.sh b/cicd/build/6_make_docker.sh new file mode 100755 index 0000000000000000000000000000000000000000..8df9a14f13dae74dac159123e72ab62e7640eefd --- /dev/null +++ b/cicd/build/6_make_docker.sh @@ -0,0 +1,16 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +COMMIT=`git rev-parse --short=8 HEAD` +DATE="`date '+%Y%m%dT%H%M'`" +. $SCRIPTDIR/env.sh + +# Build docker +docker build -t ${PROJECT_NAME}:${COMMIT} -f cicd/build/docker/Dockerfile . + +# Save image +docker save ${PROJECT_NAME}:${COMMIT} | gzip > jenkins_release/${PROJECT_NAME}_${COMMIT}_${DATE}.docker diff --git a/cicd/build/99_clean.sh b/cicd/build/99_clean.sh new file mode 100755 index 0000000000000000000000000000000000000000..697878324cbb6aff009e21c2cd6dd7a61c732825 --- /dev/null +++ b/cicd/build/99_clean.sh @@ -0,0 +1,32 @@ +#!/bin/sh +set -e + +# Source env file +SCRIPT=`readlink -f $0` +SCRIPTDIR=`dirname $SCRIPT` +SCRIPTNAME=`basename $SCRIPT` +. $SCRIPTDIR/env.sh + +if [ ! "$(docker ps -q -f name=$DOCKER_NAME)" ]; then + if [ "$(docker ps -aq -f status=exited -f name=$DOCKER_NAME)" ]; then + # Clean docker + docker rm -f $DOCKER_NAME + fi + # Create docker + docker run \ + -d \ + --name $DOCKER_NAME \ + -v "$SCRIPTDIR/../..":/home/node/app \ + -w /home/node/app \ + node:12-stretch \ + sh -c 'while sleep 3600; do :; done' +fi + +# Reset user right +USER_ID=`id -u` +GROUP_ID=`id -g` +docker exec $DOCKER_NAME /bin/bash -c " \ + chown -R $USER_ID:$GROUP_ID /home/node/app" + +# Clean docker +docker rm -f $DOCKER_NAME diff --git a/cicd/build/docker/Dockerfile b/cicd/build/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..f9bf47fa61349b7d2f289ec23ebbd84851aa1764 --- /dev/null +++ b/cicd/build/docker/Dockerfile @@ -0,0 +1,5 @@ +FROM nginx:1.17-alpine + +# Copy src +COPY --chown=nginx:nginx jenkins_release/jpr_prodige_geosource /home/www +COPY --chown=root:root cicd/build/docker/nginx.conf /etc/nginx/conf.d/default.conf diff --git a/cicd/build/docker/docker-compose.yml b/cicd/build/docker/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..da36d90434e872e3930bdeee5899733b916ca82b --- /dev/null +++ b/cicd/build/docker/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3' +services: + web: + image: jpr_prodige_geosource # Docker image name + container_name: jpr_prodige_geosource # Docker container name + build: . # Build images with this ./Dockerfile + ports: + - "8080:80" + diff --git a/cicd/build/docker/nginx.conf b/cicd/build/docker/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..c66894149e01cc2d913203c1aa29e3abd7768237 --- /dev/null +++ b/cicd/build/docker/nginx.conf @@ -0,0 +1,7 @@ +server { + listen 80; + root /home/www; + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/cicd/build/env.sh b/cicd/build/env.sh new file mode 100644 index 0000000000000000000000000000000000000000..19030b9846631499aa72682e600eecab2c161f12 --- /dev/null +++ b/cicd/build/env.sh @@ -0,0 +1,3 @@ +#!/bin/bash +PROJECT_NAME="jpr_prodige_geosource" +DOCKER_NAME="${PROJECT_NAME}_build" diff --git a/cicd/dev/.gitignore b/cicd/dev/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3c97eb3ec94b9f296aaab7361f3530b5cc0039f7 --- /dev/null +++ b/cicd/dev/.gitignore @@ -0,0 +1 @@ +/docker-compose.env \ No newline at end of file diff --git a/cicd/dev/Dockerfile b/cicd/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..afeefca04f1f5c5e5178290ddf0e198ae91b37b3 --- /dev/null +++ b/cicd/dev/Dockerfile @@ -0,0 +1,8 @@ +# https://hub.docker.com/ +FROM tomcat:9-jdk8-openjdk + +ADD source/ /usr/local/tomcat/webapps/ + +EXPOSE 8080 + +CMD ["catalina.sh", "run"] \ No newline at end of file diff --git a/cicd/dev/README.md b/cicd/dev/README.md new file mode 100644 index 0000000000000000000000000000000000000000..259e82f31f98d6787e09f000800cef71226047ad --- /dev/null +++ b/cicd/dev/README.md @@ -0,0 +1,117 @@ + +# README +<!-- TOC --> + +- [README](#readme) + - [Overview](#overview) + - [Start developpement](#start-developpement) + - [Stop developpement](#stop-developpement) + - [General Docker commands](#general-docker-commands) + - [Advanced Docker commands](#advanced-docker-commands) + - [Clean commands](#clean-commands) + - [Monitoring commands](#monitoring-commands) + +<!-- /TOC --> + +## Overview + +This file give commands to start development with docker. + +Require: + - Docker installed. + - Docker well configured, cf. **/etc/docker/deamon.json** + - User in docker group to avoid sudo/su right + +## Start developpement + +Make these commands in this directory ```cd ./cicd/dev```. + +Run container +```bash +# Put UID and GID in env file +echo -e "LOCAL_USER_ID=$(id -u)\nLOCAL_GROUP_ID=$(id -g)" > docker-compose.env + +# Build dev image +docker-compose build + +# Run containers +docker-compose up +``` + +In an other terminal, connect as www-data to the dev container +```bash +# Connect to container as node +docker exec --user node -w /home/node/app -it jpr_prodige_geosource_dev_web bash +``` + +In container +```bash +# Install +npm install + +# Serve +npm run dev +``` + +The url web site are http://localhost:4200 + + +## Stop developpement + +Make these commands in this directory ```cd ./cicd/dev```. + +```bash +# Shutdown containers +docker-compose down + +# Remove dev image +docker rmi jpr_prodige_geosource_dev_web +``` + +## General Docker commands + +| Description | Commandes | +|- |- | +| Display images | ```docker images``` | +| Remove image | ```docker rmi myimages``` | +|- |- | +| Display all running containers | ```docker ps``` | +| Display all containers | ```docker ps -a``` | +| Remove container | ```docker rm mycontainer``` | +| Display info container | ```docker inpect mycontainer``` | +| Display container ouput | ```docker logs mycontainer``` | +| Stop container | ```docker stop mycontainer``` | +| Kill container | ```docker kill mycontainer``` | +|- |- | +| Connection as root | ```docker exec --user 0 -w / -it jpr_prodige_geosource_dev_web bash``` | +| Connection as www-data | ```docker exec --user www-data -w /var/www/html -it jpr_prodige_geosource_dev_web bash``` | +| Connection as postgres | ```docker exec --user postgres -it tpl_alkante_symfony_3_dev_db bash``` | +| Run composer install | ```docker exec --user www-data -w /var/www/html -it jpr_prodige_geosource_dev_web composer install ``` | + +## Advanced Docker commands + + +### Clean commands +```bash +# Stop all container +docker stop $(docker ps -a -q) + +# Remove all container +docker rm $(docker ps -a -q) + +# Delete all image with name or tag aas "<none>" +docker rmi `docker images| egrep "<none>" |awk '{print $3}'` +``` + +### Monitoring commands + +```bash +# Watch all container +watch -n 1 "docker ps -a" + +# Watch all images +watch -n 1 "docker images" + +# Watch all resources container +docker stats +``` diff --git a/cicd/dev/docker-compose.yml b/cicd/dev/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..51ee2927c28161d0ac62b36356cf43daaf94db76 --- /dev/null +++ b/cicd/dev/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' +services: + web: + image: jpr_prodige_geosource_dev_web # Docker image name + container_name: jpr_prodige_geosource_dev_web # Docker container name + build: . # Build images with this ./Dockerfile + volumes: + - ../..:/home/node/app # Mount this code sources (../..) in container + environment: + - TZ=Europe/Paris + env_file: + - ./docker-compose.env + ports: + - "4200:4200" \ No newline at end of file diff --git a/cicd/dev/entrypoint-dev b/cicd/dev/entrypoint-dev new file mode 100755 index 0000000000000000000000000000000000000000..e88e3d6b04a4a30d5304541e2d849f7bcc3fec78 --- /dev/null +++ b/cicd/dev/entrypoint-dev @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +echo " # fix uid and gid" +if [ -n "$LOCAL_USER_ID" ] +then + usermod -u $LOCAL_USER_ID node + +fi +if [ -n "$LOCAL_GROUP_ID" ] +then + groupmod -g $LOCAL_GROUP_ID node +fi + +chown node:node /home/node/app + +echo " # sleep infinity" +sleep infinity \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4d2cd2ae1172f415b1071132b99a2e3d4dd99849..3d67a7efed6de4e30d07866b93f4cc66775c3745 100755 --- a/pom.xml +++ b/pom.xml @@ -6,13 +6,13 @@ <groupId>prodige41.alkante.al</groupId> <artifactId>geosource-overlay</artifactId> <packaging>war</packaging> - <version>3.8.3-0</version> + <version>3.10.2-0</version> <dependencies> <dependency> <groupId>org.geonetwork-opensource</groupId> <artifactId>geonetwork</artifactId> - <version>3.8.3-0</version> + <version>3.10.2-0</version> <type>war</type> <scope>runtime</scope> </dependency>