Sign inSign up

performancetesting/opentext-enterprise-performance-engineering-ci-plugin

By performancetesting

Updated 7 months ago

Trigger, monitor and collect results from OpenText Enterprise Performance Engineering (LoadRunner).

Image
0

1.7K

performancetesting/opentext-enterprise-performance-engineering-ci-plugin repository overview

OpenText Logo

OpenText Enterprise Performance Engineering – CI/CD Plugin

Overview

The docker image is designed to run non-interactively inside CI/CD pipelines (Harness, GitHub Actions, GitLab CI, Jenkins, Kubernetes jobs, etc.) using environment variables for configuration and outputs.


What This Plugin Does

ExecuteLreTest action - Execute load tests on LRE. At runtime, the container:
  1. Authenticates with an OpenText Enterprise Performance Engineering server
  2. Triggers a performance test execution
  3. Allocates or reuses a timeslot (based on configuration)
  4. Monitors test execution until completion
  5. Optionally collates and analyzes results
  6. Writes logs and result artifacts to configured directories
  7. Exits with a deterministic status code suitable for pipeline gating

This behavior allows the plugin to be used as a pipeline quality gate.

WorkspaceSync action (Technology Preview) - Synchronize local workspace scripts to LRE. At runtime, the container:
  1. Authenticates with an OpenText Enterprise Performance Engineering server
  2. Scans the workspace for folders considered as supported scripts. Folders identified as scripts are:
    • VuGen scripts: folders containing a .usr file
    • JMeter scripts: folders containing a .jmx file
    • Gatling scripts: folders containing a .scala file
    • Selenium or unit test scripts: folders containing a .java file
    • DevWeb scripts: folders containing both main.js AND rts.yml files
  3. Zips each folder identified as script and uploads it to LRE
  4. Failure handling:
    • If 5 consecutive script uploads fail, the action is interrupted with failure
    • If more than 50% of the scripts found in the workspace are uploaded successfully, the action reports success
    • Otherwise, the action reports failure
  5. Writes logs for each upload in console and in workspace
  6. Exits with a deterministic status code suitable for pipeline gating

Requirements

  • Docker runner (local, Kubernetes, or Harness delegate)
  • Network access to the OpenText Enterprise Performance Engineering server
  • Valid OpenText Enterprise Performance Engineering credentials
    (username/password or token)
  • Writable workspace and output directories (mounted volumes)

Inputs & Outputs (Configuration)

Inputs (Environment Variables)

All configuration is provided exclusively via environment variables.

Required Inputs
VariableDescriptionRelevant to action
PLUGIN_LRE_SERVERServer, port (when not mentionned, default is 80 or 433 for secured) and tenant (when not mentionned, default is ?tenant=fa128c06-5436-413d-9cfa-9f04bb738df3). e.g.: myserver.mydomain.com:81/?tenant=fa128c06-5436-413d-9cfa-9f04bb738df3'all actions
PLUGIN_LRE_USERNAMEUsername (or ID part of token)all actions
PLUGIN_LRE_PASSWORDPassword (or secret part of token)all actions
PLUGIN_LRE_DOMAINDomain (case-sensitive)all actions
PLUGIN_LRE_PROJECTProject (case-sensitive)all actions
PLUGIN_LRE_TESTTest ID or relative path to a YAML file defining a new testExecuteLreTest

* Either username/password or token authentication must be used.


