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
-
Antoine Thys (antoine.thys@ynov.com)
-
Développeur Backend
-
Création des micro-services ([Spring-Boot])
-
-
Admin Sys
-
Mise en place de l’infrastructure et de la CI/CD ([Kubernetes], [Gitlab-CI])
-
Rédaction de la documentation ([AsciiDoc])
-
-
-
Louis Lacoste (louis.lacoste@ynov.com)
-
Développeur Frontend
-
Création du client web ([Angular]) et du client lourd ([Electron])
-
-
Développeur Backend
-
Débogage des micro-services ([Spring-Boot])
-
-
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
-
Java 8 + variable
JAVA_HOME
définie -
Internet
-
Docker / Podman (non testé)
-
Internet
-
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)
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
|
Prérequis
Avant de pouvoir préparer la compilation il faut au préalable installer quelques dépendances localement : |
Dépendances
Ce projet utilisant |
$ 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 :
|
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/
Recherche sur les micro-services
Certains micro-services contiennent une méthode route permettant d’effectuer des recherches. |
Voici un exemple de l’interface :
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.
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
B.1. Logiciels
-
IDEs
-
Terminal
-
Microsoft
-
Utilitaires