На сервер с Jenkins скачиваем JMeter
Так же понадобится JMeterPluginsCMD
Создадим директорию для хранения:
mkdir -p /var/lib/jmeter
Скачаем и разархивируем в эту директорию содержимое двух архивов.
Чтобы структура была следующая:
root@jenkins:~# ll /var/lib/jmeter/ total 64K drwxr-xr-x 8 jenkins jenkins 4.0K Apr 24 15:39 . drwxr-xr-x 37 root root 4.0K Mar 22 10:29 .. drwxr-xr-x 5 jenkins jenkins 4.0K Apr 24 17:47 bin drwxr-xr-x 5 jenkins jenkins 4.0K Mar 10 08:41 docs drwxr-xr-x 2 jenkins jenkins 4.0K Mar 10 08:43 extras drwxr-xr-x 4 jenkins jenkins 4.0K Apr 24 17:47 lib -rw-r--r-- 1 jenkins jenkins 15K Mar 10 10:08 LICENSE drwxr-xr-x 4 jenkins jenkins 4.0K Mar 10 10:08 licenses -rw-r--r-- 1 jenkins jenkins 172 Mar 10 10:08 NOTICE drwxr-xr-x 6 jenkins jenkins 4.0K Mar 10 09:58 printable_docs -rw-r--r-- 1 jenkins jenkins 10K Mar 10 10:08 README.md
Создаем репозиторий со следующим содержимым.
Создаем в Jenkins'е Item для Multibranch Pipeline.
Содержимое Jenkinsfile:
pipeline { agent any parameters { string(name: 'SERVER_URL', defaultValue: 'example.org', description: 'URL for load test') string(name: 'SITE_PATH', defaultValue: '/', description: 'Path for URL. Default - "/"') string(name: 'NUMBER_OF_THREADS', defaultValue: '10', description: 'Number of Threads (Users). Default - 10') string(name: 'RAMP_TIME', defaultValue: '5', description: 'Ramp-Up Period. Default - 5(sec)') string(name: 'DURATION_TIME', defaultValue: '5', description: 'Duration (seconds). Default - 5') string(name: 'STARTUP_DELAY', defaultValue: '5', description: 'Startup delay (seconds). Default - 5') booleanParam(name: 'DELETE_CACHE', defaultValue: false, description: 'Toggle this value to build with cache clearing.') } options { ansiColor('xterm') timeout(time: 30, unit:'MINUTES') timestamps() } environment { def ANT = '/usr/bin/ant' def JMETER = '/var/lib/jmeter/bin/jmeter' def JMETER_HOME = '/var/lib/jmeter/' def TEMPLATE = 'SITE_SIMPLE.jmx' // Perository def GIT_REPO = 'https://git.artem.services/scm/dev/jenkins-jmeter.git' def GIT_CRED = 'svc-bitbucket' // Slack def SLACK_CHANNEL_ID = credentials('artem-slack-channel-id-debug') def SLACK_TOKEN = credentials('artem-slack-token') def GIF_SUCCESS = giphySearchRandomByKeyword(credentialsId: 'giphy-api-key', keyword: "hacker", rating: 'g', imageSize: 'downsized_medium') } stages { stage ('Delete work dir') { when { expression { return params.DELETE_CACHE } } steps { deleteDir() git branch: "${BRANCH_NAME}", credentialsId: "${GIT_CRED}", url: "${GIT_REPO}" } } stage ('Configure template') { when { branch 'master' } steps { sh 'envsubst < "ant/templates/\"${TEMPLATE}\"" > "ant/templates/\"${TEMPLATE}\".tmp"' sh 'envsubst < "ant/build/build.properties" > "ant/build.properties"' } } stage ('Load test') { when { branch 'master' } steps { sh "cd ant && ${ANT} clean" sh "cd ant && ${ANT} run" sh "cd ant && ${ANT} generate-report" sh "cd ant && ${ANT} generate-chart" sh "wget ${GIF_SUCCESS} -O ant/result/success.gif" } } } post { always { sh "rm ant/templates/${TEMPLATE}.tmp | true" sh "rm ant/build.properties | true" } success { slackSend channel: "${SLACK_CHANNEL_ID}", color: 'good', message: "Perfomance test domain: `\"${SERVER_URL}\"` was successful." script { sh "chmod +x ./upload_images.sh" sh "./upload_images.sh ${SLACK_CHANNEL_ID} ${SLACK_TOKEN}" } } failure { slackSend channel: "${SLACK_CHANNEL_ID}", color: 'danger', message: "Perfomance test domain: `\"${SERVER_URL}\"` was finished with some error. Watch the Jenkins Console Output: ${JOB_URL}${BUILD_ID}/consoleFull" } } }
Item выполняет нагрузочное тестирование, формирует отчет и png графики, и отправляет графики в Slack канал. В данном Item'е используется Giphy Plugin, или подключите его, или удалите его строки с "Jenkinsfile" и "upload_images.sh"
Для команды "ant generate-chart" могут потребоваться дополнительные плагины, для этого нужно перейти в директорию с содержимым репозитория и выполнить команду:
ant install-plugins
Результат тестирования: