Skip to content

Cloud Run migration: prune/de-resource old Cloud Run revisions (retire App Engine cleanup) #3737

Description

@anth-volk

Context

PR #3733 added post-deploy cleanup for the App Engine (Flexible) v1 API: after each deploy it stops idle SERVING versions and deletes stopped versions beyond a retention window (cleanup_app_engine_versions.sh + the stop-staging-app-engine-version / cleanup-prod-app-engine-versions jobs in push.yml). It exists because App Engine Flex keeps an always-on VM for every non-stopped version, so idle versions cost money (~$212/mo each).

The v1 API is migrating to Cloud Run. When that cutover completes, this App Engine cleanup becomes obsolete and should be retired — but we still need an equivalent hygiene mechanism for Cloud Run.

Why Cloud Run differs (and what still needs doing)

Cloud Run scales to zero by default: an old revision with no traffic runs no instances and costs ~$0, and min-instances applies only to the revision(s) receiving traffic — it is not a per-revision floor. So the App Engine "idle version = always-on VM" cost problem does not carry over automatically.

However, on migration we will need to:

  • Prune old revisions. Cloud Run has a per-service revision limit and revisions accumulate on every deploy (the policyengine-api Cloud Run service already carries 20+ revisions). Add gcloud run revisions delete for revisions beyond a retention window, analogous to the App Engine version delete.
  • Guard against stray min-instances / reserved resources on superseded revisions or services. If an old revision or service is left with min-instances > 0 (or CPU-always-allocated), it keeps warm instances running and costs money. The cleanup should verify only the live revision carries a min-instance floor and de-resource anything else.
  • Retire the App Engine machinery. Remove cleanup_app_engine_versions.sh, stop_app_engine_version.sh, and the two App Engine cleanup jobs once App Engine is no longer deployed.

Suggested approach

Extend or replace cleanup_app_engine_versions.sh with a Cloud Run equivalent (e.g. cleanup_cloud_run_revisions.sh) wired into the Cloud Run deploy path in push.yml, keeping the same shape: keep the live + N recent revisions, delete older, and assert no superseded revision holds reserved instances. Reuse the stubbed-gcloud unit-test pattern in tests/unit/test_app_engine_cleanup_scripts.py.

Ref: #3733

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions