Introduction

Le projet E-Victime est une application de gestion de victime, de poste de secours et du personnel associé.


1. Information

Cette documentation est également disponible au format PDF dans la section Releases.


2. Présentation de l’équipe

3. Mise en place

Cette partie documente les étapes de mise en place des différents micro-services présents dans ce projet.

3.1. Backend

Chaque service backend est dans le cadre de notre projet déployée sur un cluster Kubernetes.
Pour notre déployment en production nous utilisons la CI/CD Gitlab afin de compiler, mettre dans un container puis déployer l’image sur Gitlab.

Les étapes de réalisation de cette documentation sont application à un système Linux et ne sont pas testées pour les systèmes Windows, des différences mineurs peuvent être présentes notamment pour les installations en local.

3.1.1. Prérequis

Lancement locale
  • Java 8 + variable JAVA_HOME définie

  • Internet

Installation dans un conteneur
  • Docker / Podman (non testé)

  • Internet

Dans tous les cas
  • PostgreSQL

3.1.2. Personnels

Voici les différentes méthodes d’installation pour le micro-service de gestion du Personnel.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/personnel.jar

Le micro-service est maintenant accessible depuis http://localhost:8080.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/personnel.jar app.jar
ADD /firebaseAccount.json firebaseAccount.json

EXPOSE 8080

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=prod","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec la base de données il faut adapter le fichier src/main/resources/application-prod.properties.
Afin de pouvoir établir la liaison avec le service de découverte il peut être nécessaire d’adapter les champs defaultZone et hostname du fichier src/main/resources/bootstrap.yaml.
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  POSTGRES_DB: spring
  POSTGRES_USER: spring
  POSTGRES_PASSWORD: "P@ssw0rd"
  POSTGRES_HOST_AUTH_METHOD: trust
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: ci
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/personnel.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  services:
    - postgres:12.2-alpine
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/victime.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Victime\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/personnel.jar
      - build_info

test:
  stage: test
  services:
    - postgres:12.2-alpine
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  services:
    - postgres:12.2-alpine
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy personnel-backend
#    - kubectl -n e-victime set image deployment/personnel-backend personnel-backend=registry.gitlab.com/uf-web/backend/personnel:${CI_COMMIT_SHORT_SHA} --record
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/personnel/-/tree/master

3.1.3. Postes

Voici les différentes méthodes d’installation pour le micro-service de gestion des Postes.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/poste.jar

Le micro-service est maintenant accessible depuis http://localhost:8181.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/poste.jar app.jar

EXPOSE 8181

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=prod","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec la base de données il faut adapter le fichier src/main/resources/application-prod.properties.
Afin de pouvoir établir la liaison avec le service de découverte il peut être nécessaire d’adapter les champs defaultZone et hostname du fichier src/main/resources/bootstrap.yaml.
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  POSTGRES_DB: spring
  POSTGRES_USER: spring
  POSTGRES_PASSWORD: "P@ssw0rd"
  POSTGRES_HOST_AUTH_METHOD: trust
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: ci
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/poste.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  services:
    - postgres:12.2-alpine
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/victime.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Victime\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/poste.jar
      - build_info

test:
  stage: test
  services:
    - postgres:12.2-alpine
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy poste-backend
#    - kubectl -n e-victime set image deployment/poste-backend poste-backend=registry.gitlab.com/uf-web/backend/poste:${CI_COMMIT_SHORT_SHA} --record
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  services:
    - postgres:12.2-alpine
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/poste/-/tree/master

3.1.4. Victimes

Voici les différentes méthodes d’installation pour le micro-service de gestion des Victimes.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/victime.jar

Le micro-service est maintenant accessible depuis http://localhost:8282.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/victime.jar app.jar

EXPOSE 8282

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=prod","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec la base de données il faut adapter le fichier src/main/resources/application-prod.properties.
Afin de pouvoir établir la liaison avec le service de découverte il peut être nécessaire d’adapter les champs defaultZone et hostname du fichier src/main/resources/bootstrap.yaml.
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  POSTGRES_DB: spring
  POSTGRES_USER: spring
  POSTGRES_PASSWORD: "P@ssw0rd"
  POSTGRES_HOST_AUTH_METHOD: trust
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: ci
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/victime.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  services:
    - postgres:12.2-alpine
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/victime.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Victime\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/victime.jar
      - build_info

test:
  stage: test
  services:
    - postgres:12.2-alpine
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  services:
    - postgres:12.2-alpine
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy victime-backend
#    - kubectl -n e-victime set image deployment/victime-backend victime-backend=registry.gitlab.com/uf-web/backend/victime:${CI_COMMIT_SHORT_SHA} --record
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/victime/-/tree/master

