GitHub calls it a workflow. GitLab calls it a pipeline. Jenkins has both. Most teams use the terms interchangeably until something breaks during migration.
The distinction matters because these concepts solve different problems. Understanding the difference changes how you architect CI/CD systems, not just what you call them.
The Naming Problem
Every major CI/CD platform picked different terminology:
- GitHub Actions: Workflow (the YAML file defines a workflow)
- GitLab CI/CD: Pipeline (the YAML file defines a pipeline)
- Bitbucket: Pipelines (the product name and the YAML concept)
- Jenkins: Both (Jenkinsfile defines a pipeline; larger systems use workflows)
These tools do roughly the same things. The names are marketing decisions, not technical distinctions. But the underlying concepts-workflow and pipeline-represent different architectural patterns.
Conflating them causes real problems. I’ve seen teams spend days replicating Jenkins pipeline logic in GitHub Actions by treating stages as jobs, only to discover that jobs run on separate runners with no shared state. The translation failed because they mapped terminology instead of understanding the execution model.
What a Pipeline Actually Is
A pipeline is an execution pattern. It defines a sequence of stages where each stage’s output becomes the next stage’s input. The flow is linear and deterministic.
Characteristics:
- Sequential execution (stage N+1 depends on stage N)
- Data or artifacts flow forward through stages
- No branching, no conditional paths
- No event handling or orchestration logic
Pure Pipeline Structure
A pipeline is pure execution flow: sequential stages with data flowing forward
Classic example: Build → Test → Deploy
The build stage produces artifacts. The test stage consumes those artifacts. The deploy stage consumes tested artifacts. Each stage is a transformation applied to the output of the previous stage.
This is a pipeline because it models data flow through transformations, not decision logic.
What a Workflow Actually Is
A workflow is a decision pattern. It defines what runs, when it runs, and under what conditions. It handles orchestration, coordination, and control flow.
Characteristics:
- Event-driven (triggered by push, PR, schedule, manual action)
- Conditional execution (if statements, branch filters, manual gates)
- Parallel execution (independent jobs running concurrently)
- Orchestration logic (deciding what happens based on context)
Workflow Structure with Orchestration
A workflow coordinates jobs, handles events, and makes decisions
A workflow can call pipelines. A workflow can look like a pipeline. But a workflow is fundamentally about control flow, not data flow.
The Critical Difference
Pipelines don’t listen. Workflows listen.
If your automation reacts to events-a git push, a pull request, a timer-it’s a workflow. Pipelines execute when called; they don’t decide when to run.
Event Handling: Workflow vs Pipeline
Workflows react to events; pipelines are invoked by callers
Pipelines don’t branch. Workflows branch.
If your automation can skip steps, run parallel tracks, or diverge based on conditions, it’s a workflow. Pipelines execute sequentially from start to finish.
Pipelines are execution. Workflows are orchestration.
A pipeline is a fixed sequence of operations. A workflow coordinates what operations run and in what order.
Why GitHub Got It Right (Technically)
GitHub Actions calls them workflows because that’s what they are. Even when you write this:
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: make build
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: make test
You’ve written a workflow that happens to execute jobs sequentially, resembling a pipeline. But it’s still a workflow because:
- It triggers on events (
on: push) - Each job runs on a separate runner (no guaranteed state sharing)
- You can add conditional logic, parallel jobs, or manual approvals without changing the model
GitHub Actions: Workflow That Looks Like a Pipeline
Linear execution shape doesn't make it a pipeline-it's still workflow orchestration
GitHub workflows can model pipelines. But they remain workflows.
Why GitLab’s Naming Causes Confusion
GitLab CI/CD calls the YAML file a pipeline, but the system behaves like a workflow:
- Triggers on events
- Supports parallel jobs
- Supports conditional execution
- Supports manual jobs
The product is called “GitLab CI/CD Pipelines” because “pipeline” was already familiar terminology when GitLab launched CI features. But what you’re actually defining is a workflow that often contains pipeline-like sequences.
This isn’t wrong, but it does blur the conceptual line.
A Workflow Can Contain a Pipeline
This is the relationship most people miss:
Workflow Containing Multiple Pipelines
A workflow can invoke multiple pipelines, potentially in parallel
A workflow can invoke a pipeline. A workflow can invoke multiple pipelines. A workflow can run pipelines in parallel or conditionally.
But a pipeline cannot invoke a workflow. A pipeline cannot decide when to run. A pipeline is purely execution.
When Shape Doesn’t Determine Type
Here’s the critical insight: linear execution does not make something a pipeline.
Case 1: Simple linear workflow
Linear Workflow (Still Not a Pipeline)
Linear shape, but still a workflow (has event trigger and orchestration)
Case 2: Parallel execution workflow
Parallel Workflow (Definitely Not a Pipeline)
Parallel execution is a clear workflow pattern-pipelines are sequential
Case 3: Conditional workflow
Conditional Workflow with Branching
Branching and conditions are workflow behaviors-impossible in pure pipelines
Why are all of these workflows and not pipelines? Because they still handle orchestration (event triggers, job coordination, conditional logic). The execution shape doesn’t change what they are.
The Mental Test
To determine what you’re actually building, remove all triggers and conditions:
- If it still makes sense as a standalone sequence of operations → pipeline
- If it stops making sense without the triggering context → workflow
Example 1: build → test → deploy makes sense as a standalone pipeline. You could call it from anywhere.
Example 2: on: push → build → if: main branch → deploy does not make sense without the workflow context. The decision logic is part of the definition.
Migration Gotcha
When moving from Jenkins to GitHub Actions, don't map Jenkins stages to GitHub jobs one-to-one. Jenkins stages run on the same agent and share filesystem state. GitHub jobs run on separate runners. If your stages depend on shared state, you need to rethink your architecture, not just translate YAML.
Practical Implications
When migrating between platforms:
- Don’t map Jenkins stages to GitHub jobs one-to-one
- Jenkins stages share workspace and state; GitHub jobs don’t
- Understand the execution model before translating YAML
When designing automation:
- Need event handling, conditions, or parallel execution? You need a workflow.
- Need a reusable sequence of transformations? Build a pipeline.
- Need both? Build a pipeline and invoke it from a workflow.
When debugging failures:
- Workflow failure: orchestration problem (triggers, conditions, dependencies)
- Pipeline failure: execution problem (stage logic, artifacts, environment)
The Complete Mental Model
The Full Relationship Between Workflows and Pipelines
Workflows orchestrate when and what; pipelines execute how
The Classification Rule
Here’s a simple decision tree you can apply to any CI/CD configuration:
Does it react to external events (push, PR, schedule)?
- Yes → It’s a workflow
- No → It might be a pipeline
Does it contain conditional logic or branching?
- Yes → It’s a workflow
- No → It might be a pipeline
Can you execute it standalone without context?
- Yes → It’s a pipeline
- No → It’s a workflow
Does it coordinate multiple independent processes?
- Yes → It’s a workflow
- No → It might be a pipeline
If you answered “workflow” to any of these, it’s a workflow. Even if it looks linear.
Takeaway
A pipeline is an execution model: sequential stages with data flowing forward.
A workflow is a decision model: orchestration logic that determines what runs and when.
Most CI/CD tools implement workflows. Some workflows look like pipelines. That doesn’t make them pipelines.
The distinction becomes critical when you add complexity-parallel jobs, conditional execution, manual gates. At that point, treating your workflow as a pipeline will cause architectural mistakes.
Use the correct mental model for what you’re building. Your automation architecture will be clearer for it.
Quick reference:
| Aspect | Pipeline | Workflow |
|---|---|---|
| Purpose | Execute sequence | Orchestrate logic |
| Flow | Data flow | Control flow |
| Triggers | None (called) | Events, schedules |
| Branching | No | Yes |
| Parallelism | No | Yes |
| Reusability | High (called from workflows) | Medium (can call pipelines) |
| Mental model | ”What steps run" | "When and what runs” |
Stay up to date
Get notified when I publish something new, and unsubscribe at any time.

Comments
Nothing yet. Say the first thing.
Sign in to join the conversation.