/fabric-pipeline-deploy — Deploy a Data Pipeline to Fabric
Status: preview. F2 Fabric workspace lifecycle suite, 2026-05-28. Source pattern from
distributions/demo-claude/.../local/pipeline_deploy_run.py
redeploy_pipeline_corrected_dag.py(DDF demo pipeline build).
What it does
Deploys a Microsoft Fabric Data Pipeline (DAG of notebook / copy / dataflow
activities) into a target workspace. Pipeline definition is supplied as a
JSON / YAML file matching Fabric's dataPipelines item-definition schema.
This is the orchestration counterpart of /fabric-notebook-deploy: notebooks
are individual units; pipelines wire them into a DAG that Fabric schedules
and runs end-to-end.
When to use
- After deploying notebooks via
/fabric-notebook-deploy, when you need to chain them into a pipeline that executes them in order - Migrating a Databricks Job to a Fabric Data Pipeline (DBR Job DAG → Fabric Pipeline activities)
- Updating an existing pipeline DAG (e.g. adding a new notebook activity)
Prerequisites
FabricConnectorcredentials- Target workspace already exists with the notebooks referenced by the
pipeline already deployed (use
/fabric-items-listto confirm) - Pipeline definition file in the expected Fabric schema (see "Definition format" below)
Usage
/fabric-pipeline-deploy <path-to-pipeline.json> --env dev --name "acme_medallion"
/fabric-pipeline-deploy <path-to-pipeline.json> --workspace-id <id> --name "..."
/fabric-pipeline-deploy <path-to-pipeline.json> --env dev --name "..." --update # update if exists, error otherwise
/fabric-pipeline-deploy <path-to-pipeline.json> --env dev --name "..." --dry-run
Definition format
The JSON file follows Fabric's Data Pipeline schema:
{
"properties": {
"activities": [
{
"name": "run_setup",
"type": "TridentNotebook",
"typeProperties": {
"notebookId": "<notebook-id-resolved-by-name>",
"workspaceId": "<ws-id>"
}
},
{
"name": "run_silver",
"type": "TridentNotebook",
"dependsOn": [{ "activity": "run_setup", "dependencyConditions": ["Succeeded"] }],
"typeProperties": { "notebookId": "...", "workspaceId": "..." }
}
]
}
}
V1 supports TridentNotebook activities (the DDF demo pattern). Future
versions: Copy, Dataflow, Lookup, ForEach, etc.
Pipeline summary
- Resolve workspace id (from
--workspace-idor overlay) - Load project + credentials, build connector
- Read pipeline definition file → parse JSON
- Resolve any
<notebook-name>references in the definition to real notebook ids viafind_item_by_name(ws, name, "Notebook")(caller- supplied helper if the definition file uses names not ids) - Pre-flight:
find_item_by_name(ws, name, "DataPipeline"):- If exists and
--update: proceed withupdate_item_definition - If exists and no
--update: refuse - If not exists: proceed with
create_item
- If exists and
- Encode the definition as Fabric expects (base64 part wrapper)
- Echo plan + confirm
create_item(ws, display_name=name, item_type="DataPipeline", definition=...)(handles 202 LRO) ORupdate_item_definition(ws, item_id, definition=...)- Surface the pipeline id
- Suggest next step:
/fabric-pipeline-run --pipeline-id <id>to execute - ops.log:
PIPELINE-DEPLOY | <env or -> | fabric: ws=<id> name=<name> pid=<id> action=<create|update> | ok
Preview tracking — known unknowns
- Name resolution helper: V1 assumes the definition file already contains notebook ids. Resolving by name requires a pre-pass — should live in this skill or as a utility script? Decide at first real use.
- Schema validation: V1 trusts the input JSON. A malformed definition gets rejected by Fabric with a 400 + opaque error. Future: light schema validation client-side.
- Update conflict: if two operators update the same pipeline
concurrently, Fabric returns 412 Precondition Failed. V1 surfaces as
fail; no auto-retry or merge. - Trigger config: V1 deploys the pipeline definition only. Scheduling triggers (cron, blob trigger, etc.) are a separate API not yet wrapped.
Status — promotion to stable
- 3+ pipelines deployed across distinct workspaces (DEV / CERT / PROD)
- At least 1 update-in-place scenario tested without losing prior history
- The name-resolution helper (if needed) is in stable shape
- ops.log entries reviewed for audit
ARGUMENTS: $ARGUMENTS