Skip to content

LAB : Création d'une pipeline multibranche#

Présentation#

Un pipeline multibranche (multibranch pipeline) dans Jenkins est un type de pipeline qui détecte automatiquement toutes les branches d’un dépôt Git (comme GitHub) et crée un pipeline distinct pour chacune.

L'intéret est de permettre de pouvoir tester, builder, et déployer indépendamment chaque branche GIT et de pouvoir se baser sur les branches pour déclencher des process de déploiement automatsés vers différents environnements.

Objectifs:#

  • Mise en place d'une pipeline multibranche sur jenkins pour gèrer plusieurs plusieurs branches dans un meme projet
  • Automatisez le build d'application pour chaque branche GIT
  • Configuration des credentials de communication entre Jenkins et Github

Prérequis#

  • Connaissance de Docker et GIT
  • Instance docker fonctionnel
  • Editeur de code
  • Utilitaire installé sur la machine: git
  • Avoir un compte sur Github
  • Avoir un proxy nginx fonctionnel (voir lab deploy reverse proxy sur la section 03-conteneurisation)
  • Avoir un jenkins de fonctionnel voir lab précèdent

Déroulement du Lab#

Etape 1 : Configuration de Github#

1- Création du token sur GitHub

  • Se rendre sur son compte Github, cliquer sur le profil, puis sur Settings

  • Ensuite se rendre sur Developer settings, puis Personal access tokens et ensuite sur Tokens (classic)

  • Cliquer sur Generate new tokeni (classic)

  • Renseigner sur la partie Note : token-github, selectionner les scopes : repo, user et project, et cliquer sur Generate token

  • Copier le token généré et le sauvegarder. Comme avec Dockerhub, pour des raisons de sécurité,ce token ne pourra etre visualisé qu'une fois.

2- Hébergement du code SpringBoot sur GitHub

  • Création du repo sur Github

Se rendre sur la page d'accueil de GitHub, cliquer sur le "+", puis sur New repository

Renseigner springboot-react-app dans Repository name, puis mettre la description Mon application Springbootet rendre le projet private
Enfin cliquer sur create repository

  • Récupèration du code SpringBoot
git clone https://github.com/wingufactory/lecloudfacile-devops-labs.git
cd lecloudfacile-devops-labs/springboot-react-app 
  • Push du code SpringBoot sur Github

Dans cette partie, on va pousser notre code dans le repository Github créé précèdemment

Se rendre dans le dossier contenant le code, et rajouter un fichier .gitgnore avec comme contenu .env pour éviter de pousser des secrets sur GitHub

cd lecloudfacile-devops-labs/springboot-react-app
echo ".env" >> .gitignore

Pousser le code vers GitHub N.B : Remplacer <username> et <usermail> par ses propres identifiants Github

git init
git config user.email "<usermail>"
git config user.name "<Prenom et Nom>"
git remote add origin https://github.com/<username>/springboot-react-app.git
git branch -M main
git add .
git commit -m "first init"
git push -u origin main

Etape 2 : Ajout du Credential Github sur Jenkins#

Comme durant le lab précèdent, on va renseigner, dans les credentials de Jenkins, le token Github généré précèdemment

Dans les identifiants globaux des credentials, créer un nouveau credential comme ci-dessous :

  • Renseigner le nom d'utilisateur de son compte GitHub dans le champs Nom d'utilisateur
  • Renseigner dans le champs Mot de passe le token génèré sur GitHub
  • Dans le champ ID, renseigner token-github-jenkins
  • Dans le champ Description, renseigner Identifiants de connexion à Github
  • Enfin cliquer sur Create

Etape 3 : Ajout du Jenkinsfile sur Github#

  • Se rendre en ligne de terminal et dans le dossier springboot-react-app pour créer, depuis la branche main, un nouveau fichier nommé Jenkinsfile avec le contenu suivant:

N.B : Remplacer l'utilisateur lecloudfacile par vos propres noms d'utilisateurs de DockerHub et GitHub

pipeline {
    agent any // Utilise n'importe quel agent Jenkins disponible

    stages {
        stage('Clone Project') {
            steps {
                // Clone automatiquement la branche courante dans un pipeline multibranch
                checkout scm
            }
        }

        stage('Build Docker Image') {
            steps {
                // Construction de l'image Docker pour le backend
                sh 'docker build -t moodboard-backend-app:1.0.0 moodboard-backend'

                // Construction de l'image Docker pour le frontend
                sh 'docker build -t moodboard-frontend-app:1.0.0 moodboard-frontend'
            }
        }

        stage('Tag Docker Image') {
            steps {
                // Tag des images Docker avec les noms de dépôt sur Docker Hub
                sh 'docker image tag moodboard-frontend-app:1.0.0 lecloudfacile/moodboard-frontend-app:1.0.0'
                sh 'docker image tag moodboard-backend-app:1.0.0 lecloudfacile/moodboard-backend-app:1.0.0'
            }
        }

        stage('Push to DockerHub') {
            steps {
                echo "Pushing image to Docker Hub..."

                // Utilisation des identifiants Jenkins pour se connecter à Docker Hub
                withCredentials([usernamePassword(
                    credentialsId: "token-dockerhub-jenkins", 
                    usernameVariable: "DOCKER_USER", 
                    passwordVariable: "DOCKER_PASSWORD"
                )]) {
                    // Connexion et push des images Docker vers Docker Hub
                    sh """
                        echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USER" --password-stdin
                        docker push lecloudfacile/moodboard-frontend-app:1.0.0
                        docker push lecloudfacile/moodboard-backend-app:1.0.0
                    """
                }
            }
        }

        stage('Deploy to Environment') {
            steps {
                script {
                    // Étape conditionnelle de déploiement selon la branche
                    if (env.BRANCH_NAME == 'dev') {
                        echo 'Deploy code to DEV'
                    } else if (env.BRANCH_NAME == 'main') {
                        echo 'Deploy code to PROD'
                    } else {
                        // Pour les autres branches, aucun déploiement n'est effectué
                        echo "No deployment step for branch: ${env.BRANCH_NAME}"
                    }
                }
            }
        }
    }
}

  • Pousser les modifications sur GitHub
git add Jenkinsfile
git commit -m "Ajout pipeline"
git push origin main
  • Créer une branche dev et repousser les modifications sur Github
git checkout dev
git push origin dev

Etape 4 : Création du pipeline multibranch sur Jenkins#

Se rendre sur Jenkins pour créer le pipeline multibranch qui va exécuter notre pipeline en fonction des différentes branches

  • Créer un nouveau job de type Pipeline Multibranches en lui donnant le nom build-springboot-multibranch

  • Dans la section Branch Sources, cliquer sur Add source et sélectionner Github

  • Puis renseigner l'url du projet Github https://github.com/<username>/springboot-react-app.git et sélectionner le credential de connexion à Github renseigné précèdemment

  • Cliquer sur Save

Le pipeline va scanner toutes les branches existantes et éxécuter le Jenkinsfile s'y trouvant

Etape 5 : Vérification#

  • En retournant à la racine de notre job, on peut voir nos deux branches main et dev.

  • En cliquant sur la branche de dev et sur console output du job lancé en dev, on peut voir le résultat de la sortie de notre stage de déploiement qui renvoie le résultat Deploy code to DEV.

  • De meme sur le job de la branche main, on voit le résultat Deploy code to PROD