Skip to content

Runners

Runners are worker machines that execute custom scripts from your workflows. SuperPlane provides components for executing shell commands, bash scripts, JavaScript, and Python scripts.

Runs shell commands on a runner machine. Commands execute in order. The task succeeds when the last command exits with code 0, or fails if any command exits with a non-zero code.

Example:

Terminal window
git clone https://github.com/example/repo.git
cd repo
docker build -t example-image .
docker push example-image

To pass output from the commands to the next node on the canvas, write valid JSON to the $SUPERPLANE_RESULT_FILE file — the path the runner sets for your task.

Terminal window
git clone https://github.com/example/repo.git
cd repo
export IMAGE_TAG=example-image-$(git rev-parse HEAD)
docker build -t $IMAGE_TAG .
docker push $IMAGE_TAG
echo "{\"image\": \"$IMAGE_TAG\"}" > $SUPERPLANE_RESULT_FILE

Runs a Bash script on a runner machine. The task succeeds when the script exits with code 0, or fails if the script exits with a non-zero code.

Example:

#!/bin/bash
set -euo pipefail
for i in {1..10}; do
echo "Hello, world! $i"
done

To pass output from the script to the next node on the canvas, write valid JSON to the $SUPERPLANE_RESULT_FILE file — the path the runner sets for your task.

#!/bin/bash
set -euo pipefail
git clone https://github.com/example/repo.git
cd repo
docker build -t example-image .
docker push example-image
export IMAGE_TAG=example-image-$(git rev-parse HEAD)
docker build -t $IMAGE_TAG .
docker push $IMAGE_TAG
echo "{\"message\":\"Hello, world!\"}" > $SUPERPLANE_RESULT_FILE

Runs a JavaScript script on a runner machine.

Example:

function main() {
return { message: "Hello, world!" };
}

The script can read payloads from previous nodes using the $ object.

Example:

function main() {
const commitSHA = $["On Git Push"].data.after;
const commitMessage = $["On Git Push"].data.message;
const imageTag = `example-image-${commitSHA}`;
return { imageTag: imageTag };
}

The script returns a JSON object that is passed to the next node on the canvas.

function main() {
return { message: "Hello, world!" };
}

Before executing the script, the runner can install node packages using the npm install command as part of the setup commands.

Setup commands:

Terminal window
npm install @octokit/rest

Script:

function main() {
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN,
});
const response = await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', {
owner: 'octokit',
repo: 'octokit.js',
path: 'README.md',
});
return { contents: response.data };
}

Runs a Python script on a runner machine.

Example:

def main():
return { message: "Hello, world!" }

The script can read payloads from previous nodes using the $ object.

Example:

def main():
const commitSHA = $["On Git Push"].data.after;
const commitMessage = $["On Git Push"].data.message;
const imageTag = `example-image-${commitSHA}`;
return { imageTag: imageTag };
}

The script returns a JSON object that is passed to the next node on the canvas.

def main():
return { message: "Hello, world!" }

Before executing the script, the runner can install Python packages using the pip install command as part of the setup commands.

Setup commands:

Terminal window
pip install @octokit/rest

Script:

import octokit
def main():
octokit = octokit.Octokit({
auth: process.env.GITHUB_TOKEN,
})
response = await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', {
owner: 'octokit',
repo: 'octokit.js',
path: 'README.md',
})
return { contents: response.data }

Every runner node requires a machine type that will run your script. Pick one that matches the architecture and size your workload needs.

Machine typeArchitecturevCPUsMemory
e1-large-amd64AMD64416GB
e1-large-arm64ARM64416GB
e1-tiny-amd64AMD640.51GB
e1-tiny-arm64ARM640.51GB

Every task runs in one of two execution modes:

Execution modeWhere work runs
HostDirectly on the runner machine (default)
DockerInside a container image you choose

Use Docker when you need an isolated environment or a specific toolchain image.

Pre-installed software on the host machine

Section titled “Pre-installed software on the host machine”

The runner machine comes with the following pre-installed software.

SoftwareVersion
Ubuntu24.04 LTS
Bash5.2
Docker CE29.5.3
Docker Buildx0.34.1
Docker Compose5.1.4
Node.js22.22
Python3.12.3
AWS CLI2.34

Use these directly in shell commands, Bash scripts, and setup commands.

Use runner components when a workflow step needs code or shell that SuperPlane integrations do not cover:

  • Run build scripts, linters, or custom tooling on dedicated machines
  • Transform upstream payload data with JavaScript or Python and pass structured output downstream
  • Execute in a specific container image without managing SSH or long-lived hosts

For remote commands on a host you manage directly, consider SSH Command instead. For HTTP or API calls, use HTTP Request.

For more on how payloads flow between nodes, see Data Flow. For expression syntax inside runner scripts and node configuration, see Expressions.