3.1.5. Discovery

Voici les différentes méthodes d’installation pour le micro-service de monitoring.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/discovery.jar

Le micro-service est maintenant accessible depuis http://localhost:8080.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/discovery.jar app.jar

EXPOSE 8383

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec les autres micro-services il peut être nécessaire d’adapter la variable hostname dans le fichier src/main/resources/application.properties
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: ci
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/discovery.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/discovery.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Discovery\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/discovery.jar
      - build_info

test:
  stage: test
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy discovery-backend
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/discovery/

3.1.6. Gateway

Voici les différentes méthodes d’installation pour le micro-service de monitoring.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/gateway.jar

Le micro-service est maintenant accessible depuis http://localhost:8080.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/gateway.jar app.jar

EXPOSE 8383

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=prod","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec le service de découverte il peut être nécessaire d’adapter les champs defaultZone et hostname du fichier src/main/resources/bootstrap.yaml.
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: ci
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/gateway.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/gateway.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Gateway\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/gateway.jar
      - build_info

test:
  stage: test
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy gateway-backend
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/gateway/

3.1.7. Admin

Voici les différentes méthodes d’installation pour le micro-service de monitoring.

Lancement locale

Pour lancer ce micro-service en local il faut dans un premier temps le compiler puis lancer l’exécution du programme.

Ces étapes sont à réaliser dans le dossier du micro-service.
$ ./mvnw package
$ java -jar /target/admin.jar

Le micro-service est maintenant accessible depuis http://localhost:8080.

Conteneurisation

Pour la génération du conteneur en CI/CD nous utilisons ce fichier Dockerfile.

FROM openjdk:8-jdk-alpine

VOLUME /tmp
ADD /target/admin.jar app.jar

EXPOSE 8383

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=default","-jar","/app.jar"]
Afin de pouvoir établir la liaison avec le service de découverte il peut être nécessaire d’adapter les champs defaultZone et hostname du fichier src/main/resources/bootstrap.yaml.
Déploiement en CI/CD

En production nous utilisons la CI/CD gitlab avec la configuration ci-dessous. En plus de déployer notre solution elle effectue un versionnement automatique du projet.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .m2/repository

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  GSG_RELEASE_BRANCHES: master
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: default
  MAVEN_OPTS: " -Dmaven.repo.local=./.m2/repository"
  RELEASE_FILE: "target/admin.jar"

stages:
  - version
  - build
  - test
  - package
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

maven-build:
  image: maven:3-jdk-8
  stage: build
  before_script:
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
    - 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
    - eval `ssh-agent -s`
    - echo "${DEPLOYMENT_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - git config --global user.email "contact@antoinethys.com"
    - git config --global user.name "Gitlab CI"
    - sed -i "13s/.*/       <version>$(<.next-version)<\/version>/" pom.xml
    - git add pom.xml
    - git commit -m "Change version in POM from $CI_COMMIT_SHORT_SHA [skip ci]" || echo "No changes, nothing to commit!"
    - git remote rm origin && git remote add origin git@gitlab.com:$CI_PROJECT_PATH.git
    - git push origin HEAD:$CI_COMMIT_REF_NAME
  script:
    - mvn package -B
    - ./release test-git --list-other-changes || true
    - ./release test-api
    - ./release -v
    - ./release help
    - echo "RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/discovery.jar" > build_info
    - echo "RELEASE_DESC=\"Micro-Service Discovery\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - target/admin.jar
      - build_info

test:
  stage: test
  services:
    - postgres:12.2-alpine
  image: maven:3-jdk-8
  script:
    - mvn test

package:
  stage: package
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info

    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download -f "$RELEASE_FILE" -d "$RELEASE_DESC"
  cache:
    paths:
      - ./release
  only:
    - master

deploy:
  stage: package
  image: maven:3.3.9-jdk-8
  script:
    - 'mvn deploy -s ci_settings.xml'
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy admin-backend
  only:
    - master

after_script:
  - echo "End CI/CD"
Les autres fichiers utilisés lors de l’exécution sont disponibles à la racine du dépôt : https://gitlab.com/e-victime/backend/admin/

3.2. Clients

3.2.1. Client

Le client du projet E-Victime est compilé via la CI/CD pour les plateformes Windows et Linux. Pour une compilation à destination de MacOS une compilation manuelle depuis un système MacOS est possible.

Compilation en CI/CD

A l’issue de cette pipeline les packages pour :

  • Linux (SNAP)

  • Linux (AppImage)

  • Windows (NSIS)

sont disponibles dans la section Releases du dépôt.

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .npm/
    - .yarn/
    - .cache/
    - cache/
    - node_modules/

variables:
  REPO_NAME: gitlab.com/$CI_PROJECT_PATH
  GSG_RELEASE_BRANCHES: master
  ELECTRON_CACHE: .cache/electron
  ELECTRON_BUILDER_CACHE: .cache/electron-builder

stages:
  - version
  - dependencies
  - prepare
  - build
  - deploy

before_script:
  - echo "Start CI/CD"

version:
  image: alpine:latest
  stage: version
  before_script:
    - echo "Start CI/CD"
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
  cache:
    paths:
      - ./release
  only:
    - master

prepare:
  stage: dependencies
  image: electronuserland/builder:wine
  script:
    - yarn install --cache-folder .yarn/ --prefer-offline --production=false
  artifacts:
    paths:
      - node_modules/
  cache:
    paths:
      - node_modules/

build-angular:
  stage: prepare
  image: electronuserland/builder:wine
  before_script:
    - echo "Start CI/CD"
  script:
    - yarn run angular-build
    - yarn run pack -wl
  artifacts:
    expire_in: 1 day
    paths:
      - dist/
      - www/
      - distElectron/
      - cache/
      - .cache/

build-executables:
  stage: build
  image: electronuserland/builder:wine
  before_script:
    - echo "Start CI/CD"
  script:
    - yarn run dist -wl
    - echo "SNAP_RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/distElectron/e-victime-linux.AppImage" > build_info
    - echo "SNAP_RELEASE_DESC=\"Client e-victime pour Linux (SNAP)\"" >> build_info
    - echo "APPIMAGE_RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/distElectron/e-victime-linux.snap" >> build_info
    - echo "APPIMAGE_RELEASE_DESC=\"Client e-victime pour Linux (AppImage)\"" >> build_info
    - echo "WIN_RELEASE_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/distElectron/e-victime-win.exe" >> build_info
    - echo "WIN_RELEASE_DESC=\"Client e-victime pour Windows\"" >> build_info
    - echo "RELEASE_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "RELEASE_VERSION=$(<.next-version)" >> build_info
  artifacts:
    paths:
      - distElectron/e-victime-linux.AppImage
      - distElectron/e-victime-linux.snap
      - distElectron/e-victime-win.exe
      - build_info

build-image:
  stage: build
  image: docker:stable
  variables:
    DOCKER_DRIVER: overlay2
    IMAGE_TAG: $CI_REGISTRY_IMAGE
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $IMAGE_TAG:${CI_COMMIT_SHORT_SHA}
    - docker tag $IMAGE_TAG $IMAGE_TAG:latest
    - docker push $IMAGE_TAG

release:
  stage: deploy
  image: alpine:latest
  script:
    - rm -f release_info
    - mv build_info release_info
    - . release_info
    - ./release changelog
    - ./release commit-and-tag CHANGELOG.md release_info
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download-link -n e-victime-win.exe -u $WIN_RELEASE_URL -d "$WIN_RELEASE_DESC"
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download-link -n e-victime-linux.AppImage -u $APPIMAGE_RELEASE_URL -d "$APPIMAGE_RELEASE_DESC"
    - ./release --ci-commit-tag v$RELEASE_VERSION add-download-link -n e-victime-linux.snap -u $SNAP_RELEASE_URL -d "$SNAP_RELEASE_DESC"
  cache:
    paths:
      - ./release
  artifacts:
    paths:
      - release_info
      - changelog
  only:
    - master

k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" > kubeconfig
    - kubectl --kubeconfig kubeconfig apply -f deployment.yml --namespace=e-victime
    - kubectl -n e-victime rollout restart deploy app-frontend
  only:
    - master

after_script:
  - echo "End CI/CD"
Compilation manuelle
MacOS
  1. Cette étape n’a pas été testé sur les plateformes de type MacOS et pourrait ne pas fonctionner.

  2. Afin d’obtenir un paquet installable sur MacOS ces étapes sont à effectué sur un système MacOS.

Prérequis

Avant de pouvoir préparer la compilation il faut au préalable installer quelques dépendances localement :

  • NodeJS >= 10 (testé avec la version 14.1.0)

  • Yarn >= 1.22.0 (testé avec la version 1.22.4)

Dépendances

Ce projet utilisant Yarn il est fortement déconseillé d’installer les dépendances avec npm.
Ne pas suivre cette recommandation pourrait provoquer des problèmes de compatibilités.

