Skip to content

Repository files navigation

stackql-deploy logo

Model-driven resource provisioning and deployment framework using StackQL.

Crates.ioCrates.io DownloadsLicense: MITPlatformDocs


stackql-deploy is a multi-cloud Infrastructure-as-Code framework inspired by dbt, built on top of StackQL. Define cloud resources as SQL-like models, then build, test, and teardown across any environment — no state files required.

This is the Rust rewrite (v2.x). The original Python package (v1.x, last release 1.9.4) is now archived — see its changelog for prior history.

Install

Via cargo:

cargo install stackql-deploy

Direct binary download (Linux, macOS, Windows — x86_64 and ARM64):

Download the latest release from the GitHub Releases page, extract, and place the binary on your PATH.

How it works

A stackql-deploy project is a directory with a manifest and StackQL query files:

example_stack/
├── stackql_manifest.yml
└── resources/
└── monitor_resource_group.iql

The manifest declares providers, global variables, and resources:

version: 1name: example_stackdescription: activity monitor stackproviders:
- azureglobals:
- name: subscription_idvalue: "{{ vars.AZURE_SUBSCRIPTION_ID }}"
- name: locationvalue: eastusresources:
- name: monitor_resource_groupdescription: azure resource groupprops:
- name: resource_group_namevalue: "activity-monitor-{{ globals.stack_env }}"

Use stackql-deploy init example_stack --provider azure to scaffold a new project.

Resource .iql files define mutation and check queries using SQL anchors:

/*+ create */INSERT INTOazure.resources.resource_groups(
resourceGroupName, subscriptionId, location
)
SELECT'{{ resource_group_name }}', '{{ subscription_id }}', '{{ location }}'/*+ update */UPDATEazure.resources.resource_groups
SET location ='{{ location }}'WHERE resourceGroupName ='{{ resource_group_name }}'AND subscriptionId ='{{ subscription_id }}'/*+ delete */DELETEFROMazure.resources.resource_groups
WHERE resourceGroupName ='{{ resource_group_name }}'AND subscriptionId ='{{ subscription_id }}'/*+ exists */SELECTCOUNT(*) as count FROMazure.resources.resource_groups
WHERE subscriptionId ='{{ subscription_id }}'AND resourceGroupName ='{{ resource_group_name }}'/*+ statecheck, retries=5, retry_delay=5 */SELECTCOUNT(*) as count FROMazure.resources.resource_groups
WHERE subscriptionId ='{{ subscription_id }}'AND resourceGroupName ='{{ resource_group_name }}'AND location ='{{ location }}'AND JSON_EXTRACT(properties, '$.provisioningState') ='Succeeded'/*+ exports */SELECT resourceGroupName, location
FROMazure.resources.resource_groups
WHERE subscriptionId ='{{ subscription_id }}'AND resourceGroupName ='{{ resource_group_name }}'

Query execution strategy

For each resource, stackql-deploy selects an execution path based on which anchors are defined in the .iql file:

graph TB
A[resource] --> B{has\ncreateorupdate?}
B -- Yes --> C[run createorupdate\nskip all checks]
B -- No --> D{has statecheck?}
D -- Yes --> E[exists check]
E --> F{exists?}
F -- No --> G[create]
F -- Yes --> H[statecheck]
H --> I{correct\nstate?}
I -- Yes --> J[✅ up to date]
I -- No --> K[update]
G & K --> L[post-deploy exports]
D -- No --> M{has exports?}
M -- Yes --> N[⚡ try exports first]
N --> O{returned\ndata?}
O -- Yes --> P[✅ validated +\nexports captured\nin 1 query]
O -- No --> Q[exists check]
Q --> R{exists?}
R -- No --> S[create]
R -- Yes --> S2[update]
S & S2 --> T[exports]
M -- No --> U[exists check\ncreate or update]
Loading

Tip: when there is no statecheck, an exports query that selects from the live resource serves as both a validation and data-extraction step in a single API call.

Usage

# Preview what would change (no mutations)
stackql-deploy build example_stack dev --dry-run
# Deploy
stackql-deploy build example_stack dev -e AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
# Run checks only
stackql-deploy test example_stack dev
# Deprovision (reverse order)
stackql-deploy teardown example_stack dev

Common flags:

FlagDescription
--dry-runPrint queries, make no changes
--on-failure=rollbackrollback, ignore, or error (default)
--env-file=.envLoad environment variables from a file
-e KEY=valuePass individual environment variables
--log-levelDEBUG, INFO, WARNING, ERROR, CRITICAL
--show-queriesPrint rendered SQL before execution

Show environment and provider info:

stackql-deploy info

Full command reference:

stackql-deploy --help

Documentation

Full documentation — manifest reference, query anchors, template filters, provider examples is at stackql-deploy.io/docs.

License

MIT - see LICENSE.

About

Statefile-less IaC framework for declarative cloud resource management using StackQL written in Rust

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages