pgpm-deploy-lifecycle
npx skills add https://github.com/constructive-io/constructive-skills --skill pgpm-deploy-lifecycle
Agent 安装分布
Skill 文档
pgpm Deploy Lifecycle
The complete deploy â verify â revert lifecycle for pgpm database modules.
When to Apply
Use this skill when:
- Deploying database changes with
pgpm deploy - Reverting deployments with
pgpm revert - Verifying deployed state with
pgpm verify - Tagging deployment points with
pgpm tag - Checking deployment status with
pgpm migrate status - Running full-cycle tests with
pgpm test-packages
Core Concept
pgpm deployments are deterministic and plan-driven. Every change is tracked in pgpm.plan, and each change has exactly three scripts:
- deploy/ â applies the change
- verify/ â confirms it was applied correctly
- revert/ â undoes the change
pgpm handles transactions automatically â you just write the SQL.
Deploy
Basic Deploy
# Deploy all pending changes for the current module
pgpm deploy
# Deploy with database creation (if database doesn't exist)
pgpm deploy --createdb
# Deploy a specific module by name
pgpm deploy my-module
# Deploy all modules in the workspace
pgpm deploy --workspace --all
What Happens During Deploy
- Dependency resolution â reads
.controlfile, resolves all required extensions and pgpm modules - Extension creation â native Postgres extensions get
CREATE EXTENSION IF NOT EXISTS - Module dependency deploy â pgpm modules from
extensions/are deployed first (topological order) - Plan execution â each change in
pgpm.planis executed in order:- Checks if already deployed (via tracking schema)
- Runs the deploy script
- Records the change in the tracking schema
- Automatic verification â after deploy, verify scripts run to confirm state
Deploy to a Tag
# Deploy only up to a specific tag
pgpm deploy --to @v1.0.0
Deploy Options
| Option | Description |
|---|---|
--createdb |
Create the target database if it doesn’t exist |
--workspace |
Operate at workspace level |
--all |
Deploy all modules (with --workspace) |
--to @tag |
Deploy up to a specific tag |
--yes |
Skip confirmation prompts |
Verify
Verify checks that deployed changes are actually in the expected state.
# Verify all deployed changes
pgpm verify
# Verify a specific module
pgpm verify my-module
What Happens During Verify
For each deployed change, pgpm runs the corresponding verify/ script. Verify scripts typically use SELECT statements that will fail if the expected objects don’t exist:
-- verify/schemas/app/tables/users.sql
SELECT id, email, name, created_at
FROM app.users
WHERE FALSE;
If any verify script fails, pgpm reports which changes are in a bad state.
Revert
Revert undoes deployed changes in reverse order.
# Revert the last deployed change
pgpm revert
# Revert to a specific tag
pgpm revert --to @v1.0.0
# Revert all changes
pgpm revert --all
# Revert with confirmation skip
pgpm revert --yes
What Happens During Revert
- Changes are reverted in reverse plan order (last deployed = first reverted)
- Each revert script runs (e.g.,
DROP TABLE,DROP FUNCTION) - The change is removed from the tracking schema
- Verify scripts run to confirm the revert
Revert Options
| Option | Description |
|---|---|
--to @tag |
Revert back to a specific tag (exclusive â the tag itself stays) |
--all |
Revert all deployed changes |
--yes |
Skip confirmation prompts |
Tagging
Tags mark specific points in the deployment plan for targeted deploy/revert.
# Tag the current state
pgpm tag v1.0.0
# Tag with a description
pgpm tag v1.0.0 -m "Initial release"
Tags appear in pgpm.plan as:
@v1.0.0 2024-01-15T10:00:00Z user <user@example.com> # Initial release
Using Tags
# Deploy up to a tag
pgpm deploy --to @v1.0.0
# Revert to a tag (keeps the tag, reverts everything after it)
pgpm revert --to @v1.0.0
Status
Check what’s deployed and what’s pending.
# Show deployment status
pgpm migrate status
This shows:
- Which changes are deployed
- Which changes are pending (in plan but not yet deployed)
- The current tag (if any)
Full-Cycle Testing
pgpm test-packages runs a full deploy â verify â revert â deploy cycle to validate that all scripts work correctly in both directions.
# Full cycle test for current module
pgpm test-packages --full-cycle
# Full cycle test for all workspace modules
pgpm test-packages --full-cycle --workspace --all
This is the gold standard for validating migrations â it proves:
- Deploy scripts apply correctly
- Verify scripts confirm the deployed state
- Revert scripts cleanly undo everything
- Re-deploy works (proving revert was complete)
Common Workflows
First-time workspace deploy
Prerequisite: Ensure PostgreSQL is running and environment is loaded. See
pgpm-dockerandpgpm-envskills for setup.
pgpm admin-users bootstrap --yes
pgpm deploy --createdb --workspace --all --yes
Deploy after adding new changes
pgpm deploy
pgpm verify
Revert a bad deploy
pgpm revert --yes
# Fix the issue, then redeploy
pgpm deploy
Tag a release and deploy to that point
pgpm tag v1.0.0
pgpm deploy --to @v1.0.0
Validate all migrations (CI)
Note: In CI, start Postgres and load env vars first. See
pgpm-dockerandpgpm-envskills, orgithub-workflows-pgpmfor CI-specific patterns.
pgpm admin-users bootstrap --yes
pgpm test-packages --full-cycle --workspace --all
Tracking Schema
pgpm tracks deployments in a PostgreSQL schema (typically pgpm_migrate). This contains:
changestable â records each deployed change with timestamp and deployertagstable â records tagged points
This is how pgpm knows what’s already deployed and what’s pending.
Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
role "authenticated" does not exist |
Missing bootstrap | Run pgpm admin-users bootstrap --yes |
database "mydb" does not exist |
Database not created | Use pgpm deploy --createdb |
| Deploy fails mid-way | SQL error in a deploy script | Fix the script, pgpm revert the failed change, redeploy |
| Verify fails after deploy | Deploy script didn’t create expected objects | Check deploy script matches verify expectations |
| Revert fails | Revert script references objects that don’t exist | Check for dependencies between changes |
Already deployed |
Change was previously deployed | Check pgpm migrate status â may need pgpm revert first |