1- name : Reset production database
1+ name : Reset database
22
33on :
44 workflow_dispatch :
55 inputs :
6+ target :
7+ description : " Target database"
8+ required : true
9+ type : choice
10+ options :
11+ - staging
12+ - production
613 mode :
714 description : " Seeding mode"
815 required : true
1219 - lite
1320 - full
1421 confirm :
15- description : " Type 'reset-prod' to confirm"
22+ description : " Type 'reset-staging' or 'reset- prod' to confirm"
1623 required : true
1724 type : string
1825 pull_request :
1926 paths :
2027 - " .github/workflows/db-reset.yml"
2128
2229jobs :
23- # Validation job - runs on PR to test connectivity (no environment = no approval needed)
30+ # Validation job - runs on PR to test connectivity against both environments
2431 validate :
25- name : Validate database connectivity
32+ name : Validate ${{ matrix.environment }} database connectivity
2633 runs-on : ubuntu-latest
2734 if : github.event_name == 'pull_request'
35+ environment : ${{ matrix.environment }}
36+ strategy :
37+ matrix :
38+ environment : [staging, production]
2839
2940 steps :
3041 - name : Checkout code
@@ -41,31 +52,37 @@ jobs:
4152
4253 - name : Test database connectivity
4354 env :
44- SUPABASE_DB_URL : ${{ secrets.SUPABASE_POOLER_URL }}
55+ SUPABASE_DB_URL : ${{ secrets.SUPABASE_DB_URL }}
4556 run : |
46- echo "Testing database connectivity..."
57+ echo "Testing ${{ matrix.environment }} database connectivity..."
4758 uv run python -c "
4859 from policyengine_api.config.settings import settings
4960 from sqlmodel import create_engine, text
5061 engine = create_engine(settings.database_url, echo=False)
5162 with engine.connect() as conn:
5263 result = conn.execute(text('SELECT 1'))
53- print('✅ Database connection successful')
64+ print('✅ ${{ matrix.environment }} database connection successful')
5465 "
5566
5667 # Reset job - only runs on manual trigger with confirmation
5768 reset-db :
58- name : Reset and reseed database
69+ name : Reset and reseed ${{ inputs.target }} database
5970 runs-on : ubuntu-latest
6071 if : github.event_name == 'workflow_dispatch'
61- environment : production
72+ environment : ${{ inputs.target }}
6273
6374 steps :
6475 - name : Verify confirmation
65- if : ${{ github.event.inputs.confirm != 'reset-prod' }}
6676 run : |
67- echo "❌ Confirmation failed. You must type 'reset-prod' to proceed."
68- exit 1
77+ EXPECTED="reset-staging"
78+ if [ "${{ inputs.target }}" = "production" ]; then
79+ EXPECTED="reset-prod"
80+ fi
81+ if [ "${{ inputs.confirm }}" != "$EXPECTED" ]; then
82+ echo "❌ Confirmation failed. You must type '$EXPECTED' to proceed."
83+ exit 1
84+ fi
85+ echo "✅ Confirmation verified for ${{ inputs.target }}"
6986
7087 - name : Checkout code
7188 uses : actions/checkout@v4
@@ -81,48 +98,49 @@ jobs:
8198
8299 - name : Reset database (init)
83100 env :
84- SUPABASE_DB_URL : ${{ secrets.SUPABASE_POOLER_URL }}
101+ SUPABASE_DB_URL : ${{ secrets.SUPABASE_DB_URL }}
85102 SUPABASE_URL : ${{ secrets.SUPABASE_URL }}
86103 SUPABASE_KEY : ${{ secrets.SUPABASE_KEY }}
87104 SUPABASE_SECRET_KEY : ${{ secrets.SUPABASE_SECRET_KEY }}
88105 LOGFIRE_TOKEN : ${{ secrets.LOGFIRE_TOKEN }}
89- LOGFIRE_ENVIRONMENT : prod
106+ LOGFIRE_ENVIRONMENT : ${{ inputs.target }}
90107 run : |
91- echo "Resetting database tables..."
108+ echo "Resetting ${{ inputs.target }} database tables..."
92109 echo "yes" | uv run python scripts/init.py --reset
93110
94111 - name : Seed database (lite)
95- if : ${{ github.event. inputs.mode == 'lite' }}
112+ if : ${{ inputs.mode == 'lite' }}
96113 env :
97- SUPABASE_DB_URL : ${{ secrets.SUPABASE_POOLER_URL }}
114+ SUPABASE_DB_URL : ${{ secrets.SUPABASE_DB_URL }}
98115 SUPABASE_URL : ${{ secrets.SUPABASE_URL }}
99116 SUPABASE_KEY : ${{ secrets.SUPABASE_KEY }}
100117 SUPABASE_SECRET_KEY : ${{ secrets.SUPABASE_SECRET_KEY }}
101118 STORAGE_BUCKET : ${{ vars.STORAGE_BUCKET }}
102119 LOGFIRE_TOKEN : ${{ secrets.LOGFIRE_TOKEN }}
103- LOGFIRE_ENVIRONMENT : prod
120+ LOGFIRE_ENVIRONMENT : ${{ inputs.target }}
104121 HUGGING_FACE_TOKEN : ${{ secrets.HUGGING_FACE_TOKEN }}
105122 run : |
106- echo "Seeding database (lite mode - fewer params, includes datasets )..."
123+ echo "Seeding ${{ inputs.target }} database (lite mode)..."
107124 uv run python scripts/seed.py --lite
108125
109126 - name : Seed database (full)
110- if : ${{ github.event. inputs.mode == 'full' }}
127+ if : ${{ inputs.mode == 'full' }}
111128 env :
112- SUPABASE_DB_URL : ${{ secrets.SUPABASE_POOLER_URL }}
129+ SUPABASE_DB_URL : ${{ secrets.SUPABASE_DB_URL }}
113130 SUPABASE_URL : ${{ secrets.SUPABASE_URL }}
114131 SUPABASE_KEY : ${{ secrets.SUPABASE_KEY }}
115132 SUPABASE_SECRET_KEY : ${{ secrets.SUPABASE_SECRET_KEY }}
116133 HUGGING_FACE_TOKEN : ${{ secrets.HUGGING_FACE_TOKEN }}
117134 STORAGE_BUCKET : ${{ vars.STORAGE_BUCKET }}
118135 LOGFIRE_TOKEN : ${{ secrets.LOGFIRE_TOKEN }}
119- LOGFIRE_ENVIRONMENT : prod
136+ LOGFIRE_ENVIRONMENT : ${{ inputs.target }}
120137 run : |
121- echo "Seeding database (full mode - includes datasets )..."
138+ echo "Seeding ${{ inputs.target }} database (full mode)..."
122139 uv run python scripts/seed.py
123140
124141 - name : Summary
125142 run : |
126143 echo "✅ Database reset complete!"
127- echo "Mode: ${{ github.event.inputs.mode }}"
144+ echo "Target: ${{ inputs.target }}"
145+ echo "Mode: ${{ inputs.mode }}"
128146 echo "Triggered by: ${{ github.actor }}"
0 commit comments