Skip to content

Quality gate

When a workflow is launched within a pipeline, you may need to fine-tune pipeline failing or succeeding conditions. For instance, you may want a pipeline to fail if there are less than 50% of successful Selenium tests, or to succeed even if all the API tests have failed. The quality gate service provides such a possibility.

This service exposes two endpoints, GET and POST, that allow to evaluate a workflow execution result via the service level quality gate definition or the definition file sent by the user.

To simplify the communication with the quality gate service, two opentf-ctl commands, get qualitygate and describe qualitygate, can be used to evaluate a workflow.

Tip

It is also possible to apply a quality gate to a workflow directly from the run workflow command, which may be useful in some contexts. The run workflow command supports the same options as the get qualitygate command. The --mode option is mandatory for the quality gate to be applied.

Defining quality gate

A quality gate is a set of rules. Its definition must be a .yaml or .yml file. The quality gate syntax is described in the Quality gate syntax chapter.

The definition file may contain several quality gates, but at least one quality gate with at least one rule is mandatory. The rule is defined by three parameters: scope, threshold and failure-status: two first are mandatory, failure-status defaults to [failure, blocked, error] if not set.

In this example, the definition file contains one quality gate with one rule limiting evaluated tests scope to the Cypress tests.

qualitygates:
- name: cypress.quality.gate
  rules:
  - name: Cypress tests
    rule:
      scope: test.technology == 'cypress'
      threshold: 75%
      failure-status: [failure, blocked, error]

Using quality gate definition

The quality gate definition may be implemented on the quality gate service level or sent to the POST endpoint.

Service level definition

To use a service level definition, you need to pass the path of a quality gate definition file to the environment variable QUALITYGATE_DEFINITIONS when launching the orchestrator or the quality gate service.

In this case, to apply a quality gate to a workflow, you have to use its name as the mode parameter value when communicating with the quality gate service.

You may use the opentf-ctl get qualitygate command with --mode (or -m) option:

opentf-ctl get qualitygate {workflow_id} --mode cypress.quality.gate

Or you may send a GET request to the endpoint if opentf-ctl is not available:

curl http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate \
     -H "Authorization: Bearer ${TOKEN}" 
curl http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate ^
     -H "Authorization: Bearer %TOKEN%" 
curl.exe http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate `
         -H "Authorization: Bearer $Env:TOKEN" 

User definition

User-provided quality gate definition can be directly sent to the service. The mode parameter value must refer to a quality gate from the posted definition (service level definitions are not taken into account in this case).

You may use the opentf-ctl get qualitygate command and pass the quality gate definition path with the --using or -u option:

opentf-ctl get qualitygate {workflow_id} --using path/to/cypress_qualitygate.yaml --mode cypress.quality.gate

Or you can send to the endpoint a POST request with the file attached if opentf-ctl is not available:

curl -X POST \
        -H "Authorization: Bearer ${TOKEN}" \
        -F qualitygates=@path/to/cypress_qualitygate.yaml \
        http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate
curl -X POST ^
        -H "Authorization: Bearer %TOKEN%" ^
        -F qualitygates=@path/to/cypress_qualitygate.yaml ^
        http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate
curl.exe -X POST `
        -H "Authorization: Bearer $Env:TOKEN" `
        -F qualitygates='@path/to/cypress_qualitygate.yaml' `
        http://orchestrator.example.com/workflows/{workflow_id}/qualitygate?mode=cypress.quality.gate

Workflow evaluation

Quality gates apply only to successfully completed workflows with test results.

The completed workflow evaluation is based on the quality gate rules: their scope, threshold and failure status list. First, for each rule, the success ratio of tests in scope is calculated and then compared to the rule threshold. If the success ratio is equal to or greater than the threshold, the rule status is set to SUCCESS, otherwise, it is set to FAILURE. If no test matches the rule scope, the rule status is set to NOTEST.

Second, the workflow status is evaluated. If there is at least one rule in FAILURE status, the workflow status is FAILURE. If there are no failed rules and at least one rule in SUCCESS, the workflow status is SUCCESS. If all rules evaluate to NOTEST, the workflow status is also NOTEST.

Example of a workflow evaluation

Assuming a successfully completed workflow containing Cypress and JUnit tests, we want to evaluate its results. All Cypress tests need to be successfully executed and 25% of JUnit tests may fail. Some JUnit tests fail due to technical errors and we don’t want to take them into account.

First, we need to create a quality gate evaluating this execution and save it to the cypress_junit_qualitygate.yaml file.

qualitygates:
- name: cypress.junit.quality.gate
  rules:
  - name: Cypress tests
    rule:
      scope: test.technology == 'cypress'
      threshold: 100%
      failure-status: [failure, blocked, error]
  - name: JUnit tests
    rule:
      scope: test.technology == 'junit'
      threshold: 75%
      failure-status: [failure]

Then, supposing the quality gate service is already running, we send this definition using get qualitygate command:

opentf-ctl get qualitygate a13f0572-b23b-40bc-a6eb-a12429f0143c --using cypress_junit_qualitygate.yaml --mode cypress.junit.quality.gate

We will get a response that contains test evaluation results and the general workflow execution status. The JUnit tests execution result is evaluated as SUCCESS even if some tests have failed, but the general execution status is FAILURE, because Cypress tests did not pass the threshold.

RULE,RESULT,TESTS_IN_SCOPE,TESTS_FAILED,TESTS_PASSED,SUCCESS_RATIO
Cypress tests,FAILURE,20,10,10,50.0%
JUnit tests,SUCCESS,50,10,40,80.0%
Workflow a13f0572-b23b-40bc-a6eb-a12429f0143c failed the quality gate using mode cypress.junit.quality.gate.