For the complete documentation index, see llms.txt. This page is also available as Markdown.

Use CI Run steps

This topic describes settings for the CI Run step.

You can use a Run step to run commands or scripts in a CI pipeline. Here are some examples of different ways you can use Run steps.

This example runs pytest, includes code coverage, and produces a report in JUnit XML format.

    - step:
        type: Run
        name: Run pytest
        identifier: Run_pytest
        spec:
          connectorRef: YOUR_IMAGE_REGISTRY_CONNECTOR
          image: python:latest
          shell: Sh
          command: |-
            echo "Welcome to Harness CI"
            uname -a
            pip install pytest
            pip install pytest-cov
            pip install -r requirements.txt

            pytest -v --cov --junitxml="result.xml" test_api.py test_api_2.py test_api_3.py

            echo "Done"
          reports:
            type: JUnit
            spec:
              paths:
                - "**/*.xml"

In Harness CI, you can use test splitting (parallelism) to improve test times for any language or test tool.

This example installs Go dependencies.

This example uses a Run step to select a version of Xcode.

This example clones a GitHub repository.

To use this command, you would replace:

  • ACCOUNT_NAME with your GitHub account name.

  • REPO_NAME with the name of the GitHub repo to clone.

  • PERSONAL_ACCESS_TOKEN with a GitHub personal access token that has pull permissions to the target repository. Additional permissions may be necessary depending on the Action's purpose. Store the token as a Harness secret and use a variable expression, such as <+secrets.getValue("YOUR_TOKEN_SECRET")>, to call it.

Run steps are highly versatile, and you can use them to run all manner of individual commands or multi-line scripts.

For example, this step produces output variables from Terraform value. This step is from the Terraform notifications trigger tutorial, and these output variables are used by another step later in the same pipeline.

Consider creating plugins for scripts that you reuse often.

This example demonstrates how to set up SSH authentication in a Run step, such as when connecting to a private Git server or remote machine.

The SSH private key must be stored in Harness as a File-type Secret to be used securely in the pipeline.

  • Replace account.your-ssh-private-key with your actual secret reference.

  • The StrictHostKeyChecking=no flag disables host verification. For production pipelines, consider managing known hosts instead.

  • Ensure your build image has OpenSSH tools (ssh, git, etc.) installed.

Go to Pipeline Annotations to learn more about how you could summarize critical pipeline metrics.

Add the Run step

You need a CI pipeline with a Build stage where you'll add the Run step.

In order for the Run step to execute your commands, the build environment must have the necessary binaries for those commands. Depending on the stage's build infrastructure, Run steps can use binaries that exist in the build environment or pull an image, such as a public or private Docker image, that contains the required binaries. For more information about when and how to specify images, go to the Container registry and image settings.

  1. Go to the Build stage in the pipeline where you want to add the Run step.

  2. On the Execution tab, select Add Step, and select the Run step from the Step Library.

  3. Configure the Run step settings and then select Apply Changes to save the step.

In Harness, go to the pipeline where you want to add the Run step. In the CI stage, add a Run step and configure the Run step settings.

Run step settings

The CI Run step has the following settings.

Depending on the stage's build infrastructure, some settings might be unavailable or optional. Settings specific to containers, such as Set Container Resources, are not applicable when using the step in a stage with VM or Harness Cloud build infrastructure.

Metadata

  • Name: Enter a name summarizing the step's purpose. Harness automatically assigns an ID based on the Name.

  • Description: Optional text string describing the step's purpose.

Container Registry and Image

Container Registry and Image ensure that the build environment has the binaries necessary to execute the commands that you want to run in this step. For example, a cURL script may require a cURL image, such as curlimages/curl:7.73.0.

When are Container Registry and Image required?

