Skip to content

Commit a27bd97

Browse files
authored
Update PolicyEngine runtime versions (#362)
* Update PolicyEngine runtime versions * Fix deploy workflow shell quoting
1 parent f3965ba commit a27bd97

9 files changed

Lines changed: 151 additions & 37 deletions

File tree

.github/scripts/modal-deploy-versioned.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
# Deploy versioned simulation app to Modal
33
# Usage: ./modal-deploy-versioned.sh <modal-environment>
4-
# Required env vars: POLICYENGINE_US_VERSION, POLICYENGINE_UK_VERSION
4+
# Required env vars: POLICYENGINE_VERSION, POLICYENGINE_US_VERSION, POLICYENGINE_UK_VERSION
55
#
66
# Deploys a versioned app named policyengine-us{X}-uk{Y} and updates
77
# the Modal Dict version registries so Cloud Run can route to it.
@@ -14,6 +14,7 @@ MODAL_ENV="${1:?Modal environment required (staging or main)}"
1414
# Validate required env vars
1515
: "${POLICYENGINE_US_VERSION:?POLICYENGINE_US_VERSION must be set}"
1616
: "${POLICYENGINE_UK_VERSION:?POLICYENGINE_UK_VERSION must be set}"
17+
: "${POLICYENGINE_VERSION:?POLICYENGINE_VERSION must be set}"
1718

1819
# Generate versioned app name (dots replaced with dashes)
1920
US_VERSION_SAFE="${POLICYENGINE_US_VERSION//./-}"
@@ -24,6 +25,7 @@ echo "========================================"
2425
echo "Deploying versioned Modal simulation app"
2526
echo " Environment: $MODAL_ENV"
2627
echo " App name: $APP_NAME"
28+
echo " policyengine.py: ${POLICYENGINE_VERSION}"
2729
echo " US version: ${POLICYENGINE_US_VERSION}"
2830
echo " UK version: ${POLICYENGINE_UK_VERSION}"
2931
echo "========================================"
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
#!/bin/bash
2-
# Extract policyengine-us and policyengine-uk versions from uv.lock
2+
# Extract policyengine, policyengine-us, and policyengine-uk versions from uv.lock
33
# Usage: ./modal-extract-versions.sh [project-dir]
4-
# Outputs: Sets us_version and uk_version in GITHUB_OUTPUT
4+
# Outputs: Sets policyengine_version, us_version, and uk_version in GITHUB_OUTPUT
55

66
set -euo pipefail
77

88
PROJECT_DIR="${1:-.}"
99

1010
cd "$PROJECT_DIR"
1111

12+
POLICYENGINE_VERSION=$(grep -A1 'name = "policyengine"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/')
1213
US_VERSION=$(grep -A1 'name = "policyengine-us"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/')
1314
UK_VERSION=$(grep -A1 'name = "policyengine-uk"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/')
1415

15-
if [ -z "$US_VERSION" ] || [ -z "$UK_VERSION" ]; then
16+
if [ -z "$POLICYENGINE_VERSION" ] || [ -z "$US_VERSION" ] || [ -z "$UK_VERSION" ]; then
1617
echo "ERROR: Could not extract versions from uv.lock"
18+
echo " POLICYENGINE_VERSION=$POLICYENGINE_VERSION"
1719
echo " US_VERSION=$US_VERSION"
1820
echo " UK_VERSION=$UK_VERSION"
1921
exit 1
2022
fi
2123

24+
echo "policyengine_version=$POLICYENGINE_VERSION" >> "$GITHUB_OUTPUT"
2225
echo "us_version=$US_VERSION" >> "$GITHUB_OUTPUT"
2326
echo "uk_version=$UK_VERSION" >> "$GITHUB_OUTPUT"
24-
echo "Extracted versions: policyengine-us=$US_VERSION, policyengine-uk=$UK_VERSION"
27+
echo "Extracted versions: policyengine=$POLICYENGINE_VERSION, policyengine-us=$US_VERSION, policyengine-uk=$UK_VERSION"

.github/workflows/db-reseed.yml

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
name: Reseed database
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
target:
7+
description: "Target database"
8+
required: true
9+
type: choice
10+
options:
11+
- staging
12+
- production
13+
preset:
14+
description: "Seeding preset"
15+
required: true
16+
default: "full"
17+
type: choice
18+
options:
19+
- full
20+
- lite
21+
- minimal
22+
- uk-lite
23+
- uk-minimal
24+
- us-lite
25+
- us-minimal
26+
- testing
27+
confirm:
28+
description: "Type 'reseed-staging' or 'reseed-prod' to confirm"
29+
required: true
30+
type: string
31+
pull_request:
32+
paths:
33+
- ".github/workflows/db-reseed.yml"
34+
35+
jobs:
36+
validate:
37+
name: Validate workflow
38+
runs-on: ubuntu-latest
39+
if: github.event_name == 'pull_request'
40+
41+
steps:
42+
- name: Checkout code
43+
uses: actions/checkout@v6
44+
45+
- name: Validate workflow syntax
46+
run: |
47+
bash <(curl -sSL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
48+
./actionlint -color
49+
50+
reseed-db:
51+
name: Reseed ${{ inputs.target }} database
52+
runs-on: ubuntu-latest
53+
if: github.event_name == 'workflow_dispatch'
54+
environment: ${{ inputs.target }}
55+
56+
steps:
57+
- name: Verify confirmation
58+
run: |
59+
EXPECTED="reseed-staging"
60+
if [ "${{ inputs.target }}" = "production" ]; then
61+
EXPECTED="reseed-prod"
62+
fi
63+
if [ "${{ inputs.confirm }}" != "$EXPECTED" ]; then
64+
echo "Confirmation failed. You must type '$EXPECTED' to proceed."
65+
exit 1
66+
fi
67+
echo "Confirmation verified for ${{ inputs.target }}"
68+
69+
- name: Checkout code
70+
uses: actions/checkout@v6
71+
72+
- name: Install uv
73+
uses: astral-sh/setup-uv@v8.1.0
74+
with:
75+
save-cache: false
76+
77+
- name: Setup Python
78+
run: uv python install 3.13
79+
80+
- name: Sync dependencies
81+
run: uv sync
82+
83+
- name: Reseed database
84+
env:
85+
SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}
86+
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
87+
SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }}
88+
SUPABASE_SECRET_KEY: ${{ secrets.SUPABASE_SECRET_KEY }}
89+
HUGGING_FACE_TOKEN: ${{ secrets.HUGGING_FACE_TOKEN }}
90+
STORAGE_BUCKET: ${{ vars.STORAGE_BUCKET }}
91+
LOGFIRE_TOKEN: ${{ secrets.LOGFIRE_TOKEN }}
92+
LOGFIRE_ENVIRONMENT: ${{ inputs.target }}
93+
run: |
94+
echo "Reseeding ${{ inputs.target }} database with preset '${{ inputs.preset }}'..."
95+
uv run python scripts/seed.py --preset="${{ inputs.preset }}"
96+
97+
- name: Summary
98+
run: |
99+
echo "Database reseed complete."
100+
echo "Target: ${{ inputs.target }}"
101+
echo "Preset: ${{ inputs.preset }}"
102+
echo "Triggered by: ${{ github.actor }}"