Optional & Advanced Inputs
Environment VariableDescriptionDefaultRelevant to action
PLUGIN_LRE_ACTIONAction to execute. Currently supported: ExecuteLreTestExecuteLreTestall actions
PLUGIN_LRE_DESCRIPTIONDescription displayed in console logsvalue of PLUGIN_LRE_ACTIONall actions
PLUGIN_LRE_HTTPS_PROTOCOLUse secured protocol for connecting to the server (true / false)falseall actions
PLUGIN_LRE_AUTHENTICATE_WITH_TOKENUse token authentication (required for SSO). (true / false)falseall actions
PLUGIN_LRE_TEST_INSTANCEAUTO or specific instance IDAUTOExecuteLreTest
PLUGIN_LRE_TIMESLOT_DURATION_HOURSTimeslot duration (hours)0ExecuteLreTest
PLUGIN_LRE_TIMESLOT_DURATION_MINUTESTimeslot duration (minutes)30ExecuteLreTest
PLUGIN_LRE_POST_RUN_ACTIONCollate Results, Collate and Analyze, Do Not CollateDo Not CollateExecuteLreTest
PLUGIN_LRE_VUDS_MODEUse VUDS licenses (true / false)falseExecuteLreTest
PLUGIN_LRE_TREND_REPORTASSOCIATED - the trend report defined in the test design will be used', Valid report ID - Report ID will be used for trend, No value or not defined - no trend monitoring.ExecuteLreTest
PLUGIN_LRE_SEARCH_TIMESLOTExperimental: Search for matching timeslot instead of creating a new timeslot (true / false)falseExecuteLreTest
PLUGIN_LRE_STATUS_BY_SLAReport success based on SLA (true / false)falseExecuteLreTest
PLUGIN_LRE_PROXY_OUT_URLProxy URLall actions
PLUGIN_LRE_USERNAME_PROXYProxy usernameall actions
PLUGIN_LRE_PASSWORD_PROXYProxy passwordall actions
PLUGIN_LRE_ENABLE_STACKTRACEPrint stacktrace on errors (true / false)falseall actions
PLUGIN_LRE_RUNTIME_ONLYScripts upload mode (Runtime files only for true, All files for false) (true / false)falseWorkspaceSync

Outputs
PathPurpose
PLUGIN_LRE_OUTPUT_DIRResult files and summarized outputs
PLUGIN_LRE_WORKSPACE_DIRWorkspace for logs, reports, and checkout

These directories must be writable and are typically mounted volumes in CI environments.


Expected Output

