JMeter Docker (containers)
Sommaire
avancé - This article is part of a series.
Dans cet article, nous allons couvrir l’exécution de JMeter dans un conteneur en utilisant la plate-forme Docker, cet article est nécessaire pour comprendre la dernière étape de JMeter distribué à l’aide de conteneurs, sinon je me retrouverais avec un article assez long et je préfère simplifier le contenu. Sans plus tarder, commençons.
Qu’est-ce qu’un conteneur ? #
Il s’agit essentiellement d’un produit en conserve dans lequel le logiciel nécessaire à l’exécution d’un ou plusieurs processus est installé. Le grand avantage des conteneurs est qu’ils sont portables et que vous pouvez isoler des environnements d’exécution entiers dans un seul fichier. Dans notre cas particulier, nous allons créer un conteneur avec tout le nécessaire pour pouvoir exécuter les scripts JMeter, nous avons donc besoin de :
- Système d’exploitation : Linux Alpine (le roi du Linux compact)
- Java : JDK ou JRE 1.8+
- JMeter : JMeter 5.2.1
Le script JMeter JMX et/ou les fichiers de support seront pour l’instant en dehors du conteneur, mais pourront également être à l’intérieur. Pour plus d’informations sur ce sujet, je vous recommande de visiter ce lien Qu’est-ce qu’un conteneur ?.
Qu’est-ce que Docker ? #
Docker est une plate-forme logicielle qui nous permet de gérer, créer, supprimer et exécuter notre image de conteneur. Docker, comme JMeter, est open source]( https://www.docker.com/community/open-source), nous n’avons donc pas besoin de payer de licence pour l’utiliser. Mais il est toujours bon de faire des dons aux fondations de logiciels libres pour continuer à promouvoir leur développement. Vous trouverez ici une bonne explication de Qu’est-ce que Docker ?.
Comment ça marche ? #
Nous allons créer une image de conteneur à partir d’un fichier Dockerfile, ce fichier contiendra les informations et la configuration nécessaires pour télécharger Alpine Linux, installer Java JRE 1.8+, télécharger et/ou décompresser JMeter. Ensuite, nous exécuterons quelques scripts shell pour initialiser le conteneur et exécuter notre test. À la fin, je mentionnerai comment nous pouvons faire la même chose mais en incluant les plugins JMeter.
Résumé du Processus #
1.- Installer Docker #
Nous devons d’abord installer Docker desktop sur notre ordinateur, je vous invite à télécharger et installer la dernière version disponible, puis à attendre que les processus concernés démarrent pour avoir la CLI activée. Vous pouvez vérifier que Docker est installé dans la ligne de commande comme ceci :
docker --version
Docker version 19.03.8, build afacb8b
2.- Cloner le référentiel #
Je pense que j’ai oublié de le mentionner, mais nous avons également besoin de GIT pour cloner le projet suivant :
git clone https://github.com/daeep/JMeter_Docker.git
cd JMeter_Docker
3.- Compiler l’image #
Nous allons compiler le fichier Dockerfile, qui se trouve dans notre dossier JMeter_Docker, en exécutant simplement le script shell ./build.sh.
4.- Validation #
Nous exécuterons également à partir de ce même dossier l’exemple pour valider que tout fonctionne correctement, en invoquant le script shell ./example.sh. S’il vous demande le mot de passe, c’est parce que les commandes Docker stop, remove et start sont exécutées à l’aide de sudo et cela nécessite des autorisations d’administrateur. Le script shell générera une sortie comme celle-ci :
Si vous avez un résultat similaire, félicitations !
5.- Exécution #
Nous allons copier notre fichier JMX dans le dossier JMeter_Docker/test, mais je vous invite d’abord à paramétrer votre script JMX en suivant les instructions décrites ici, supposons que votre script s’appelle charismatiquement antonio.jmx et que nous souhaitons l’exécuter avec 50 threads, 50 secondes de rampe et avec une durée de 10 minutes ou 600 secondes. Nous l’exécutons à l’aide du script shell ./run.sh dans le dossier JMeter_Docker comme suit :
./run.sh -n -t test/antonio.jmx -l test/antonio-50.jtl -j test/antonio-50.log -Jthreads=50 -Jrampup=50 -Jduration=600
Vous devriez avoir un résultat similaire à celui ci-dessus, si c’est le cas. Vous y êtes parvenu.
JMeter avec plugins, à partir de l’étape 2 #
6.- Cloner le référentiel #
Si votre script nécessite des plugins JMeter, ceux-ci peuvent également être téléchargés depuis le cloud, mais nous ne pouvons pas couvrir ce nombre infini de variantes pour chaque plugin. La meilleure option est d’utiliser notre version locale de JMeter, car elle fonctionne déjà pour le script que nous avons créé, n’est-ce pas ? Supposons que cela soit vrai et que nous ayons déjà téléchargé les modules complémentaires localement. Nous allons d’abord cloner un projet différent :
clone git https://github.com/daeep/JMeter_Local_Docker.git
cd JMeter_Local_Docker
7.- Installer les modules complémentaires et compresser #
Suivez ensuite les instructions pour installer les plugins JMeter et dans le dossier JMeter_Local_Docker/test, vous trouverez le fichier JMeter_Docker_Script_Plugins.jmx, ouvrez-le et les plugins téléchargeront automatiquement le plugin pour le Dummy Sampler, qui est nécessaire pour exécuter ce JMX. Compressons notre dossier JMeter, cela peut être fait en utilisant tarball ou zip, voici un exemple des deux :
tar -czvf apache-jmeter-5.2.1.tgz apache-jmeter-5.2.1
zip -r apache-jmeter-5.2.1.zip apache-jmeter-5.2.1 //alternativement
8.- Copiez les binaires dans l’image #
Nous procédons maintenant à la copie du fichier compressé dans le dossier JMeter_Local_Docker, si vous avez effectué l’étape #C-2 avec le nom comme je l’ai indiqué, vous n’avez rien d’autre à faire que de le construire, passez à l’étape #C-4.
Si vous avez modifié le nom du fichier et/ou du dossier, vous devrez faire de même dans la section #3 du Dockerfile. La valeur de l’argument ARG JMETER_FILE doit correspondre au nom du fichier apache-jmeter-5.2.1.tgz ou apache-jmeter-5.2.1.zip, selon le cas. De plus, la valeur de l’argument ARG JMETER_FOLDER doit correspondre au nom du dossier et enfin, si vous avez utilisé l’utilitaire zip, nous devons également modifier la ligne de décompression utilisée par la commande tar -zvxf en unzip.
9.- Compiler l’image #
Utilisons maintenant à nouveau le script shell ./build.sh pour créer notre image et si tout se passe correctement, nous pouvons exécuter l’exemple de test avec la commande ./example.sh.
Vous pouvez maintenant faire la même chose qu’à l’étape 5 avec votre script de plugin. Félicitations!
Conclusion #
Il existe en fait peu de différences entre les deux fichiers Dockerfile, qu’ils proviennent du projet avec ou sans plugins. J’ai laissé les lignes avec les différences ci-dessous. Pour écrire cet article je me suis basé sur le projet GIT de Just van den Broecke qui est disponible ici, j’ai apporté quelques modifications à la version originale, mais je vous invite quand même à son projet. À titre de remarque supplémentaire, Docker accorde par définition 2 Go de mémoire aux conteneurs. Si vous souhaitez exécuter des tests à des fins éducatives avec plus de threads, je vous recommande d’augmenter cette valeur.
Image Docker JMeter en YAML : sans plugins ou avec plugins #
-----------------------------------------------------------------------------
# 3 Copy local JMeter to the image and set environment variables
ARG JMETER_FILE="apache-jmeter-5.2.1.tgz" //Definimos el archivo comprimido
ARG JMETER_FOLDER="apache-jmeter-5.2.1" //Definimos la carpeta
COPY ${JMETER_FILE} /tmp/
# 4 Update & Upgrade, then decompress local JMeter and delete tar ball file
RUN apk update \
&& apk upgrade \
&& apk add ca-certificates \
&& update-ca-certificates \
&& apk add --update openjdk8-jre tzdata curl unzip bash \
&& apk add --no-cache nss \
&& rm -rf /var/cache/apk/* \
&& mkdir -p ${JMETER_HOME} \
&& tar -zvxf /tmp/${JMETER_FILE} -C /home/jmeter/ \ //Copiamos los binarios a la imagen
&& rm -f /tmp/${JMETER_FILE}
-----------------------------------------------------------------------------
# 3 Set JMeter version 5.2.1 for downloading and some ENV variables
ENV JMETER_VERSION 5.2.1
ENV JMETER_FOLDER /home/jmeter/
ENV JMETER_DOWNLOAD https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz
//Definimos la ruta donde estan los binarios comprimidos de JMeter en la nube
# 4 Update, upgrade, download Java JRE and JMeter then decompress it
RUN apk update \
&& apk upgrade \
&& apk add ca-certificates \
&& update-ca-certificates \
&& apk add --update openjdk8-jre tzdata curl unzip bash \
&& apk add --no-cache nss \
&& rm -rf /var/cache/apk/* \
&& mkdir -p /tmp/jmeter/ \
&& curl -L --silent ${JMETER_DOWNLOAD} > /tmp/jmeter/apache-jmeter-${JMETER_VERSION}.tgz \ //Descargamos JMeter
&& mkdir -p ${JMETER_FOLDER} \
&& tar -xzf /tmp/jmeter/apache-jmeter-${JMETER_VERSION}.tgz -C ${JMETER_FOLDER} \ //Descomprimir JMeter
&& rm -rf /tmp/jmeter
-----------------------------------------------------------------------------