Intégration Continue Jenkins sous Linux pour le Déploiement Automatique de Projets Spring Boot avec Gogs

Ce guide détaille la mise en place d'une chaîne d'intégration continue (CI) avec Jenkins sur un environnement Linux, visant à automatiser le déploeiment de projets Spring Boot connectés à un dépôt Gogs.

Prérequis et Configuration Initiale

  • Installation de Jenkins : Suivez les instructions pour installer Jenkins sur votre système Linux.
  • Gestion des Plugins Jenkins : En cas de difficultés à trouver ou installer des plugins depuis l'interface Jenkins (par exemple, le plugin Maven), il est possible de télécharger manuellement les fichiers .hpi et de les téléverser via la section "Avancé" des paramètres de gestion des plugins. Un exemple concerne le plugin Maven, téléchargeable depuis des dépôts comme http://updates.jenkins-ci.org/download/plugins/maven-plugin/2.14/maven-plugin.hpi.
  • Installation de Maven : Configurez Maven sur votre serveur Linux pour gérer les dépendances et la compilation de vos projets Spring Boot.
  • Installation de Git : Assurez-vous que Git est installé pour permettre à Jenkins de récupérer le code source depuis votre dépôt Gogs.
  • Configuration des Identifiants Git dans Jenkins : Établissez la connexion sécurisée entre Jenkins et votre dépôt Gogs en configurant les identifiants appropriés.
  • Configuration des Projets Spring Boot : Adaptez la configuration de vos projets Spring Boot pour les environnements cibles, potentiellement via des fichiers de propriétés spécifiques ou des variables d'environnement.
  • Notifications de Build : Intégrez des mécanismes de notification (par exemple, via le plugin DingTalk) pour être alerté des succès ou échecs de build. Le plugin DingTalk peut également être installé manuellement en téléchargeant le fichier .hpi depuis http://updates.jenkins-ci.org/download/plugins/dingding-notifications/.

Stratégie de Déploiement via Docker

La stratégie adoptée consiste à utiliser Docker pour conteneuriser chaque microservice Spring Boot. Jenkins déclenchera la construction d'images Docker personnalisées pour chaque service, puis lancera des conteneurs à partir de ces images.

Gestion des Conteneurs et Images Docker

Les commandes suivantes illustrent comment interagir avec Docker pour gérer les conteneurs et les images :


# Entrer dans un conteneur en cours d'exécution
docker exec -it <ID_CONTENEUR> /bin/sh
 

Structure des Dockerfiles et Scripts de Build

Pour chaque microservice, un Dockerfile est nécessaire pour définir l'image. Les scripts shell (.sh) accompagnent ces Dockerfiles pour automatiser le processus de build et de déploiement via Jenkins.

Exemple de Dockerfile pour un Service Spring Boot

FROM openjdk:11-jdk-alpine
VOLUME /app
COPY target/mon-service-app-0.0.1-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar","--spring.profiles.active=production"]
 

Scripts et Dockerfiles Spécifiques par Service

1. Service API Gateway

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/api-gateway-0.0.1-SNAPSHOT.jar /app/api-gateway.jar
ENTRYPOINT ["java","-jar","/app/api-gateway.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/api-gateway/target/api-gateway-0.0.1-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/api-gateway"
IMAGE_NAME="myregistry/api-gateway:latest"
CONTAINER_NAME="api-gateway-container"

# Préparation du répertoire de déploiement
mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

# Arrêt et suppression des anciens conteneurs
docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

# Suppression des anciennes images
docker rmi ${IMAGE_NAME} || true

# Construction de la nouvelle image Docker
cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

# Lancement du nouveau conteneur
docker run -d --name ${CONTAINER_NAME} --network=host -p 8080:8080 ${IMAGE_NAME}
 
2. Service Config Server

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/config-server-0.0.1-SNAPSHOT.jar /app/config-server.jar
ENTRYPOINT ["java","-jar","/app/config-server.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/config-server/target/config-server-0.0.1-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/config-server"
IMAGE_NAME="myregistry/config-server:latest"
CONTAINER_NAME="config-server-container"

mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

docker rmi ${IMAGE_NAME} || true

cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

docker run -d --name ${CONTAINER_NAME} --network=host -p 8888:8888 ${IMAGE_NAME}
 
3. Service Digital Center

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/digital-center-0.0.1-SNAPSHOT.jar /app/digital-center.jar
ENTRYPOINT ["java","-jar","/app/digital-center.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/digital-center/target/digital-center-0.0.1-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/digital-center"
IMAGE_NAME="myregistry/digital-center:latest"
CONTAINER_NAME="digital-center-container"

mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

docker rmi ${IMAGE_NAME} || true

cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

docker run -d --name ${CONTAINER_NAME} --network=host -p 8084:8084 ${IMAGE_NAME}
 
4. Service Model Server

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/model-server-1.0.0-SNAPSHOT.jar /app/model-server.jar
ENTRYPOINT ["java","-jar","/app/model-server.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/model-server/target/model-server-1.0.0-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/model-server"
IMAGE_NAME="myregistry/model-server:latest"
CONTAINER_NAME="model-server-container"

mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

docker rmi ${IMAGE_NAME} || true

cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

docker run -d --name ${CONTAINER_NAME} --network=host -p 8091:8091 ${IMAGE_NAME}
 
5. Service MQ Center

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/mq-center-server-0.0.1-SNAPSHOT.jar /app/mq-center.jar
ENTRYPOINT ["java","-jar","/app/mq-center.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/mq-center/target/mq-center-server-0.0.1-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/mq-center"
IMAGE_NAME="myregistry/mq-center:latest"
CONTAINER_NAME="mq-center-container"

mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

docker rmi ${IMAGE_NAME} || true

cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

docker run -d --name ${CONTAINER_NAME} --network=host -p 8083:8083 ${IMAGE_NAME}
 
6. Service App Demo

FROM openjdk:11-jdk-alpine
VOLUME /app
ADD target/appdemo-0.0.1-SNAPSHOT.jar /app/appdemo.jar
ENTRYPOINT ["java","-jar","/app/appdemo.jar","--spring.profiles.active=prod"]
 

#!/bin/bash

WORKSPACE_DIR="/var/jenkins_home/workspace/MonProjetCI"
JAR_PATH="${WORKSPACE_DIR}/appdemo/target/appdemo-0.0.1-SNAPSHOT.jar"
DEPLOY_DIR="/opt/microservices/appdemo"
IMAGE_NAME="myregistry/appdemo:latest"
CONTAINER_NAME="appdemo-container"

mkdir -p ${DEPLOY_DIR}
cp ${JAR_PATH} ${DEPLOY_DIR}/

docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true

docker rmi ${IMAGE_NAME} || true

cd ${DEPLOY_DIR}
docker build -t ${IMAGE_NAME} .

docker run -d --name ${CONTAINER_NAME} --network=host -p 8070:8070 ${IMAGE_NAME}
 

Étiquettes: Jenkins CI Linux Docker Spring Boot

Publié le 8 juillet à 03h01