Deployment and Orchestration
This domain accounts for 17% of the dbt Analytics Engineering Certification exam — making it one of the highest-weighted areas. It tests your ability to configure dbt projects for production use: understanding environment and target concepts, constructing job commands, implementing CI pipelines with state-based selection, choosing between execution commands, writing node selection syntax, distinguishing dbt Cloud from dbt Core orchestration patterns, and handling production failures. Expect scenario-based questions that require you to pick the correct command, flag, or configuration for a described production requirement.
Environments, Targets, and Profiles
Core Concepts
A profile (profiles.yml) defines one or more named targets — each target is a set of connection credentials and configuration values (warehouse, schema, threads, etc.). The profile is referenced by name in dbt_project.yml.
A target is a single connection configuration within a profile. The active target is selected at runtime. By convention:
devtarget: used by individual developers; typically writes to a developer-specific schema (e.g.,dbt_jsmith).prodtarget: used by scheduled jobs; writes to canonical schemas consumed by BI tools.
In dbt Core, profiles.yml lives in ~/.dbt/ by default or can be specified with --profiles-dir. Developers manage their own file locally.
In dbt Cloud, profiles are abstracted away entirely. Environments in dbt Cloud replace the profile/target concept. Each dbt Cloud Environment maps to exactly one set of warehouse credentials, a target schema, and a dbt version. You do not write profiles.yml in dbt Cloud — the platform generates the connection at runtime.
dbt Cloud Environment Types
| Environment Type | Purpose | Can run scheduled jobs? | Has IDE access? |
|---|---|---|---|
| Development | Individual developer work in the IDE | No | Yes |
| Staging | CI/pre-prod testing (optional) | Yes (via jobs) | No |
| Production | Scheduled production runs | Yes | No |
Key detail: Development environments in dbt Cloud are tied to individual credentials set in each user's Profile settings (not the environment itself). Production/Staging environments use service-account credentials configured at the environment level.
Target Name in dbt Cloud
In dbt Cloud, the target name exposed to {{ target.name }} in Jinja is set on the environment. Default is default unless you explicitly override it. A common pattern is setting it to prod so that {% if target.name == 'prod' %} guards work correctly in production jobs.
Common Traps
- Trap: Assuming
profiles.ymlis needed in dbt Cloud projects. It is not — dbt Cloud manages connections through its UI/environment config. - Trap: Confusing the environment (dbt Cloud concept) with the target (dbt Core concept). They serve the same purpose but are different mechanisms.
- Trap: Thinking
devvsprodis enforced by dbt itself. The names are purely conventional — dbt only cares about which target is active. - Trap: Believing all dbt Cloud environments can serve as the development environment. Only environments of type Development power the IDE.
Worked Scenario
Requirement: A developer wants code in models/staging/ to write to dbt_jsmith schema in dev, and to analytics schema in prod, using the same model without hardcoding schema names.
Solution: Use {{ target.schema }} or the generate_schema_name macro, which reads the active target's schema. In profiles.yml (Core) or dbt Cloud environment settings (Cloud), set the schema per environment. No model code changes required — the macro/target handles the switch.
Job Scheduling, Commands, and Run Order
Job Anatomy in dbt Cloud
A dbt Cloud Job is a named configuration that specifies:
- Environment it runs in
- Commands to execute (ordered list)
- Trigger: schedule (cron), API, or after another job (job chaining)
- Git branch or version to run against
Commands in a job execute sequentially. If any command exits with a non-zero code, subsequent commands do not run by default.
Command Ordering Conventions
The standard production job command sequence:
dbt deps
dbt build --select state:modified+ --defer --state logs/
Or for a full-refresh job:
dbt deps
dbt seed
dbt run
dbt test
dbt deps should always be the first command if packages are used, because it installs packages before any compilation or execution occurs.
Schedule Syntax
dbt Cloud uses cron syntax for scheduling. Example: 0 6 * * 1-5 = 6:00 AM UTC, Monday through Friday. The timezone can be configured per job.
dbt Core Orchestration Options
In dbt Core (self-hosted), you need an external orchestrator:
| Tool | Key Integration |
|---|---|
| Apache Airflow | DbtRunOperator, DbtTaskGroup, Cosmos library |
| Prefect | dbt Cloud and Core task libraries |
| Dagster | First-class dbt integration via dagster-dbt |
| GitHub Actions | CI/CD pipeline steps with dbt run CLI |
| Azure Data Factory | dbt CLI invocation via pipeline activity |
With external orchestrators, each dbt command is typically a separate task, enabling task-level retry, logging, and dependency management.
Common Traps
- Trap: Assuming you can skip
dbt depsin Cloud. You can, but only if you have no packages. Best practice always includes it. - Trap: Believing commands in a dbt Cloud job run in parallel. They run sequentially.
- Trap: Confusing job triggers: API triggers are separate from schedule triggers; a job can have both enabled simultaneously.
- Trap: Thinking dbt Cloud jobs can fan out to parallel branches natively. They cannot — parallelism within a single job is at the model node level (controlled by
--threads), not the command level.
Unlock with a paid plan
8 more sections (about 2,415 words) continue below. Every paid plan unlocks all dbt Analytics Engineering Certification study guides, the full question bank and mock exams, from $4.97/month.