Skip to content

Steps

Steps are operations executed by the Pipeline Runner. Each step performs a specific task, and all steps together form the pipeline. A step should be as focused as possible — the more specific it is, the more shareable it becomes.

Build Plugin Step

A C# NuGet package with full access to the pipeline API (build arguments, build result, data passing between steps). This is the recommended approach for most use cases.

A Build Plugin can contain multiple related steps. For example, build-plugins.unity contains ActivateStep, UnityBuildStep, and RunUnitTestsStep.

public class MyPluginStep : IStep
{
public string StepId => "MyPluginStep";
public async Task Run(IPipelineService pipelineService)
{
// Task code here
}
}

Referenced in the pipeline definition by stepId:

steps:
- name: "My Plugin"
run:
stepId: "MyPluginStep"
BenefitsDownsides
C# — familiar to game developersMore complex development/publishing workflow
NuGet package managementRequires CI for automated releases
Independent, isolated projects
Built-in pipeline API for common operations
Easy to test locally and share across teams
Code is not part of the game project

Script Step

Any script supported by the build agent environment (bash, Python, Node, Ruby, etc.). Simpler to set up but lacks the pipeline API — information is passed as command-line arguments via --values.

steps:
- name: "Hello World"
run:
script: "scripts/hello_world.py"
#!/usr/bin/env python
import sys
if __name__ == "__main__":
print("Hello World from Python!")
print(str(sys.argv))
BenefitsDownsides
No complicated publishing workflowNo pipeline API for common operations
Easy for simple actionsUnfamiliar to game programmers
Any script language supportedScripts are embedded in the game project

Include

Steps can be split across multiple files using include, allowing you to share common step sequences between pipeline definitions.

BenefitsDownsides
Split large pipeline files into smaller onesCan reduce readability if too granular
Share steps between pipeline definitions

Teardowns

Steps can define a teardown section for cleanup:

  • For Script Steps, specify a cleanup script path.
  • For Build Plugin Steps that implement the ITeardown interface, the teardown method is called automatically — no explicit declaration needed.
steps:
- name: "Build"
run:
script: "scripts/build"
teardown:
script: "scripts/cleanup"

Teardowns run when the pipeline finishes, regardless of whether the step succeeded or failed.