The stage's build infrastructure determines whether these fields are required or optional:

  • Kubernetes cluster build infrastructure: Container Registry and Image are always required.

  • Local runner build infrastructure: Run steps can use binaries available on the host machine. The Container Registry and Image are required if the machine doesn't have the binary you need.

  • Self-managed AWS/GCP/Azure VM build infrastructure: Run steps can use binaries that you've made available on your build VMs. The Container Registry and Image are required if the VM doesn't have the necessary binaries. These fields are located under Optional Configuration for stages that use self-managed VM build infrastructure.

  • Harness Cloud build infrastructure: Run steps can use binaries available on Harness Cloud machines, as described in the image specifications. The Container Registry and Image are required if the machine doesn't have the binary you need. These fields are located under Optional Configuration for stages that use Harness Cloud build infrastructure.

Shell and Command

Use these fields to define the commands that you need to run in this step.

For Shell, select the shell type. Options include: Bash, PowerShell, Pwsh (PowerShell Core), Sh, and Python. If the step includes commands that aren't supported for the selected shell type, the build fails. Required binaries must be available on the build infrastructure or through a specified Container Registry and Image.

In the Command field, enter POSIX shell script commands for this step. The script is invoked as if it were the entry point. If the step runs in a container, the commands are executed inside the container.

For Bash, set the shell to Bash and enter your Bash script in command. For example, the following step runs a Bash script that checks the Java version:

For PowerShell, set the shell to Powershell and enter your PowerShell script in command, for example:

You can run PowerShell commands on Windows VMs running in AWS build farms.

You can run PowerShell Core commands in pods or containers that have pwsh installed. For PowerShell Core, set the shell to Pwsh and enter your PowerShell Core script in command. For example, this step runs ForEach-Object over a list of events.

You can use the Sh option to run any shell script, provided the necessary binaries are available. For example, this step pulls the latest python image and then executes a shell script (Sh) that runs pytest with code coverage.

For Python, set the shell to python and enter your Python commands in command, for example:

Reference background services

You can reference services started in Background steps by using the Background step's Id in your Run step's Command. For example, a cURL command could call BackgroundStepId:5000 where it might otherwise call localhost:5000. The exact format depends on your build infrastructure. For more information, go to Background step settings - Name and ID and Background step settings - Port Bindings.

If the Background step is inside a step group, you must include step group ID, such as StepGroupId_BackgroundStepId:5000, even if both steps are in the same step group.

Scripts that produce output variables

If your script produces an output variable, you must declare the output variable in the Run step's Output Variables. For example, the following step runs a python script that defines an output variable called OS_VAR, and OS_VAR is also declared in the outputVariables.

Images without a shell

To support Docker images without a shell, the Command field is optional. You must provide either Image, Command, or both. If you provide only Image, Harness runs the image entrypoint.

If Command is empty or omitted, then Harness ignores Shell. The default value for Shell is Sh; however the presence of Shell doesn't require Command.

Report Paths

If relevant to the commands in your Run step, you can specify one or more paths to files that store test results in JUnit XML format. You can add multiple paths. If you specify multiple paths, make sure the files contain unique tests to avoid duplicates. Glob is supported.

This setting is required for the Run step to be able to publish test results.

For example, this step runs pytest and produces a test report in JUnit XML format.

Environment Variables

You can inject environment variables into the step container and use them in the commands executed in this step. You must input a Name and Value for each variable.

You can reference environment variables by name in commands. For example, a Bash script would use $var_name or ${var_name}, and a Windows PowerShell script would use $Env:varName.

Variable values can be fixed values, runtime inputs, or expressions. For example, if the value type is expression, you can input a value that references the value of some other setting in the stage or pipeline.

STAGE VARIABLES

Stage variables are inherently available to steps as environment variables.

Output Variables

Scoping output variables using aliases

To prevent variable name conflicts, you can use Publish Variable Names (Alias) to scope output variables to different entities.

  1. Export the variables: Use Output Variables to export the variables.

  2. Define an alias: In Publish Variable Names (Alias), enter an alias to use to reference the exported output variables.

  3. Select a scope: In Scope, select the scope for the exported output variable.

The following screenshot shows the output alias configured with Stage scope:

The following screenshot shows the output alias configured with Pipeline scope:

