ops0ops0

Workflow Steps

Steps are the building blocks of workflows. Each step performs an action and can pass outputs to subsequent steps.

Step Categories

Infrastructure
IaC Deploy, Configuration Deploy
Actions
Script, HTTP Request
Flow Control
Approval, Wait, Condition, Loop
Notifications
Email, Slack, Webhook

IaC Deploy

Run Terraform plan, apply, or destroy operations.

FieldRequiredDescription
ProjectYesSelect from IaC projects
ActionYesPlan, Apply, or Destroy
Auto ApproveNoSkip approval for Apply
VariablesNoOverride Terraform variables
WorkspaceNoTerraform workspace

Variables Format:

{
  "instance_type": "t3.large",
  "environment": "production"
}

Outputs: outputs, plan_summary, status


Configuration Deploy

Run Ansible playbooks or Kubernetes manifests.

FieldRequiredDescription
ProjectYesSelect config project
TargetYesServer, group, or cluster
LimitNoAnsible host pattern
TagsNoRun only tagged tasks
Check ModeNoDry run

Outputs: changed, failed, summary


Script

Execute custom bash, Python, or Node scripts.

FieldRequiredDescription
ScriptYesInline script or file path
ShellNobash, sh, python, node
EnvironmentNoEnvironment variables
Working DirectoryNoExecution path
TimeoutNoMax execution time

Example Script:

#!/bin/bash
echo "Deploying version ${VERSION}"
curl -X POST https://api.example.com/deploy \
  -H "Authorization: Bearer ${API_TOKEN}" \
  -d '{"version": "'${VERSION}'"}'

Outputs: stdout, stderr, exit_code


HTTP Request

Call external APIs or webhooks.

FieldRequiredDescription
URLYesFull URL
MethodYesGET, POST, PUT, DELETE
HeadersNoHTTP headers
BodyNoRequest body (JSON)
AuthNoNone, Basic, Bearer, API Key
Success CodesNoExpected status codes (default: 2xx)

Headers Example:

{
  "Content-Type": "application/json",
  "Authorization": "Bearer ${secrets.API_TOKEN}"
}

Outputs: status_code, body, headers


Approval

Pause workflow for human approval.

FieldRequiredDescription
ApproversYesUsers, teams, or roles
MessageNoApproval request message
TimeoutNoAuto-reject after duration
Min ApprovalsNoRequired approval count

Approver Formats:

  • user:john@example.com
  • team:platform-team
  • role:admin

Outputs: approved_by, approved_at, comment


Wait

Pause workflow for a specified duration.

FieldRequiredDescription
DurationYesWait time value
UnitYesseconds, minutes, hours

Use Cases:

  • Wait for resources to provision
  • Rate limiting between API calls
  • Scheduled delays

Condition

Branch workflow based on expressions.

FieldRequiredDescription
ConditionYesExpression to evaluate
True PathYesSteps if condition is true
False PathNoSteps if condition is false

Operators:

OperatorDescription
==Equals
!=Not equals
>, <, >=, <=Comparisons
&&, ||And, Or
contains()String contains

Example Conditions:

${steps.plan.output.changes} > 0
${trigger.branch} == "main"
${env.ENVIRONMENT} == "production"

Loop

Iterate over a list of items.

FieldRequiredDescription
ItemsYesArray to iterate
ParallelNoRun iterations in parallel
Max ParallelNoConcurrent iteration limit

Items Sources:

["us-east-1", "eu-west-1", "ap-southeast-1"]
${steps.get_regions.output.regions}

Access Current Item: ${loop.item}


Email

Send email notifications.

FieldRequiredDescription
ToYesRecipients
SubjectYesEmail subject
BodyYesEmail body (HTML or text)
CCNoCC recipients

Slack

Send Slack messages.

FieldRequiredDescription
ChannelYesSlack channel
MessageYesMessage text
BlocksNoSlack blocks JSON

Message Template:

πŸš€ *Deployment Complete*
Workflow: ${workflow.name}
Status: ${workflow.status}
Duration: ${workflow.duration}

Webhook

Send HTTP webhook notifications.

FieldRequiredDescription
URLYesWebhook URL
PayloadNoJSON payload
HeadersNoCustom headers

Common Settings

All steps share these settings:

SettingDescription
TimeoutMax execution time
Continue on ErrorDon't fail workflow if step fails
Retry on FailureNumber of retry attempts
Retry DelayWait between retries
Run IfCondition to run step
Skip IfCondition to skip step

Example: Multi-Step Deployment

Step Configuration

StepTypeKey Settings
BuildScriptnpm run build
PlanIaC DeployAction: Plan
Check ChangesCondition${steps.plan.output.changes} > 0
ApprovalApprovalApprovers: team:devops
ApplyIaC DeployAction: Apply
Health CheckHTTP RequestGET /health, expect 200
NotifySlackChannel: #deploys

Condition Logic

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚ Check Changesβ”‚
                    β”‚ changes > 0  β”‚
                    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚ true                    β”‚ false
        β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”             β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
        β”‚ Approval  β”‚             β”‚   Skip    β”‚
        β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜             β”‚  (end)    β”‚
              β”‚                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
        β”‚   Apply   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Variable Passing

Step 1 (Build):
  Output: version = "1.2.3"

Step 2 (Deploy):
  Input:  ${steps.build.output.version}

Step 3 (Notify):
  Message: Deployed v${steps.build.output.version}