.github/workflows/deploy.yml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,14 @@ jobs:
131131
uses: google-github-actions/setup-gcloud@v3
132132

133133
- name: Configure Docker for Artifact Registry
134-
run: gcloud auth configure-docker ${{ vars.GCP_REGION }}-docker.pkg.dev
134+
run: gcloud auth configure-docker "${{ vars.GCP_REGION }}-docker.pkg.dev"
135135

136136
- name: Build and push Docker image
137137
run: |
138-
docker build -t $IMAGE_URL:${{ github.sha }} .
139-
docker tag $IMAGE_URL:${{ github.sha }} $IMAGE_URL:latest
140-
docker push $IMAGE_URL:${{ github.sha }}
141-
docker push $IMAGE_URL:latest
138+
docker build -t "${IMAGE_URL}:${{ github.sha }}" .
139+
docker tag "${IMAGE_URL}:${{ github.sha }}" "${IMAGE_URL}:latest"
140+
docker push "${IMAGE_URL}:${{ github.sha }}"
141+
docker push "${IMAGE_URL}:latest"
142142
143143
infra:
144144
name: Apply infrastructure
@@ -262,6 +262,7 @@ jobs:
262262
env:
263263
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
264264
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
265+
POLICYENGINE_VERSION: ${{ steps.versions.outputs.policyengine_version }}
265266
POLICYENGINE_US_VERSION: ${{ steps.versions.outputs.us_version }}
266267
POLICYENGINE_UK_VERSION: ${{ steps.versions.outputs.uk_version }}
267268
run: |
@@ -304,7 +305,7 @@ jobs:
304305
run: |
305306
gcloud run deploy ${{ vars.API_SERVICE_NAME }} \
306307
--region=${{ vars.GCP_REGION }} \
307-
--image=$IMAGE_URL:${{ github.sha }} \
308+
--image="${IMAGE_URL}:${{ github.sha }}" \
308309
--tag=staging \
309310
--no-traffic \
310311
--update-env-vars=MODAL_ENVIRONMENT=staging,LOGFIRE_ENVIRONMENT=staging,SUPABASE_URL=${{ secrets.SUPABASE_URL }},SUPABASE_KEY=${{ secrets.SUPABASE_KEY }},SUPABASE_SECRET_KEY=${{ secrets.SUPABASE_SECRET_KEY }},SUPABASE_DB_URL=${{ secrets.SUPABASE_DB_URL }}
@@ -400,6 +401,7 @@ jobs:
400401
env:
401402
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
402403
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
404+
POLICYENGINE_VERSION: ${{ steps.prod-versions.outputs.policyengine_version }}
403405
POLICYENGINE_US_VERSION: ${{ steps.prod-versions.outputs.us_version }}
404406
POLICYENGINE_UK_VERSION: ${{ steps.prod-versions.outputs.uk_version }}
405407
run: |
@@ -417,6 +419,7 @@ jobs:
417419
env:
418420
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
419421
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
422+
POLICYENGINE_VERSION: ${{ steps.prod-versions.outputs.policyengine_version }}
420423
POLICYENGINE_US_VERSION: ${{ steps.prod-versions.outputs.us_version }}
421424
POLICYENGINE_UK_VERSION: ${{ steps.prod-versions.outputs.uk_version }}
422425
run: |
@@ -469,7 +472,7 @@ jobs:
469472
run: |
470473
gcloud run deploy ${{ vars.API_SERVICE_NAME }} \
471474
--region=${{ vars.GCP_REGION }} \
472-
--image=$IMAGE_URL:${{ github.sha }} \
475+
--image="${IMAGE_URL}:${{ github.sha }}" \
473476
--tag=canary \
474477
--no-traffic \
475478
--update-env-vars=MODAL_ENVIRONMENT=main,LOGFIRE_ENVIRONMENT=prod

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ modal-deploy:
151151
"SUPABASE_KEY=$$SUPABASE_KEY" \
152152
"STORAGE_BUCKET=$$STORAGE_BUCKET" \
153153
--force
154-
@export POLICYENGINE_US_VERSION=$$(grep -A1 'name = "policyengine-us"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/') && \
154+
@export POLICYENGINE_VERSION=$$(grep -A1 'name = "policyengine"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/') && \
155+
export POLICYENGINE_US_VERSION=$$(grep -A1 'name = "policyengine-us"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/') && \
155156
export POLICYENGINE_UK_VERSION=$$(grep -A1 'name = "policyengine-uk"' uv.lock | grep version | head -1 | sed 's/.*"\(.*\)".*/\1/') && \
156157
.github/scripts/modal-deploy-versioned.sh main
157158

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Pin the Modal simulation image to the locked policyengine.py version and add a reseed-only database workflow.

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ dependencies = [
1111
"psycopg2-binary>=2.9.10",
1212
"supabase>=2.10.0",
1313
"storage3>=0.8.1",
14-
"policyengine>=3.2.3",
15-
"policyengine-uk==2.75.1",
16-
"policyengine-us==1.666.1",
14+
"policyengine==4.4.4",
15+
"policyengine-uk==2.88.14",
16+
"policyengine-us==1.691.3",
1717
"pydantic>=2.9.2",
1818
"pydantic-settings>=2.6.0",
1919
"rich>=13.9.4",

src/policyengine_api/modal/images.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@
99

1010
import modal
1111

12-
US_VERSION = os.environ.get("POLICYENGINE_US_VERSION", "1.592.4")
13-
UK_VERSION = os.environ.get("POLICYENGINE_UK_VERSION", "2.75.1")
12+
POLICYENGINE_VERSION = os.environ.get("POLICYENGINE_VERSION", "4.4.4")
13+
US_VERSION = os.environ.get("POLICYENGINE_US_VERSION", "1.691.3")
14+
UK_VERSION = os.environ.get("POLICYENGINE_UK_VERSION", "2.88.14")
1415

1516
base_image = (
1617
modal.Image.debian_slim(python_version="3.13")
1718
.apt_install("libhdf5-dev", "git")
1819
.pip_install("uv")
1920
.run_commands(
20-
"uv pip install --system --upgrade "
21-
"policyengine>=3.2.0 "
21+
f"uv pip install --system --upgrade "
22+
f"policyengine=={POLICYENGINE_VERSION} "
2223
"sqlmodel>=0.0.22 "
2324
"psycopg2-binary>=2.9.10 "
2425
"supabase>=2.10.0 "

uv.lock

Lines changed: 18 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)