You can scope output variables to the following entities:

  • Step group:

    • The output variable must be used in the same step group, including nested child step groups.

    • The format for referencing an exported step group output variable using its alias is:

  • Stage:

    • The output variable can be used anywhere in the same stage, including step groups in the same stage. It cannot be used outside of the same stage.

    • The format for referencing an exported stage output variable using its alias is:

  • Pipeline:

    • The output variable can be used anywhere in the same pipeline but not in a chained pipeline.

    • The format for referencing an exported pipeline output variable using its alias is:

To reference a map of exported output variables, reference the alias in the format <+exportedVariables.getValue("SCOPE.ALIAS_NAME")>, like <+exportedVariables.getValue("stepGroup.info")>.

IMPORTANT NOTES

  • Exported variables are immutable.

  • Variables cannot be exported in looping strategies.

  • Exported variables are not supported in pipeline chaining.

  • All output variables are exported. You cannot select a subset.

Step group scope pipeline example

For more information, go to Scoping output variables using aliases in the Shell Script step documentation.

Additional container settings

Settings specific to containers are not applicable in a stages that use VM or Harness Cloud build infrastructure.

Privileged

Enable this option to run the container with escalated privileges. This is equivalent to running a container with the Docker --privileged flag.

Image Pull Policy

If you specified a Container Registry and Image, you can specify an image pull policy:

  • Always: The kubelet queries the container image registry to resolve the name to an image digest every time the kubelet launches a container. If the kubelet encounters an exact digest cached locally, it uses its cached image; otherwise, the kubelet downloads (pulls) the image with the resolved digest, and uses that image to launch the container.

  • If Not Present: The image is pulled only if it is not already present locally.

  • Never: The image is assumed to exist locally. No attempt is made to pull the image.

Run as User

If you specified a Container Registry and Image, you can specify the user ID to use for running processes in containerized steps.

For a Kubernetes cluster build infrastructure, the step uses this user ID to run all processes in the pod. For more information, go to Set the security context for a pod.

Set Container Resources

Maximum resources limits for the resources used by the container at runtime:

  • Limit Memory: Maximum memory that the container can use. You can express memory as a plain integer or as a fixed-point number with the suffixes G or M. You can also use the power-of-two equivalents, Gi or Mi. Do not include spaces when entering a fixed value. The default is 500Mi.

  • Limit CPU: The maximum number of cores that the container can use. CPU limits are measured in CPU units. Fractional requests are allowed. For example, you can specify one hundred millicpu as 0.1 or 100m. The default is 400m. For more information, go to Resource units in Kubernetes.

Timeout

Set the timeout limit for the step. Once the timeout limit is reached, the step fails and pipeline execution continues. To set skip conditions or failure handling for steps, go to:

Run step logs and test results

During and after pipeline runs, you can find step logs on the Build details page.

If your pipeline runs tests, you can view test reports on the Build details page.

Run step and Pipeline Annotations

Pipeline Annotations allow you to publish rich, structured insights directly into the Harness pipeline execution page. Instead of sifting through thousands of lines of logs to find critical information like test summaries, security scan results, or deployment notes, you can use the hcli annotate command to push this data to a dedicated Annotations tab in the Harness UI.

For more information visit Pipeline Annotations

Hidden/Invisible Characters

Customers may occasionally encounter unexplained behavior in their scripts caused by hidden or invisible characters. These characters often appear when copying and pasting from non-plain-text sources and can lead to unexpected script errors. Harness includes a feature to display invisible characters, which is enabled by default.

When invisible characters are present, users will see a highlighted space in their scripts.

They can hover over the highlight to view the character and click "Adjust settings" to manage the display.

If a selection was accidentally made, the user can right-click within the script area and open the Command Palette.

A dialog box will appear, allowing the user to search for and toggle the setting that controls how invisible characters are highlighted.

Troubleshoot script execution (Run steps)

Go to the CI Knowledge Base for questions and issues related to script execution and using Run steps, such as:

Last updated

Was this helpful?