6.9 KiB
Common Pipeline Management Workflows
Real-world examples of typical pipeline operations in DevOps Center autonomous release scenarios. All commands use --json; add --target-org <alias> when not relying on the default org.
Workflow 1: End-to-End Pipeline Setup — Create, Stage, Bind Environments, Activate
User request: "Set up a release pipeline on repo myorg/myrepo with Integration → UAT → Production and activate it"
Steps:
-
Create the pipeline against the existing repo, then resolve its ID from the list:
sf devops pipeline create \ --name "Release Pipeline" \ --repo https://github.com/myorg/myrepo \ --json PIPELINE_ID=$(sf devops pipeline list --json | \ jq -r '.result.pipelines[] | select(.Name == "Release Pipeline") | .Id' | head -n1) -
Inspect the initial stages (a new pipeline always starts with at least one seeded stage):
sf devops pipeline get --pipeline-id "$PIPELINE_ID" --json | \ jq -r '.result.stages[] | "\(.name) (\(.id)) -> next: \(.nextStageId)"' -
Add stages in promotion order.
stage addinserts a stage before--next-stage-id, so anchor each new stage to the one that should follow it. To build Integration → UAT → Production, add Production first (or anchor to the terminal stage), then insert UAT before Production, then Integration before UAT:# Assume Production stage id is 0Xc...PROD (from step 2 or a prior add) sf devops pipeline stage add --pipeline-id "$PIPELINE_ID" \ --name "UAT" --next-stage-id 0XcPROD --json sf devops pipeline stage add --pipeline-id "$PIPELINE_ID" \ --name "Integration" --next-stage-id 0XcUAT --json -
Bind an environment to each stage (re-fetch stage IDs with
pipeline get). In CI, add--no-browser:sf devops stage environment add --pipeline-id "$PIPELINE_ID" \ --stage-id 0XcINT --environment-name integration-org --org-type Sandbox --no-browser --json sf devops stage environment add --pipeline-id "$PIPELINE_ID" \ --stage-id 0XcUAT --environment-name uat-org --org-type Sandbox --no-browser --json sf devops stage environment add --pipeline-id "$PIPELINE_ID" \ --stage-id 0XcPROD --environment-name prod-org --org-type Production --no-browser --json -
Activate once every stage has an environment:
sf devops pipeline update --pipeline-id "$PIPELINE_ID" --activate --json -
Verify the final shape:
sf devops pipeline get --pipeline-id "$PIPELINE_ID" --json | \ jq -r '.result | "\(.name) [\(.isActive)]: \([.stages[].name] | join(", "))"'
Report: "Release Pipeline created and activated: Integration → UAT → Production, environments bound."
Workflow 2: Insert a Staging Stage Before Production
User request: "Add a Staging stage between UAT and Production on the Release Pipeline"
Steps:
-
Find the pipeline and stage IDs:
PIPELINE_ID=$(sf devops pipeline list --json | \ jq -r '.result.pipelines[] | select(.Name == "Release Pipeline") | .Id' | head -n1) sf devops pipeline get --pipeline-id "$PIPELINE_ID" --json | \ jq -r '.result.stages[] | "\(.name) (\(.id)) -> next: \(.nextStageId)"' # Integration (0XcINT) -> next: 0XcUAT # UAT (0XcUAT) -> next: 0XcPROD # Production (0XcPROD) -> next: null -
Insert Staging before Production:
sf devops pipeline stage add --pipeline-id "$PIPELINE_ID" \ --name "Staging" --next-stage-id 0XcPROD --json -
Bind the staging environment (get the new stage ID from
pipeline get):sf devops stage environment add --pipeline-id "$PIPELINE_ID" \ --stage-id 0XcSTG --environment-name staging-org --org-type Sandbox --no-browser --json -
Verify Staging now sits between UAT and Production.
Constraint: This works only if the pipeline is not yet locked. Stages can't be modified after the pipeline is activated and changes have been promoted through it.
Report: "Staging stage inserted before Production, bound to staging-org."
Workflow 3: Attach a Project to a Pipeline
User request: "Connect Project Alpha to the Release Pipeline"
Steps:
-
Resolve IDs:
PIPELINE_ID=$(sf devops pipeline list --json | \ jq -r '.result.pipelines[] | select(.Name == "Release Pipeline") | .Id' | head -n1) PROJECT_ID=$(sf devops project list --json | \ jq -r '.result.projects[] | select(.Name == "Project Alpha") | .Id' | head -n1) -
Attach:
sf devops pipeline project add --pipeline-id "$PIPELINE_ID" --project-id "$PROJECT_ID" --json -
Verify via
pipeline getthat Project Alpha appears in.result.connectedProjects[].
Constraint: A project attaches to only one pipeline. If attach fails with "already attached," detach it from the other pipeline first:
sf devops pipeline project delete --pipeline-id <other> --project-id "$PROJECT_ID" --json.
Report: "Project Alpha attached to Release Pipeline."
Workflow 4: Rename and Deactivate a Pipeline
User request: "Deactivate the Release Pipeline and rename it to Legacy Pipeline"
Steps:
-
Combine deactivate + rename in one command:
sf devops pipeline update --pipeline-id 0XB000000000001 \ --deactivate --name "Legacy Pipeline" --json -
Verify via
pipeline getthat.result.isActiveis false and the name updated.
Report: "Pipeline deactivated and renamed to 'Legacy Pipeline'."
Workflow 5: Idempotent Pipeline Setup (Safe Re-Run in CI)
User request: "Ensure the Release Pipeline exists — runs on every CI job"
Steps:
PIPELINE_NAME="Release Pipeline"
EXISTING_ID=$(sf devops pipeline list --json | \
jq -r ".result.pipelines[] | select(.Name == \"$PIPELINE_NAME\") | .Id" | head -n1)
if [ -n "$EXISTING_ID" ]; then
echo "Pipeline already exists: $EXISTING_ID"
else
sf devops pipeline create --name "$PIPELINE_NAME" \
--repo https://github.com/myorg/myrepo --json
fi
Report: either the existing pipeline ID or the newly created one — no duplicate created.
Notes for Autonomous Runs
- Confirm org auth with
sf org display --jsonbefore the first command. - Stage IDs come from
sf devops pipeline get— always fetch them beforestage add/stage update/stage delete/stage environment add. stage addinserts before--next-stage-id; plan the anchor stage to get the order you want.stage environment addopens a browser OAuth flow — always pass--no-browserin CI and complete auth via the printed redirect URL.- Finish all stage/environment configuration before activating; an active, promoted pipeline locks its stage structure.
- Deactivate before deleting an environment; the pipeline must be inactive.
- Treat a same-name create as idempotent — check-before-create and report the existing pipeline.