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"| Benefits | Downsides |
|---|---|
| C# — familiar to game developers | More complex development/publishing workflow |
| NuGet package management | Requires 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 pythonimport sys
if __name__ == "__main__": print("Hello World from Python!") print(str(sys.argv))| Benefits | Downsides |
|---|---|
| No complicated publishing workflow | No pipeline API for common operations |
| Easy for simple actions | Unfamiliar to game programmers |
| Any script language supported | Scripts 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.
| Benefits | Downsides |
|---|---|
| Split large pipeline files into smaller ones | Can 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
ITeardowninterface, 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.