Compilation du package
$ yarn install (1)
$ yarn run angular-build (2)
$ yarn run dist -- [args] (3)
1 Installation des dépendances.
2 Compilation d’Angular.
3 Il faut ici ajouter le(s) argument(s) pour la compilation à destination de la plateforme désirée :
  • -w (Windows)

  • -l (Linux)

  • -m (MacOS)

Pour la compilation d’un package pour MacOS il peut être nécessaire de modifier la configuration de electron-builder dans le fichier package.json.
Cf. Documentation d’electron-builder

4. Fonctionnement

4.1. API

Une documentation des spécifications de chaque API est disponible en ligne.
Cette documentation est un portage du fichier généré par SpringFox vers un container hébergeant Swagger UI.

Cette documentation est disponible à l’adresse https://api.e-victime.antoinethys.com/swagger-ui/

Documentation des micro-services
Recherche sur les micro-services

Certains micro-services contiennent une méthode route permettant d’effectuer des recherches.
Les arguments à utiliser (specs) ne sont pas afficher par Swagger-UI.
Vous trouverez une documentation complète sur le dépôt Github de Spring Search.

Voici un exemple de l’interface :

Swagger-UI

4.2. Base de données

Ce projet traite un grand nombre de données.
Voici le schéma de la base de données utilisée pour ce projet.

Diagramme BDD

Appendix A: Informations sur la documentation

Cette documentation est entièrement écrite en [AsciiDoc], nous utilisons ensuite [AsciiDoctor] dans un script [Ruby] pour la convertir en fichier [HTML] mise en ligne sur Gitlab [Pages].

Les sources de la documentation sont disponibles ici.

A.1. Déploiement de la documentation

Le déploiement de cette documentation sur Gitlab [Pages] ne contient que 3 étapes, l’installation des dépendances puis exécution d’un script [Ruby] une fois pour générer le fichier PDF et une fois pour le fichier html.

image: ruby:alpine

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - vendor/ruby
    - release

stages:
  - version
  - deploy
  - release

version:
  stage: version
  image: alpine:latest
  before_script:
    - apk add wget
    - wget https://juhani.gitlab.io/go-semrel-gitlab/download/v0.21.1/release
    - chmod +x release
  script:
    - ./release next-version --allow-current > .next-version
  artifacts:
    paths:
      - .next-version
      - release
      - build_info
  cache:
    paths:
      - ./release
  only:
    - master

pages:
  stage: deploy
  script:
    - echo "DOC_PDF_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/doc/index.pdf" > build_info
    - echo "DOC_PDF_DESC=\"Fichier PDF de la documentation du projet E-Victime\"" >> build_info
    - echo "DOC_HTML_URL=https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$CI_JOB_ID/artifacts/public/index.html" >> build_info
    - echo "DOC_HTML_DESC=\"Fichier HTML de la documentation du projet E-Victime\"" >> build_info
    - echo "DOC_SHA=$CI_COMMIT_SHA" >> build_info
    - echo "DOC_VERSION=$(<.next-version)" >> build_info
    - export PATH=$PATH:vendor/ruby
    - bundle install -j $(nproc) --path=vendor/ruby
    - echo "Génération du fichier HTML."
    - rake 'doc:html'
    - echo "Génération du fichier PDF."
    - rake 'doc:pdf'
  artifacts:
    paths:
    - doc/index.pdf
    - public
    - build_info
  only:
  - master

release:
  stage: release
  script:
    - echo "Création du fichier d'information de la relase"
    - rm -f release_info
    - mv build_info release_info
    - . release_info
    - echo "Génération du Changelog"
    - ./release changelog
    - echo "commit des informations et du changelog"
    - ./release commit-and-tag CHANGELOG.md release_info
    - echo "Création du TAG de version"
    - ./release --ci-commit-tag v$DOC_VERSION add-download-link -n PDF -u $DOC_PDF_URL -d "$DOC_PDF_DESC"
    - ./release --ci-commit-tag v$DOC_VERSION add-download-link -n HTML -u $DOC_HTML_URL -d "$DOC_HTML_DESC"

A.2. Génération manuelle de la documentation

Il est également possible de lancer la génération de la documentation depuis les sources.

$ bundle install
$ rake doc:html
Génération de la documentation
Fichier : public/index.html

$ rake doc:pdf
Génération de la documentation
Fichier : doc/index.pdf
Pour fonctionner Ruby > 2.7.0 est nécessaire.

Appendix B: Technologies utilisées