Synchronize LoadRunner Enterprise with Git
This topic describes how to use the Micro Focus LoadRunner Enterprise integration with Git plugin to synchronize LoadRunner Enterprise with Git by uploading LoadRunner and JMeter scripts and tests stored in a GitHub repository to a LoadRunner Enterprise project.
Create a Git repository
To synchronize scripts, copy the LoadRunner scripts generated in VuGen (or JMeter tests which are also supported) to one or several sub-folders in your GitHub repository.
You can create a new Git repository, or use an existing one to store your performance test scripts.
In the example below, the Git repository contains a folder named "scripts", and within it, different folders, each containing a performance script.
The plugin identifies each folder that contains a .usr or .jmx file, which it compresses, and uploads to LoadRunner Enterprise.
Create hooks that automatically trigger a Jenkins build on a Git commit
To trigger a Jenkins build after committing a script with changes to the Git repository, do the following:
-
In Github, open the Settings tab and click Hooks. Click Add webhook, and create a Webhook to the Jenkins server on the “push event” (see step 2 for details on retrieving the correct URL from the Jenkins server).
-
To create the Webhook in Git, you need to get the appropriate URL from the Jenkins server:
-
Make sure Git Plugin and Github Plugin are installed in Jenkins. From Jenkins home, select Manage Jenkins > Manage Plugins > Installed tab, and search for both plugins. If you can’t find them, you can install them from the Available tab or from https://plugins.jenkins.io/.
-
To retrieve the Webhook URL from the Jenkins server perform the following:
-
From Jenkins Home, select Manage Jenkins > Configure System, and search for "GitHub Servers".
-
In the GitHub Servers section, click the Advanced… button. The Override Hook URL section is displayed.
-
Select the Specify another hook URL for GitHub configuration option. A text box displays the currently defined Hook URL.
-
-
Copy the value displayed in the text box and use it in GitHub (as described in step 1 above).
(Optional) Select the Just the push event option if you only want push events to trigger the build on the Jenkins server.
Click Update webhook.
-
Upload the integration plugin to the Jenkins server
The LoadRunner Enterprise-Git integration plugin enables you to synchronize performance test scripts from a Github repository to a project on the LoadRunner Enterprise server.
-
Install the Jenkins server.
-
Install the Micro Focus LoadRunner Enterprise integration with Git plugin.
For details on downloading and installing this plugin, see Micro Focus Performance Center Integration With Git.
-
Go to Jenkins home > Manage Jenkins > Manage Plugins > Advanced.
-
In the Upload Plugin section, select the micro-focus-performance-center-integration.hpi file and click Upload.
-
Restart Jenkins if required.
-
Configure a job in Jenkins to synchronize scripts
You can create a Jenkins project to synchronize LoadRunner Enterprise with Git by uploading LoadRunner and JMeter scripts stored in a Git repository to a LoadRunner Enterprise project.
-
In the Jenkins dashboard, click New Item, and select Freestyle project to create a new project.
-
Enter the details of the project for the new Job:
-
In the General section, select the GitHub project check box, and enter the URL of the Git repository in the Project URL box.
-
In the Source Code Management section, select the Git option, and enter the Git URL in Repository URL field, and provide credentials for allowing access to this repository. Also define which branch will be cloned to the job's workspace.
-
In the Build Triggers section, select the GitHub hook trigger for GITScm polling option.
-
In the Build section, go to the Add build step drop down list, and select Synchronize LoadRunner Enterprise with Git.
-
Enter the following build step details:
Argument Description Description Provide your own description of the build step purpose. LRE Server Enter the hostname or IP address of the LoadRunner Enterprise server.
If the LoadRunner Enterprise server is not using the default port (80), mention it by adding a colon (:) and then the port number.
Example:
myLREserver.mycompany.net
,182.138.255.1
ormyLREserver.mycompany.net:81
.Note: Do not use the full URL of LoadRunner Enterprise server. For example, using
https://myLREserver/LoadTest
will fail. Instead, just specify themyLREserver
value in this field, and select the Use HTTPS Protocol option if a secured protocol is required.Use HTTPS Protocol Select this option if the LoadRunner Enterprise server is using a secured connection. Credentials Enter the user name and password of the LoadRunner Enterprise user to connect to the server. Domain Enter the LoadRunner Enterprise domain of the project in which the scripts will be uploaded. Project Enter the name of the LoadRunner Enterprise project in which the test to run is stored. Local Proxy Add your local proxy in the format:
http(s)://host:port
and enter the user name and password, or leave empty if not using a local proxy.Note: PAC (proxy auto-config) and Automatic configuration script are not supported.
Proxy Credentials Proxy credentials or parameter pointing to such credentials. Test Plan folder The Test Plan folder path in LoadRunner Enterprise where the scripts will be loaded.
Available paths can be found in the Test Management tree in the LoadRunner Enterprise user interface. The path must begin with "Subject" and be separated with backslashes (\). The path is case-sensitive.
Upload script mode This corresponds to the similar option existing in LoadRunner Enterprise or VuGen:
-
All Files: All script files are uploaded (this takes longer to load).
-
Runtime Files: Only the required files are uploaded (script files, Runtime Settings, parameter files, etc.)
Recommended value: Runtime Files
Delete script This option enables you to synchronize script deletion from Git to LoadRunner Enterprise.
Recommended value: Yes
Import Tests
(Available in plugin version 1.1.0)
Instructs the plugin to synchronize the YAML file stored in Git. For details, see Configure a job in Jenkins to synchronize tests below.
-
-
Configure a job in Jenkins to synchronize tests
Available in plugin versions: 1.1.0 and later
You can create a Jenkins project to synchronize performance tests from YAML files stored in a GitHub repository to a LoadRunner Enterprise project.
To synchronize tests:
-
Perform the steps in Configure a job in Jenkins to synchronize scripts above, and for the Import Tests option, select Yes.
-
Copy your YAML files to a folder in your Git repository (YAML files under the root of the Git repository will be ignored). The plugin creates the test in the LoadRunner Enterprise project according to:
-
The file name (without extension) which will be used as test name.
-
The location of the file in the Git repository which will be the location of the test under the root folder ('Subject') in the Test Management tree.
-
The content of the YAML file, which must be composed according to the parameters described in the tables below.
Note:
-
All parameters must be in lowercase.
-
When a backslash (\) occurs in a value provided to a parameter (for example, a folder separator in a file path), a double backslash (\\) must be used instead.
-
-
YAML file Parameters
Root parameters of the YAML file:
Parameter | Description | Required |
---|---|---|
controller |
Defines the Controller to be used during the test run (it must be an available host in the LoadRunner Enterprise project). If not specified, a Controller will be chosen from the various Controllers available in the LoadRunner Enterprise project. Available with plugin version 1.1.1 and later: You can provision a Controller as a Docker image by specifying the value "Elastic" and providing a value for the controller_elastic_configuration parameter (see controller_elastic_configuration table below). |
No |
lg_amount | Number of load generators to allocate to the test (every group in the test will be run by the same load generators). | Not required if each group defined in the group parameter defines the load generators it will be using via the lg_name parameter (see group table below). |
group | Lists all groups or scripts defined in the test. The parameter to be used in each group are specified in the group table below. | Yes |
scheduler | Defines the duration of a test, and determines whether virtual users are started simultaneously or gradually. See the scheduler table below. | No |
lg_elastic_configuration
(Available with plugin version 1.1.1 and later) |
Defines the image to be used to provision load generators. See the lg_elastic_configuration table below. |
Yes, if a load generator is defined to be provisioned from a Docker image. |
controller_elastic_configuration
(Available with plugin version 1.1.1 and later) |
Defines the image to be used in order to provision the Controller. See the controller_elastic_configuration table below. | Yes, if the Controller is defined to be provisioned from a Docker image. |
Parameter | Description | Required |
---|---|---|
group_name | Name of the group (it must be a unique name if several groups are defined). | Yes |
vusers | Number of virtual users to allocate to the group for running the script. | Yes |
script_id | ID of the script in the LoadRunner Enterprise project. | Not required if the script_path parameter is specified. |
script_path | Path and name of the script to be added to the group, separated by double backslashes (\\). For example "MyMainFolder\\MySubFolder\\MyScriptName'. Do not include the LoadRunner Enterprise root folder (named "Subject"). | Not required if script_id parameter is specified |
lg_name |
List of load generators to allocate to the group for running the script. The supported values are:
|
No |
command_line | The command line applied to the group. | No |
rts | Object defining the runtime settings of the script. See the rts table below. | No |
Parameter | Description | Required |
---|---|---|
pacing | Can be used to define the number of iterations the script will run and the required delay between iterations (see the pacing table below). | No |
thinktime | Can be used to define think time (see the thinktime table below). | No |
java_vm | Can be used when defining Java environment runtime settings (see the java_vm table below). | No |
jmeter | Can be used to define JMeter environment runtime settings (see the jmeter table below). | No |
Parameter | Description | Required |
---|---|---|
number_of_iterations | Specifies the number of iterations to run; this must be a positive number. | Yes |
type |
Possible values for type attribute are:
|
No |
delay | Non-negative number (less than delay_at_range_to_seconds when specified). | Depends on the value provided for the type parameter. |
delay_random_range | Non-negative number. It will be added to the value given to the delay parameter (the value will be randomly chosen between the value given to the 'delay' parameter and the same value to which is added the value of this parameter). | Depends on the value provided for the type parameter. |
Parameter | Description | Required |
---|---|---|
type |
The thinktime type attribute is one of:
|
No |
min_percentage | This must be a positive number. | Depends on the value provided for the type parameter. |
max_percentage | This must be a positive number (it must be larger than the value provided for the min_percentage parameter). | Depends on the value provided for the type parameter. |
limit_seconds | This must be a positive number. | Depends on the value provided for the type parameter. |
multiply_factor | The recorded think time is multiplied by this factor at runtime. | Depends on the value provided for the type parameter. |
Parameter | Description | Required |
---|---|---|
jdk_home |
The JDK installation path. |
No |
java_vm_parameters | List the Java command line parameters. These parameters can be any JVM argument. The common arguments are the debug flag (-verbose) or memory settings (-ms, -mx). In additional, you can also pass properties to Java applications in the form of a -D flag. | No |
use_xboot | Boolean: Instructs VuGen to add the Classpath before the Xbootclasspath (prepend the string). | No |
enable_classloader_per_vuser | Boolean: Loads each Virtual User using a dedicated class loader (runs Vusers as threads). | No |
java_env_class_paths | A list of classpath entries. Use a double backslash (\\) to separate folders. | No |
Parameter | Description | Required |
---|---|---|
start_measurements |
Boolean value to enable JMX measurements during performance test execution. |
No |
jmeter_home_path | Path to JMeter home. If not defined, the path from the %JMETER_HOME% environment variable is used. | No |
jmeter_min_port | This number must be lower than the value provided in the jmeter_max_port parameter. Both jmeter_min_port and jmeter_max_port parameters must be specified otherwise the default port values is used. | No |
jmeter_max_port | This number must be higher than the value provided in the 'jmeter_min_port' parameter. Both jmeter_min_port and jmeter_max_port parameters must be specified otherwise the default port values is used. | No |
jmeter_additional_properties | JMeter additional properties file. Use a double backslash (\\) to separate folders. | No |
Parameter | Description | Required |
---|---|---|
rampup | Time, in seconds, to gradually start all virtual users. Additional virtual users are added every 15 seconds until the time specified in the parameter ends. If no value is specified, all virtual users are started simultaneously at the beginning of the test. | No |
duration | Time, in seconds, that it will take to run the test after all virtual users are started. After this time, the test run ends. If not specified, the test will run until completion. | No |
Available with plugin version 1.1.1 and later.
Parameter | Description | Required |
---|---|---|
image_id |
The image ID can be retrieved from:
|
Yes if one of the load generator is defined to be provisioned from the Docker image. |
memory_limit |
This parameter can be retrieved from LoadRunner Enterprise.
|
Yes, if the image is defined with resource limits. |
cpu_limit |
This parameter can be retrieved from LoadRunner Enterprise.
|
Yes, if the image is defined with resource limits. |
Available with plugin version 1.1.1 and later.
Parameter | Description | Required |
---|---|---|
image_id |
The image ID can be retrieved from:
|
Yes if one of the Controller is defined to be provisioned from the Docker image. |
memory_limit |
This parameter can be retrieved from LoadRunner Enterprise.
|
Yes, if the image is defined with resource limits. |
cpu_limit |
This parameter can be retrieved from LoadRunner Enterprise.
|
Yes, if the image is defined with resource limits. |
Example scripts
##################################################
group:
- group_name: "TEstInt"
vusers: '20'
script_path: "plugin\\TEstInt"
lg_name:
- "LG1"
- "LG2"
- group_name: "Mtours"
vusers: '20'
script_path: "plugin\\mtours"
lg_name:
- "LG3"
- "LG4"
scheduler:
rampup: '45'
Duration: '300'
##################################################
In the example above:
-
The plugin automatically assigns the file name as the test name, and the folder path of the file in the Git repository is used to create the location of the test under the root folder ('Subject') in the LoadRunner Enterprise project.
-
In the content:
-
Since no Controller and no load generator amount were specified, a random available Controller will be allocated to the test just before it is run, and the lg_name parameter specified in each group will be used.
-
In the group parameter:
-
Two scripts will be added, each with a unique value in the group_name parameter, and the number of virtual users to run the group (vusers).
-
Since the ID of the scripts in the LoadRunner Enterprise project is unknown, the script_path parameter (without "Subject") followed by the script name will be used, with double backslashes for separators.
-
The load generators that will be used by each group are specified (in this case, load generators will automatically be matched as we use the 'LG' prefix).
-
-
-
In the scheduler, all Vusers will be initialized gradually (every 45 seconds), and the test will stop after 5 minutes (300 seconds).
##################################################
controller: "mycontroller"
lg_amount: 3
group:
- group_name: "JavaVuser_LR_Information_pacing_immediately_thinktime_ignore"
vusers: 50
script_id: 394
rts:
pacing:
number_of_iterations: 2
type: "immediately java_vm:
jdk_home: "C:\\Program Files\\Java\\jdk1.8.0_191"
java_vm_parameters: "java_vm_parameters"
enable_classloader_per_vuser: true
use_xboot: true
java_env_class_paths:
- "java_env_class_path1"
- "java_env_class_path2" thinktime:
type: "ignore"
- group_name: "JavaHTTP_BigXML_pacing_fixed_delay_thinktime_replay"
vusers: 50
script_path: "scripts\\java_protocols\\JavaHTTP_BigXML"
rts:
pacing:
number_of_iterations: 2
type: "fixed delay"
delay: 10
java_vm:
jdk_home: "C:\\Program Files\\Java\\jdk1.8.0_191"
java_vm_parameters: "java_vm_parameters"
enable_classloader_per_vuser: true
thinktime:
type: "replay"
limit_seconds: 30
- group_name: "JavaVuser_LR_Information_immediately_pacing_random_delay_thinktime_modify"
vusers: 50
script_id: 394
rts:
pacing:
number_of_iterations: 2
type: "random delay"
delay: 10
delay_random_range: 20
java_vm: jdk_home: "C:\\Program Files\\Java\\jdk1.8.0_191"
java_vm_parameters: "java_vm_parameters"
enable_classloader_per_vuser: true
java_env_class_paths:
- "java_env_class_path1"
- "java_env_class_path2"
thinktime:
type: "modify"
limit_seconds: 30
multiply_factor: 2
- group_name: "JavaHTTP_BigXML_pacing_fixed_interval_thinktime_random"
vusers: 50
#script_id: 392
script_path: "scripts\\java_protocols\\JavaHTTP_BigXML"
rts:
pacing:
number_of_iterations: 2
type: "fixed interval"
delay: 10
java_vm:
jdk_home: "C:\\Program Files\\Java\\jdk1.8.0_191"
java_vm_parameters: "java_vm_parameters"
enable_classloader_per_vuser: true
java_env_class_paths:
- "java_env_class_path1"
- "java_env_class_path2"
thinktime:
type: "random"
limit_seconds: 30
min_percentage: 2
max_percentage: 3
- group_name: "JavaHTTP_BigXML_pacing_random_interval"
vusers: 50
script_path: "scripts\\java_protocols\\JavaHTTP_BigXML"
rts:
pacing:
number_of_iterations: 2
type: "random interval"
delay: 10
delay_random_range: 20
java_vm:
jdk_home: "C:\\Program Files\\Java\\jdk1.8.0_191"
java_vm_parameters: "java_vm_parameters"
enable_classloader_per_vuser: true
java_env_class_paths:
- "java_env_class_path1"
- "java_env_class_path2"
- group_name: "Mtours_pacing_random_interval"
vusers: 50
script_path: "scripts\\Mtours"
rts:
pacing:
number_of_iterations: 2
type: "random interval"
delay: 10
delay_random_range: 20
jmeter:
start_measurements: true
jmeter_home_path: "c:\\jmeter"
jmeter_min_port: 2001
jmeter_max_port: 3001
jmeter_additional_properties: "jmeter_additional_properties"
- group_name: "Mtours_pacing_random_interval_Jmeter_default_port"
vusers: 50
script_path: "scripts\\Mtours"
rts:
pacing:
number_of_iterations: 2
type: "random interval"
delay: 10
delay_random_range: 20
jmeter:
start_measurements: true
scheduler:
rampup: 120
duration: 600
##################################################
In the example above:
-
The plugin automatically assigns the file name as the test name, and the folder path of the file in the Git repository is used to create the location of the test under the root folder ('Subject') in the LoadRunner Enterprise project.
-
Since the controller and the lg_amount parameters are specified, the specified Controller will be used to run the test, and three automatch load generators will be used and shared by all groups.
-
The content of the file is defined with seven groups, all being set with the “rts” parameter:
-
In the scheduler, all Vusers will be initialized gradually (every 120 seconds), and the test will stop after 10 minutes (600 seconds).
Run the job
You can run the job by either:
-
Merging a pull request to the master branch.
The usual process is as follows:
-
Commit a change to a branch (or fork).
-
Push the change (pushing changes to master is not usually allowed unless you have admin rights).
-
Create pull request.
-
Merge pull request (this operation will trigger the build as it pushes the change to master branch).
-
-
Manually triggering the build from Jenkins.
Note:
-
Make sure the machine running the job (the Jenkins server or a distributed node defined in the Jenkins server) can fetch everything required from the Git repository. You will probably need to install Git client (available from https://plugins.jenkins.io/) and configure the operating system of the machine that runs the build to allow this.
-
The synchronization process is set to find the previous build that ran successfully, and to include only the modifications from the build (if there are no differences, nothing is synchronized). If there has not been a successful build, everything will be synchronized.
Review the results
If the Debug option was selected in the Jenkins global configuration section (Manage Jenkins > Configure System), a stack trace is published in the log report when errors occur.
Configure Jenkins using GitLab (instead of GitHub)
You can perform all the GitHub configuration steps explained above using GitLab instead. Here are the steps:
-
Configure Jenkins with GitLab
-
From Jenkins Home, select Manage Jenkins > Configure System.
-
Define a GitLab connection and a GitLab Notifier configuration (both require a token from GitLab).
Tokens can be retrieved from GitLab via User Settings > Access Token (you can set tokens with an expiration date, revoke them, and grant permissions and define permission levels).
-
-
Configure a Jenkins job
Create a new job, or use an existing one with the following settings:
-
In the Source Code Management section, allow the job to clone the repository within the workspace. Select the Git option, enter the Git URL in Repository URL field, and provide credentials for allowing access to this repository.
- If you want to have the build triggered at a GitLab event, define a trigger in the Build Triggers section. Jenkins can create a secret token that can be used in the next step when creating a hook in the GitLab project (as described in the next section).
-
-
Configure your GitLab project
You can do this by performing either of the following:
Creating a GitLab Hook to trigger a Git Merge To create a GitLab Hook to trigger a Jenkins build Git Merge:
-
In your GitLab project, open Settings > Integrations.
-
In the URL section, add the URL of your Jenkins job and use the secret token generated in the previous step if required.
Defining the .gitlab-ci.yml file to trigger a Jenkins job
Define the .gitlab-ci.yml file of your GitLab project to run a cURL command triggering a Jenkins job.
This command can be performed from a Shell executor and send parameters which is not possible to do in the previous step.
A simple command triggering Jenkins job with parameters (YAML_TEST being the parameter in the example) can be like this:
curl -i -X POST http://MyJenkinsServer:8080/jenkins/job/MyJenkinsJob/buildWithParameters?YAML_TEST=Tests\yaml\yamlTest2.yaml
(You can run this from a command prompt to test it. You might want to download cURL from https://curl.haxx.se/ and have it install in your GitLab Runners and in the machine testing the command.)
-
Tips and troubleshooting
For details, see Tips and troubleshooting.