Release Notifications
Ona publishes Pub/Sub messages when new stable GCP runner releases are available. Subscribe to receive push notifications instead of polling for updates. This is useful for triggering CI pipelines, syncing custom images, or alerting your infrastructure team when a Terraform upgrade is needed.Topic
| Property | Value |
|---|---|
| Project | gitpod-next-production |
| Topic | projects/gitpod-next-production/topics/gcp-runner-releases |
| Message retention | 7 days |
| Access | Any authenticated GCP user can subscribe |
Subscribing with gcloud
Subscribing with Terraform
push_config.push_endpoint to your endpoint URL.
Message format
Each message includes attributes for filtering:event_type:release.stableversion: release version string (e.g.,20250115.0)source:ci_stable_promotion(release promoted to stable) orgcs_notification(stable manifest updated in GCS)
Example payload
Example payload
| Field | Description |
|---|---|
terraform_changes | Terraform module commits since the previous release (empty if none). When non-empty, a terraform apply may be needed. |
iam_changes_detected | true if IAM-related files changed. Signals that IAM configuration or pre-created service accounts may need updating. |
Updating Infrastructure
Certain updates, particularly those involving significant infrastructural changes, cannot be applied automatically. Follow these steps to apply updates:- Navigate to the directory containing your runner Terraform configuration.
-
Update the
versionconstraint in yourmain.tfmodule block to allow the new version. Check the Terraform registry for available versions. -
Re-initialize Terraform to fetch the new module version:
-
Review the planned changes before applying:
Carefully review the output for:
- New resources being created
- Resources being modified or replaced
- Any unexpected deletions
-
Apply the updates:
- Verify the runner status in the Ona dashboard under Settings → Runners to confirm the update was successful.
Delete runner
Deleting a GCP runner is a two-step process: disconnect the runner from Ona, then destroy the GCP infrastructure with Terraform.1. Disconnect the runner in Ona
- Go to Settings → Runners and select Delete from the runner’s menu.
- The runner enters Pending deletion and stops all environments attached to it.
- Once environments are fully deleted, the runner record is removed from Ona (this can take a few minutes).
terraform destroy.
2. Destroy the GCP infrastructure
From the directory containing your runner Terraform configuration:terraform destroy removes everything the module created, including:
- Compute Engine instance templates, managed instance groups, and autoscalers for the runner and proxy VMs
- Load balancer components (forwarding rules, backend services, health checks, URL maps)
- Memorystore for Redis cluster and its Private Service Connect policy
- Cloud Storage buckets (
<runner-id>-runner-assetsand, if agents are enabled,<runner-id>-agent-storage) - Artifact Registry repository used by the runner
- Secret Manager secrets (runner token, Redis credentials, metrics config)
- Pub/Sub topics and subscriptions used for compute lifecycle events
- Firewall rules and module-created service accounts
- KMS keyring and key, if
create_cmek = true
3. Resources Terraform does not delete
A cleanterraform destroy removes everything the module owns, but several categories of resources are deliberately not managed by the module and must be cleaned up manually if you no longer need them:
- VPC, subnets, and Cloud NAT. You created these before deployment (see Setup prerequisites). They are not part of the module.
- Proxy-only subnet (internal load balancer deployments). The
REGIONAL_MANAGED_PROXYsubnet you created for the internal LB. - DNS records for
yourdomain.comand*.yourdomain.compointing at the load balancer IP (see Post-deployment). - SSL/TLS certificate. The Certificate Manager certificate (external LB) or the Secret Manager secret (internal LB) you created outside the module.
- GCS bucket holding Terraform state. If you used a remote backend, the state bucket persists after
terraform destroy. - Pre-created service accounts. If you supplied any via
pre_created_service_accounts, those are owned by your IAM team and are not destroyed. - Pre-existing KMS key. If you used
create_cmek = falseand supplied akms_key_name, the key stays. Only keys created by the module (create_cmek = true) are destroyed. - Release Pub/Sub subscriptions. Any subscription you created to Ona’s release topic (see Release Notifications) lives in your project and is independent of the module.
4. Check for leftovers
Afterterraform destroy completes, verify no runner resources remain before closing out the project. This is the most common source of unexpected costs post-deletion.
Filter by the module’s managed-by=terraform and gitpod-runner-id=<your-runner-id> labels, which are applied to all runner-owned resources:
Environment VMs and their persistent disks are tagged with
gitpod-type=environment rather than the runner labels above. If you see leftover disks, instances, or snapshots with gitpod-type=environment or names starting with env-, these are per-environment resources. The runner normally cleans them up when environments are deleted. If the runner was force-deleted before draining, you may need to remove them manually.gcloud. Pay particular attention to:
- Persistent disks from environments that were not cleanly terminated. These continue to incur storage costs.
- Reserved static IP addresses that were not released.
- Forwarding rules and backend services from the load balancer.
- Storage buckets. The runner assets bucket has
uniform_bucket_level_accessandpublic_access_preventionenforced, but it may still contain objects you need to delete first withgcloud storage rm --recursive gs://BUCKET_NAME.
5. Final verification
Confirm deletion in two places:- Ona dashboard. Settings → Runners no longer lists the runner.
- GCP Billing console. Check that billable resources are no longer being reported against the runner’s labels after 24 hours.