Skip to main content

Command Palette

Search for a command to run...

Intégration continue et déploiement continu avec code Pepeline de AWS [Application Java]

Updated
16 min readView as Markdown
Intégration continue et déploiement continu avec code Pepeline de AWS [Application Java]

Lien de projet sur Github

Lien de la vidéo Youtube

Prérequis

  • AWS Account

  • AWS Cloud Services
    1. AWS CodeCommit ( en tant que référentiel du système de contrôle de version)
    2. AWS Codebuild ( pour construire l'image )
    3. AWS Codedeploy ( en tant que service de déploiement d'artefacts)
    4. AWS Codeartifact ( en tant que référentiel Maven pour les dépendances)
    5. S3 Bucket ( stockage des artefacts)
    6. AWS Codepipeline ( service pour intégrer toutes les tâches ensemble)

  • AWS CLI

  • Git

  • SonarCloud

Flux d'exécution

  • Connectez-vous au compte AWS

  • Configuration du dépôt de code
    a. Créez un dépôt Codecommit
    b. Synchronisez-le avec le référentiel local

  • Configuration de l'artefact de code
    a. Créez un référentiel
    b. Mettez à jour le fichier settings.xml dans le référentiel
    c. Mettez à jour le fichier pom.xml dans le référentiel
    d. Générez et stockez le jeton dans le store de paramètres SSM

  • Configuration du SonarCloud
    a. Créez un compte SonarCloud
    b. Générez et stocker le jeton dans le store de paramètres SSM
    c. Créez un projet de build !
    d. Mettez à jour le rôle de build de code pour accéder au store de paramètres SSM

  • Créez une notification SNS

  • Configurez le projet de construction
    a. Mettez à jour pom.xml avec la version de l'artefact
    b. Créez des variables dans le store de paramètres SSM
    c. Créez un projet de build
    d. Mettre à jour le rôle Codebuild pour accéder au magasin de paramètres SSM

  • Créez un pipeline
    a. Codecommit
    b. Test de code
    c. Codebuild
    d. CodeDeploy sur le compartiment S3

  • Testez le pipeline

  • Créez Beanstalk et RDS.

  • Mettre à jour le groupe de sécurité RDS.

  • Déployez la base de données dans RDS.

  • Basculez vers la branche cd-aws

  • Mettez à jour les fichiers settings.xml et pom.xml

  • Créez une autre tâche de build pour générer un artefact avec le fichier buildspec

  • Créez une tâche de déploiement sur beanstalk

  • Téléchargez la capture d'écran sur le compartiment s3

  • Créez une tâche de build pour les tests logiciels

  • Mettre à jour le pipeline

  • Tester le pipeline

Étape 1 : configuration d'AWS CodeCommit

Connectez-vous à votre console de gestion AWS, recherchez le service CodeCommit, sélectionnez le référentiel et créez un référentiel nommé :

Nom : vprofile-code-repo

Créez un utilisateur IAM didié au référentiel CodeCommit , ainsi qu'une stratégie pour le Codecommit qui permet un accès complet au dépôt vprofile-code-repo. Nommez la stratégie vprofile-code-admin-repo-fullaccess.

Pour créer un IAM et attacher la stratégie spécifiquement au référentiel CodeCommit, suivez les étapes ci-dessous :

Naviguez dans IAM > cliquez sur Ajouter un utilisateur
Nom d'utilisateur IAM : vprofile-code-admin

Ensuite créez une stratégie à attacher

service : CodeCommit 
nom : vprofile-code-repo 
action : all
Nom de la stratégie : vprofile-code-admin-repo-fullaccess

Attachez la stratégie à l'utilisateur IAM.

Après la création de l'utilisateur IAM, nous devrons télécharger la clé publique SSH dans la section Informations d'identification de sécurité de l'utilisateur nouvellement créé. Cela se fait en générant une paire de clé SSH sur la machine locale et en téléchargeant la clé publique ssh sur les informations d'identification de sécurité du rôle IAM. (Clés publiques SSH pour la section AWS CodeCommit)

De plus, nous devons également mettre à jour la configuration. Dans le répertoire .ssh, créez un fichier .ssh/config et ajoutez les informations sur l'hôte ssh.

Host git-codecommit.us-east-1.amazonaws.com
    User <SSH_Key_ID_from IAM_user>
    IdentityFile ~/.ssh/vpro-codecommit_rsa

Assurez-vous de modifier les autorisations de fichier pour lire et écrire avec cette commande chmod 600 config

Testez que la connexion ssh à CodeCommit est établie et authentifiée avec succès avec la commande ci-dessous.

ssh git-codecommit.us-east-1.amazonaws.com

Ensuite, clonez le référentiel sur votre machine local depuis Github en utilisant l'URL git@github.

Lien Github.

Convertissez le référentiel github en référentiel CodeCommit. Pour ce faire, assurez-vous d'être dans le référentiel cloné et exécutez les commandes ci-dessous :

git checkout master
git branch -a | grep -v HEAD | cur -d'/' -f3 | grep -v master > /tmp/branches
for i in `cat  /tmp/branches`; do git checkout $i; done
git fetch --tags
git remote rm origin
git remote add origin ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/vprofile-code-repo
cat .git/config
git push origin --all
git push --tags

Observez maintenant que le référentiel distant est désormais passée de Github à Codecommit. Utilisez la commande cat .git/config pour vérifier.

Transférez le code source vers Codecommit

Vérifiez pour confirmer que le référentiel contient notre code sur Codecommit. Le dépôt est désormais prêt avec toutes les branches présentes sur AWS Codecommit.

Étape 2 : configuration CodeArtifact d'AWS et store de paramètres

Créez un référentiel CodeArtifact pour Maven :

Nom: vprofile-maven-repo
Repo public en amont: maven-central-store
Nom de domaine: visualpath
et cliquez sur créer

Suivez les instructions de connexion fournies dans CodeArtifact pour le vprofile-maven-repo qui vient d'être créé**.** cliquez sur afficher les instructions de connexion, sélectionnez votre type de machine et continuez.

Créez l'utilisateur IAM pour CodeArtifact nommé vprofile-cart-admin , téléchargez la clé d'accès, attachez à cet utilisateur les autorisations AWSCodeArtifactAdminAccess et configurez l'utilisateur sur AWS CLI avec ses informations d'identification.

Exécutez aws configure sur votre machine pour configurer les informations d'identification.

aws configure # entrez vos informations d'identification d'utilisateur IAM

La commande ci-dessous provient des instructions de connexion, copiez exécutez la commande dans votre terminal à l'aide d'AWS CLI.


export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain visualpath --domain-owner <aws account ID> --region us-east-1 --query authorizationToken --output text`

Utilisez cette commande ci-dessous pour imprimer le jeton sur votre terminal

echo $CODEARTIFACT_AUTH_TOKEN

Procédez à la mise à jour des fichiers pom.xml et settings.xml avec les URL correctes suggérées dans les instructions de connexion.

Ensuite, envoyez les deux fichiers vers CodeCommit.

git add .
git commit -m "message" (add you commit message)
git push origin ci-aws

Étape 3 : Configurer SonarCloud

Créez un compte si vous n'en avez pas déjà un sur la site Web officiel sonarcloud.io

Cliquez sur l'avatar du compte > Mon compte > Sécurité. Donnez un nom au jeton vprofile-sonartoken > cliquez sur générer.

Ensuite, nous créons un projet, cliquez sur le signe + dans le coin supérieur droit de la page > Analyser le projet > Créer un projet manuellement. Notez ci-dessous les informations qui seront utilisées dans notre travail de construction.

Remarque : Créez votre organisation unique et votre clé de projet, mais n'oubliez pas de les conserver en toute sécurité.

Organisation : Name-projects 
Clé du projet : Name-vprofile-repo 
URL sonarcloud : sonarcloud.io 
jeton généré : <>

Étape 4 : AWS Systems Manager Parameter Store pour SonarCloud

Créez des paramètres avec les variables ci-dessous:

CODEARTIFACT_TOKEN   Type:SecureString    Value: (value of echo $CODEARTIFACT_AUTH_TOKEN)
HOST                 Value: https://sonarcloud.io type: string
ORGANIZATION         Value:Name-projects type: string
PROJECT              Value: Name-vprofile-repo type: string
SONARTOKEN           Value: vprofile-sonartoken geenrated token SecureString

Étape 5 : AWS CodeBuild pour l'analyse du code SonarQube

Naviguez dans CodeBuild sur votre console de gestion AWS et cliquez sur Créer un projet de build.

ProjectName: Vprofile-Build
Source: CodeCommit
Branch: ci-aws
Environment: Ubuntu
runtime: standard:5.0
select New service role: codebuild009-Vprofile-Build-service-role 
Insert buildspec content from directory aws-files/sonar_buildspec.yml, cat its content and past in the insert build command tab
under Logs > GroupName: vprofile-buildlogs
StreamName: sonarbuildjob

Assurez-vous que les sections paramètres du fichier sonar_buildspec.yml sont mises à jour avec les noms exacts donnés dans le store de paramètres SSM.

Cliquez sur Modifier > environnement et copiez le nom du rôle affiché et cliquez sur Annuler pour ajouter une politique au rôle de service créé pour ce projet Build

Accédez à IAM > cliquez sur Rôles > collez le rôle dans la barre de recherche pour trouver le rôle copié à partir de notre projet de build, le rôle devrait apparaître, cliquez dessus et modifiez pour attacher la stratégie.

Choisissez le service ( System Manager ), Dans le niveau d'accès Liste cochez la case**Describeparameter

Également dans le niveau d'accès Lecture, sélectionnez les cases de paramètres comme indiqué ci-dessous.

Vérifiez et donnez un nom à votre stratégie « vprofile-sonarparameteraccess » , puis cliquez sur Créer une stratégie.

Attachez la stratégie que vous venez de créer au rôle de projet CodeBuild.

Maintenant que CodeBuild dispose de l'autorisation appropriée, procédez à la création du projet en cliquant sur Démarrer la génération.

Une fois la construction terminée, vérifiez les résultats publiés dans SonarCloud.

Étape 6 : Configurer le projet de construction pour l'artefact

Sur votre console AWS, revenez à CodeBuild, puis cliquez sur Créer un projet de build. Encore une fois, les étapes sont similaires à celles précédemment vues lors de la création de build pour l'analyse du code avec DonarCloud.

Name: vprofile-CI-Pipeline
SourceProvider: Codecommit
branch: ci-aws
Change detection options: CloudWatch events
Build Provider: CodeBuild
ProjectName: vprofile-Build-Artifact
BuildType: single build
Deploy provider: Amazon S3
Bucket name: vprofile98-build-artifact
object name: pipeline-artifact

Après avoir créé le projet de build, vous devrez mettre à jour la nouvelle stratégie de rôle de service et pour ce faire, suivez les étapes ci-dessous :

Cliquez sur Génération > Projet de génération > Vprofile-Build-Artifact. Copiez le nom du rôle de service (voir la capture d'écran ci-dessous)

Ensuite, accédez à IAM > sélectionnez les rôles > recherchez le rôle de service que nous venons de copier > Cliquez dessus > cliquez sur Ajouter des autorisations > cliquez sur l'option attacher des stratégies

Recherchez ensuite et utilisez la stratégie utilisée pour le paramètre sonaraccess créé à la précédente étape. Sélectionnez-le et attachez-le au rôle de service. Cela devrait activer le niveau d'accès à la liste et les autorisations de niveau d'accès en lecture nécessaires pour créer notre Build. (reportez-vous à l'étape 5 pour voir le niveau d'accès complet en lecture et les autorisations des paramètres d'accès en liste)

Avec la politique mise à jour, il est temps de construire notre projet. Revenez à votre CodeBuild, sélectionnez le projet Vprofile-Build-Artifact et cliquez sur Démarrer la génération.

Étape 7 : configurer CodePipeline et notification SNS

Dans votre console AWS, accédez au service SNS et créez une notification SNS. Ensuite, créer un abonnement à une adresse mail valide.

SNS Topic Name: vprofile-pipeline-notification
Topic Type: Standard
subcription protocol: email

Une fois inscrit avec l'e-mail fourni, accédez à votre boîte de réception et confirmez l'abonnement aux notifications.

La prochaine étape consiste à créer CodePipeline avec les détails ci-dessous

Name: vprofile-CI-Pipeline
SourceProvider: Codecommit
branch: ci-aws
Change detection options: CloudWatch events
Build Provider: CodeBuild
ProjectName: vprofile-Build-Aetifact
BuildType: single build
Deploy provider: Amazon S3
Bucket name: vprofile98-build-artifact
object name: pipeline-artifact

Lorsque le pipeline est en cours de création, arrêtez le pipeline et ajoutez une étape de test à votre pipeline en cliquant sur ajouter une étape après l'étape source, nommez-la Test et saisissez les informations ci-dessous.

Action Name: Sonar-Code-Analysis
Action Provider: AWS CodeBuild
input aritfact: SourceArtifact
Project Name Vprofile-Build
Build Type: Select the Single Build

Ajoutez une autre étape après l'étape de Build, nommez-la Deploy et utilisez les informations ci-dessous.

Action Name: Deploy-To-S3
Action provider: Amazom s3
Region: Same region of codebuild
input artifact: BuilArtifact
Deployment Path: pipeline-artifact (this is the folder name created in your s3 bucket for the pipeline)
check the Extract file before deploy option

Assurez-vous d'avoir enregistré le pipeline après avoir ajouté les étapes de test et de déploiement.

L'étape suivante consiste à configurer les notifications. Accédez aux paramètre dans CodePipeline > cliquez sur l’option de notification > les paramètres de règles de notification.

Étape 8 : Tester le CodePipeline

Cliquez sur Publier les modifications et le pipeline devrait commencer à s'exécuter. suivez et assurez-vous que le pipeline s'est exécuté avec succès.

Vous devez vérifier que le pipeline est correctement configuré pour déclencher une tâche lorsque les modifications sont validées. Apportez une modification à n'importe quel code ou fichier README.md, ajoutez et validez les modifications dans la branche source et observez qu'un nouveau job est déclenché. Si cela se produit, votre pipeline est correctement configuré et prêt à passer à l’étape suivante.

Étape 9 : Créer un environnement Elastic Beanstalk

Configurez un environnement à l’aide d’un exemple d’application.

Name: vprofile-app
Plateform: Tomcat
Platform branch: Tomcat 8.5
Capacity: LoadBalanced
    Min: 2
    Max: 4
Keypair : Choose existing key-pair usedin previous steps

Étape 10 : Créer une base de données RDS MySQL

Créez un service RDS en utilisant les informations ci-dessous.

Remarque : N'oubliez pas de noter le mot de passe (vous le trouverez dans [Afficher les détails des informations d'identification]. Il sera utilisé plus tard lors de la configuration de votre base de données.

Engine: MySQL
version: 5.7
Template: use the Free-Tier
DB Identifier: vprofile-cicd-mysql
credentials: admin
Auto generate password (will take note of pwd once RDS is created)
DB instance class: db.t2.micro
Create new SecGrp Named: vprofile-cicd-rds-mysql-sg
In Additional Configurations: initial db name "accounts"

Étape 11 : Mettre à jour le groupe de sécurité RDS

Accédez aux instances Beanstalk créées et copiez son ID de groupe de sécurité. Procédez à la mise à jour des règles entrantes du groupe de sécurité RDS pour autoriser l'accès aux instances Beanstalk sur le port 3306.

Étape 12 : Déployer la base de données dans RDS. (initialisation de la base de données)

connectez vous à l'une des instances beanstalk et installez le client MySQL dans cette instance pour pouvoir se connecter à RDS. Installez également git pour cloner notre code source et nos scripts afin de créer un schéma dans notre base de données. Exécutez les commandes ci-dessous et assurez-vous de mettre à jour vos informations d'identification en conséquence pour le nom d'utilisateur, le mot de passe et le point de terminaison RDS.

sudo -i
yum install mysql git -y
mysql -h <RDS_endpoint> -u <RDS_username> -p<RDS_password>
show databases;
git clone https://github.com/Adutoby/vprofile-project-all.git
cd vprofileproject-all/
git checkout cd-aws
cd src/main/resources
mysql -h <RDS_endpoint> -u <RDS_username> -p<RDS_password> accounts < db_backup.sql
mysql -h <RDS_endpoint> -u <RDS_username> -p<RDS_password>
use accounts;
show tables;

Mise à jour de la surveillance de l'état :

Revenez à Elastic Beanstalk sur votre console AWS, dans l'environnement de votre projet, cliquez sur Configuration > modifiez la section Trafic et mise à l'échelle de l'instance, en particulier type d'équilibreur de charge > Cliquez sur Processus, et mettez à jour le chemin de vérification de l'état avec /login . Enregistrez et appliquez les modifications.

Étape 13 : Mettre à jour les scripts pom.xml & settings.xml

Revenez à CodeCommit et accédez à la branche cd-aws. Mettez à jour les fichiers pom.xml et settings.xml comme nous l'avons fait plus haut dans le projet dans la branche ci-aws et validez les modifications.

Dans le pom.xml, ajoutez l'URL correcte à partir des étapes de connexion de votre artefact de code :

<repository>
        <id>codeartifact</id>
        <name>codeartifact</name>
    <url>https://visualpath-<awsaccountid>.d.codeartifact.us-east-1.amazonaws.com/maven/maven-central-store/</url>
      </repository>

Également dans le fichier settings.xml, mettez à jour l'URL à partir de code artefact de (Remarque: assurez-vous de copier à partir des étapes de connexion et de mettre à jour l'URL en fonction de votre compte)

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
        <server>
            <id>codeartifact</id>
            <username>aws</username>
            <password>${env.CODEARTIFACT_AUTH_TOKEN}</password>
        </server>
    </servers>
<profiles>
  <profile>
    <id>default</id>
    <repositories>
      <repository>
        <id>codeartifact</id>
    <url>https://visualpath-<awsaccountid>.d.codeartifact.us-east-1.amazonaws.com/maven/vprofile-maven-repo/</url>
      </repository>
    </repositories>
  </profile>
</profiles>
<activeProfiles>
        <activeProfile>default</activeProfile>
    </activeProfiles>
<mirrors>
  <mirror>
    <id>codeartifact</id>
    <name>visualpath-vprofile-maven-repo</name>
    <url>https://visualpath-<awsaccountid>.d.codeartifact.us-east-1.amazonaws.com/maven/vprofile-maven-repo/</url>
    <mirrorOf>*</mirrorOf>
  </mirror>
</mirrors>
</settings>

Étape 14 : configuration Build

Accédez à Codebuild et modifiez le code source des tâches de build précédentes Vprofile-Build et Vprofile-Build-Artifact de ci-aws à cd-aws puisque nous avons l'intention de construire à partir de la branche cd-aws. Cela déclenchera notre travail à partir de la nouvelle branchbranche cd-aws.e qui est la

Cliquez sur le projet de construction > cliquez sur le projet Vprofile-Build > cliquez sur modifier puis sur source > changez la branche source en cd-aws > cliquez sur mettre à jour les modifications. Répétez la même chose pour la branche source de Vprofile-Build-Artifact.

Créer un projet de construction BuildAndRelease

Créez un nouveau projet de build pour déployer les artefacts sur Elastic Beanstalk. Utilisez les détails ci-dessous:

Name: Vprofile-BuildAndRelease
Repo: CodeCommit
Repository: vprofile-code-repo
branch: cd-aws
In the Environment
Managed image: Ubuntu
select Standard
Image 5.0
Use existing role from previous Build project which has access to SSM Parameter Store
Buildspec: Insert build commands and switch to editor.
(From source code copy the spec file under `aws-files/buildAndRelease_buildspec.yml`)
LogGroup: vprofile-cicd-logs
Streamname: BuildAndReleaseJob

Ensuite, nous devons créer 3 nouveaux paramètres d'environnement qui seront utilisés dans le fichier BuilAndRelease_buildspec.yml dans le store de paramètres SSM. Voir ci-dessous. Si vous rencontrez une erreur avec le jeton d'artefact, régénérez le.

RDS-Endpoint: use String
RDSUSER: Use String
RDSPASS: use SecureString as this is the DB password.

Il est temps de lancer notre projet.

Notre projet de construction s'est exécuté avec succès !

Créez une tâche de build pour les tests logiciels.

De retour dans le projet de construction, nous créerons un autre projet qui exécutera nos scripts d'automatisation Selenium et stockera les artefacts dans le compartiment S3. Tout d’abord, nous devrons créer le bucket S3.

Name: vprofile-cicd-testoutput-rd (you need to have a unique name for your S3 bucket)
Region: You bucket must be in same region where you create your pipeline

Une fois le compartiment créé, nous créerons un nouveau projet de construction pour les tests d'automatisation Selenium en utilisant les détails ci-dessous :

Name: SoftwareTesting
Repo: CodeCommit
branch: seleniumAutoScripts
in the Environment section:
Operating systen: Windows Server 2019
Runtime: Base
Image: 1.0
Use existing role from previous Build project which has access to SSM Parameter Store
Insert build commands: 
From source code we will get spec file under `aws-files/win_buildspec.yml`.
Update url part to your Elastic Beanstalk URL.

Artifacts:
Type: S3
Bucketname: vprofile-cicd-testoutput-toby
Enable semantic versioning
Artifcats packaging: zip
LogGroup: vprofile-cicd-logs
Streamname:

Étape 15 : Créer un pipeline

Créez un CodePipeline avec le nom vprofile-cicd-pipeline. utilisez les détails ci-dessous pour le configurer :

Pipeline name: vprofile-cicd-pipeline
Source provider: CodeCommit
Repository name: vprofile-code-repo
Branch name: cd-aws
select Amazon CloudWatch Events
select CodePipeline default
Build
Build Provider: CodeBuild
Project Name: Vprofile-BuildAndRelease
Build type: Single Build
Deploy
Deploy provider: Beanstalk
Application name: vprofile-app
Environment name: vprofile-app-env
click on next and create pipeline

Arrêtez le pipeline une fois qu'il est lancé et modifiez-le pour ajouter d'autres étapes.

Après l'étape Source, ajoutez l'étape CodeAnalysis en utilisant les détails ci-dessous :

Name: CodeAnalysis
Action provider: CodeBuild
Input artifacts: SourceArtifact
Project name: Vprofile-Build
Build type: single build

Ajoutez une deuxième étape également appelée étape CodeAnalysis pour créer et stocker les artefacts :

Name: BuildAndStore
Action provider: CodeBuild
Input artifacts: SourceArtifact
Project name: Vprofile-Build-artifact
OutputArtifact: BuildArtifact

Ajoutez ensuite une autre après l’étape BuildAndStore appelée étape DeployTos3. Cette étape déploiera l'artefact sur le compartiment S3 :

Name: DeployToS3
Action provider: Amazon S3
Input artifacts: BuildArtifact
Bucket name: vprofile98-build-artifact
check the Extract file before deploy box

Modifiez les artefacts de sortie des étapes Build et Deploy. Remplacez le nom de l'artefact de sortie par BuildArtifactToBeanStalk .

Modifiez à nouveau l'étape de déploiement, remplacez InputArtifact par BuildArtifactToBeanStalk.

Enfin, ajoutez après l’étape Deploy une étape pour tester l'application. Utilisez les détails ci-dessous:

Name: Software Testing
Action provider: CodeBuild
Input artifacts: SourceArtifact
ProjectName: SoftwareTesting

Enregistrez et appliquer la modification. Le CodePipeline devrait démarrer automatiquement.

Étape 16 : Notification SNS

Sélectionnez le pipeline > Cliquez sur Notifier > Cliquez sur Gérer la notification. Créez une nouvelle notification et enregistrez.

vprofile-aws-cicd-pipeline-notification
Select all
Notification Topic: use same topic from CI pipeline

Étape 17 : Valider et tester

Le pipeline s'est exécuté avec succès.

Revenez à votre environnement Elastic Beanstalk et récupérez le domaine ou le point de terminaison, collez-le dans un navigateur et vous devriez voir votre site Web opérationnel.

Si vous disposez de plusieurs instances, vous devrez activer la persistance de session. vous le trouverez en modifiant la section Trafic d'instance et mise à l'échelle dans la configuration, en particulier Type d'équilibreur de charge > Cliquez sur Processus > Action > modifier, puis recherchez les sessions, > activez la persistance de session en cochant la case. Assurez-vous de suivre ces étapes si vous avez plus d'une instance définie comme instance minimale dans vos configurations d'équilibrage de charge.

Nom d'utilisateur : admin_vp 
Mot de passe : admin_vp

Félicitation !!! Vous avez arrivez à bout du projet.

More from this blog

D

Devops Projects with Yanis

27 posts