During execution, the condole logs provides the progression (waiting for run to finish, analysis report generation, ...) After execution, the plugin writes:

  • Under PLUGIN_LRE_OUTPUT_DIR path, the file results<timestamp>.xml – summarized test results
  • Under PLUGIN_LRE_WORKSPACE_DIR path, LreResult/*.* – execution logs (lre_run_test__.log)
  • Under PLUGIN_LRE_WORKSPACE_DIR path, optional analysis files if PLUGIN_LRE_POST_RUN_ACTION is Collate and Analyze (under LreResult/LreReports/HtmlReport)
  • Under PLUGIN_LRE_WORKSPACE_DIR path, optional trend report if PLUGIN_LRE_TREND_REPORT is set with existing trend report (and LreResult/LreReports/TrendReports) Exit code 0 indicates success; any non-zero value indicates failure.

Execution Model

  • Non-interactive, blocking execution
  • The container handles polling and status monitoring internally
  • No state is preserved between runs
  • Designed to be idempotent and reproducible

Usage

Run Locally with Docker

Assuming the operating systen can pull docker images and run them as linux container.

powershell
create a ps1 file with the following content (provide valid values to environment variables) and run it to execute a test:
$imageBase = "performancetesting/opentext-enterprise-performance-engineering-ci-plugin"
$imageVersion = "latest"
$imageName = "${imageBase}:${imageVersion}"

docker run -it --rm `
  -v C:/temp/harness/output:/harness/output `
  -v C:/temp/harness/workspace:/harness/workspace `
  -e PLUGIN_LRE_ACTION="ExecuteLreTest" `
  -e PLUGIN_LRE_DESCRIPTION="running new test" `
  -e PLUGIN_LRE_SERVER="http://<Server>/?tenant=<tenant-id>" `
  -e PLUGIN_LRE_USERNAME="<username>" `
  -e PLUGIN_LRE_PASSWORD="<password>" `
  -e PLUGIN_LRE_DOMAIN="<domain>" `
  -e PLUGIN_LRE_PROJECT="<project>" `
  -e PLUGIN_LRE_TEST="<testid>" `
  -e PLUGIN_LRE_POST_RUN_ACTION="Collate and Analyze" `
  -e PLUGIN_LRE_OUTPUT_DIR="/harness/output" `
  -e PLUGIN_LRE_WORKSPACE_DIR="/harness/workspace" `
  $imageName
create a ps1 file with the following content (provide valid values to environment variables) and run it to sync a workspace (upload folders recognized as scripts in the workspace into LRE ):
$imageBase = "performancetesting/opentext-enterprise-performance-engineering-ci-plugin"
$imageVersion = "latest"
$imageName = "${imageBase}:${imageVersion}"

docker run -it --rm `
  -v C:/temp/harness/output:/harness/output `
  -v C:/temp/harness/workspace:/harness/workspace `
  -e PLUGIN_LRE_ACTION="WorkspaceSync" `
  -e PLUGIN_LRE_DESCRIPTION="Syncing scripts from workspace to LRE" `
  -e PLUGIN_LRE_SERVER="http://<Server>/?tenant=<tenant-id>" `
  -e PLUGIN_LRE_USERNAME="<username>" `
  -e PLUGIN_LRE_PASSWORD="<password>" `
  -e PLUGIN_LRE_DOMAIN="<domain>" `
  -e PLUGIN_LRE_PROJECT="<project>" `
  -e PLUGIN_LRE_OUTPUT_DIR="/harness/output" `
  -e PLUGIN_LRE_WORKSPACE_DIR="/harness/workspace" `
  -e PLUGIN_LRE_RUNTIME_ONLY="true"
  $imageName
Python
create a testImage.py file with following content (provide valid values to parameters in env_vars) and run it.
import subprocess
from pathlib import Path

# -----------------------------
# Configurable environment variables
# -----------------------------
image_base = "performancetesting/opentext-enterprise-performance-engineering-ci-plugin"
image_version = "latest"
image_name = f"{image_base}:{image_version}"

# Test-specific environment variables
env_vars = {
    "PLUGIN_LRE_ACTION": "ExecuteLreTest",
    "PLUGIN_LRE_DESCRIPTION": "running new test",
    "PLUGIN_LRE_SERVER": "http://<Server>/?tenant=<tenant-id>",
    "PLUGIN_LRE_HTTPS_PROTOCOL": "false",
    "PLUGIN_LRE_AUTHENTICATE_WITH_TOKEN": "false",
    "PLUGIN_LRE_USERNAME": "<username>",
    "PLUGIN_LRE_PASSWORD": "<password>",
    "PLUGIN_LRE_DOMAIN": "<domain>",
    "PLUGIN_LRE_PROJECT": "<project>",
    "PLUGIN_LRE_TEST": "<testid>",
    "PLUGIN_LRE_TEST_INSTANCE": "",
    "PLUGIN_LRE_TIMESLOT_DURATION_HOURS": "0",
    "PLUGIN_LRE_TIMESLOT_DURATION_MINUTES": "30",
    "PLUGIN_LRE_POST_RUN_ACTION": "Collate and Analyze",
    "PLUGIN_LRE_VUDS_MODE": "false",
    "PLUGIN_LRE_TREND_REPORT": "5",
    "PLUGIN_LRE_SEARCH_TIMESLOT": "false",
    "PLUGIN_LRE_STATUS_BY_SLA": "false",
    "PLUGIN_LRE_OUTPUT_DIR": "/harness/output",
    "PLUGIN_LRE_WORKSPACE_DIR": "/harness",
    "PLUGIN_LRE_ENABLE_STACKTRACE": "false",
}


def windows_path_for_docker(path: str) -> str:
    """Convert Windows path to Docker-friendly forward slash path"""
    return Path(path).resolve().as_posix()


def run_test_container():
    print(f"Beginning running a test using container of image {image_name} ...")

    # Docker volume mappings
    volumes = [
        f"{windows_path_for_docker('./harness/output')}:{env_vars['PLUGIN_LRE_OUTPUT_DIR']}",
        f"{windows_path_for_docker('./harness/workspace')}:{env_vars['PLUGIN_LRE_WORKSPACE_DIR']}",
    ]

    # Build docker run command
    cmd = ["docker", "run", "-it", "--rm"]

    # Add volume mappings
    for vol in volumes:
        cmd += ["-v", vol]

    # Add environment variables
    for key, value in env_vars.items():
        cmd += ["-e", f"{key}={value}"]

    # Add image name
    cmd.append(image_name)

    # Run the docker command
    print("> Running Docker container...")
    subprocess.run(cmd, shell=True, check=True)

    print(f"Finished running a test using container of image {image_name} ...")


if __name__ == "__main__":
    run_test_container()

create a testImage.py file with following content (provide valid values to parameters in env_vars) and run it.
import subprocess
from pathlib import Path

# -----------------------------
# Configurable environment variables
# -----------------------------
image_base = "performancetesting/opentext-enterprise-performance-engineering-ci-plugin"
image_version = "latest"
image_name = f"{image_base}:{image_version}"

# Test-specific environment variables
env_vars = {
    "PLUGIN_LRE_ACTION": "WorkspaceSync",
    "PLUGIN_LRE_DESCRIPTION": "Sync scripts from workspace to LRE",
    "PLUGIN_LRE_SERVER": "http://<Server>/?tenant=<tenant-id>",
    "PLUGIN_LRE_HTTPS_PROTOCOL": "false",
    "PLUGIN_LRE_AUTHENTICATE_WITH_TOKEN": "false",
    "PLUGIN_LRE_USERNAME": "<username>",
    "PLUGIN_LRE_PASSWORD": "<password>",
    "PLUGIN_LRE_DOMAIN": "<domain>",
    "PLUGIN_LRE_PROJECT": "<project>",
    "PLUGIN_LRE_OUTPUT_DIR": "/harness/output",
    "PLUGIN_LRE_WORKSPACE_DIR": "/harness",
    "PLUGIN_LRE_ENABLE_STACKTRACE": "false",
    "PLUGIN_LRE_RUNTIME_ONLY": "true"
}


def windows_path_for_docker(path: str) -> str:
    """Convert Windows path to Docker-friendly forward slash path"""
    return Path(path).resolve().as_posix()


def run_test_container():
    print(f"Beginning running a test using container of image {image_name} ...")

    # Docker volume mappings
    volumes = [
        f"{path_for_docker('./harness/output')}:{env_vars['PLUGIN_LRE_OUTPUT_DIR']}",
        f"{path_for_docker('./harness/workspace')}:{env_vars['PLUGIN_LRE_WORKSPACE_DIR']}",
    ]

    # Build docker run command
    cmd = ["docker", "run", "-it", "--rm"]

    # Add volume mappings
    for vol in volumes:
        cmd += ["-v", vol]

    # Add environment variables
    for key, value in env_vars.items():
        cmd += ["-e", f"{key}={value}"]

    # Add image name
    cmd.append(image_name)

    # Run the docker command
    print("> Running Docker container...")
    subprocess.run(cmd, shell=True, check=True)

    print(f"Finished running a test using container of image {image_name} ...")


if __name__ == "__main__":
    run_test_container()

Harness pipeline example

Harness users expect YAML as step (the value of connectorRef should be customized to your harness configuation). values can be stored as secrets in harness and referenced.

Example of step to trigger a test execution
...
            steps:
              - step:
                  type: Run
                  name: Run_1
                  identifier: Run_1
                  spec:
                    connectorRef: DockerRegistry1
                    image: performancetesting/opentext-enterprise-performance-engineering-ci-plugin:latest
                    shell: Sh
                    envVariables:
                      PLUGIN_LRE_ACTION: ExecuteLreTest
                      PLUGIN_LRE_DESCRIPTION: running new test
                      PLUGIN_LRE_SERVER: <+secrets.getValue("lre_server")>
                      PLUGIN_LRE_HTTPS_PROTOCOL: "true"
                      PLUGIN_LRE_AUTHENTICATE_WITH_TOKEN: "false"
                      PLUGIN_LRE_USERNAME: <+secrets.getValue("lre_username")>
                      PLUGIN_LRE_PASSWORD: <+secrets.getValue("lre_password")>
                      PLUGIN_LRE_DOMAIN: <+secrets.getValue("lre_domain")>
                      PLUGIN_LRE_PROJECT: <+secrets.getValue("lre_project")>
                      PLUGIN_LRE_TEST: <+secrets.getValue("lre_test")>
                      PLUGIN_LRE_TIMESLOT_DURATION_HOURS: "0"
                      PLUGIN_LRE_TIMESLOT_DURATION_MINUTES: "30"
                      PLUGIN_LRE_POST_RUN_ACTION: Collate and Analyze
                      PLUGIN_LRE_VUDS_MODE: "false"
                      PLUGIN_LRE_TREND_REPORT: "5"
                      PLUGIN_LRE_SEARCH_TIMESLOT: "false"
                      PLUGIN_LRE_STATUS_BY_SLA: "false"
                      PLUGIN_LRE_OUTPUT_DIR: /harness/output
                      PLUGIN_LRE_WORKSPACE_DIR: /harness
                      PLUGIN_LRE_ENABLE_STACKTRACE: "false"
...
Example of step to sync folders identified as scripts in the workspace to LRE
...
            steps:
              - step:
                  type: Run
                  name: Run_1
                  identifier: Run_1
                  spec:
                    connectorRef: DockerRegistry1
                    image: performancetesting/opentext-enterprise-performance-engineering-ci-plugin:latest
                    shell: Sh
                    envVariables:
                      PLUGIN_LRE_ACTION: WorkspaceSync
                      PLUGIN_LRE_DESCRIPTION: Sync scripts from workspace to LRE
                      PLUGIN_LRE_SERVER: <+secrets.getValue("lre_server")>
                      PLUGIN_LRE_HTTPS_PROTOCOL: "true"
                      PLUGIN_LRE_AUTHENTICATE_WITH_TOKEN: "false"
                      PLUGIN_LRE_USERNAME: <+secrets.getValue("lre_username")>
                      PLUGIN_LRE_PASSWORD: <+secrets.getValue("lre_password")>
                      PLUGIN_LRE_DOMAIN: <+secrets.getValue("lre_domain")>
                      PLUGIN_LRE_PROJECT: <+secrets.getValue("lre_project")>
                      PLUGIN_LRE_OUTPUT_DIR: /harness/output
                      PLUGIN_LRE_WORKSPACE_DIR: /harness
                      PLUGIN_LRE_ENABLE_STACKTRACE: "false"
                      PLUGIN_LRE_RUNTIME_ONLY: "true"
...
Configuration parameters

All configuration is provided using environment variables.

Output

The plugin writes execution logs and result files to:

  • Output directory: $PLUGIN_LRE_OUTPUT_DIR
  • Workspace directory: $PLUGIN_LRE_WORKSPACE_DIR

These directories should be mapped to Harness workspace paths to allow artifact collection and post-processing.

Authentication

Supported authentication modes:

  • Username / password
  • Token authentication by setting:
    • PLUGIN_LRE_AUTHENTICATE_WITH_TOKEN=true
    • PLUGIN_LRE_USERNAME=
    • PLUGIN_LRE_PASSWORD=

Troubleshooting

  • Ensure network connectivity from the container to the server
  • Validate tenant ID, domain, and project values
  • Verify credentials or token permissions
  • Enable stack traces by setting:
  PLUGIN_LRE_ENABLE_STACKTRACE=true

This plugin uses the same core logic and configuration model as:


License

This project is licensed under the MIT License. See the LICENSE file for details.

Source code

Github repository: Opentext Enterprise Performance Engineering CI plugin

Tag summary

Content type

Image

Digest

sha256:eaf8937ec

Size

127 MB

Last updated

7 months ago

docker pull performancetesting/opentext-enterprise-performance-engineering-ci-plugin