{"id":37149154,"url":"https://github.com/framequery/liftoff","last_synced_at":"2026-01-14T17:37:11.569Z","repository":{"id":293129313,"uuid":"982805303","full_name":"FrameQuery/liftoff","owner":"FrameQuery","description":"Simple split traffic rolling deployments for GCP cloud runs","archived":false,"fork":false,"pushed_at":"2025-06-04T23:27:56.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-05T20:49:36.851Z","etag":null,"topics":["canary-deployment","gcp","gcp-cloud-run","go-cli"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/framequery/liftoff","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FrameQuery.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-13T12:37:59.000Z","updated_at":"2025-06-04T23:27:47.000Z","dependencies_parsed_at":"2025-05-13T21:05:18.190Z","dependency_job_id":null,"html_url":"https://github.com/FrameQuery/liftoff","commit_stats":null,"previous_names":["framequery/liftoff"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/FrameQuery/liftoff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameQuery%2Fliftoff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameQuery%2Fliftoff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameQuery%2Fliftoff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameQuery%2Fliftoff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FrameQuery","download_url":"https://codeload.github.com/FrameQuery/liftoff/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameQuery%2Fliftoff/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28428878,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T16:38:47.836Z","status":"ssl_error","status_checked_at":"2026-01-14T16:34:59.695Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canary-deployment","gcp","gcp-cloud-run","go-cli"],"created_at":"2026-01-14T17:37:10.809Z","updated_at":"2026-01-14T17:37:11.559Z","avatar_url":"https://github.com/FrameQuery.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg  width=\"200\" src=\"https://github.com/user-attachments/assets/2992c99d-0201-42c5-ab16-5ff73073b929\" alt=\"Centered Image\"/\u003e\n  \u003ch1 align=\"center\"\u003eLiftoff\u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nWelcome to \u003cb\u003eLiftoff\u003c/b\u003e 🚀 Your go‑to CLI for multi‑region Cloud Run canary deployments! This README will guide you through installation, configuration, and usage with plenty of examples and emojis to keep things fun 🎉.\n  \u003cbr/\u003e\n  \u003c!-- \u003ca href=\"https://flynnfc.dev/work/bagginsdb\"\u003e\n    Learn more on how it's made here\n  \u003c/a\u003e --\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/framequery/liftoff/actions/workflows/release.yaml/badge.svg\" alt=\"Build badge\"\u003e\n  \u003ca href=\"https://github.com/framequery/liftoff/blob/main/LICENSE.md\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue\" alt=\"MIT\" title=\"MIT License\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n  \n\n### 📥 Pre-requisites\n\nThis CLI heavily relies on the GCLOUD cli tool. You must have it installed.\nIf you don't, follow [this guide](https://cloud.google.com/sdk/docs/install)\n\n### 🛠️ Installation\n\nMake sure you have Go 1.20+ installed and your `GOPATH` configured. Then:\n\n```bash\n# Install the CLI\ngo install github.com/framequery/liftoff/cmd/liftoff@latest\n\n# Verify installation\nliftoff --help\n```\n\nYou can also build from source:\n\n```bash\ngit clone https://github.com/framequery/liftoff.git\ncd liftoff\ngo build -o liftoff ./cmd/liftoff\n```\n\n---\n\n### ⚙️ Configuration\n\nBy default, **liftoff** saves your settings to `$TMP/liftoff_config.json`. You can override options via flags or environment variables.\n\n| Option         | Env Var              | Description                                              | Default                  |\n| -------------- | -------------------- | -------------------------------------------------------- | ------------------------ |\n| `--project`    | `LIFTOFF_PROJECT`    | GCP project ID                                           | **none** (required)      |\n| `--service`    | `LIFTOFF_SERVICE`    | Cloud Run service name                                   | **none** (required)      |\n| `--image`      | `LIFTOFF_IMAGE`      | Container image URL for the canary revision              | **none** (required)      |\n| `--regions`    | `LIFTOFF_REGIONS`    | Comma‑separated GCP regions (e.g. `europe-west2,europe-west4`) | `europe-west2,europe-west4` |\n| `--percentages`| `LIFTOFF_PCTS`       | Traffic percentages (e.g. `10,50,100`)                   | `10,50,100`              |\n| `--intervals`  | `LIFTOFF_INTVLS`     | Seconds between rollout steps (e.g. `300,300`)           | `300,300`                |\n| `--ingress`    | `LIFTOFF_INGRESS`    | Kinds of allowed ingress                                 | `internal-only`          |\n| `--env-vars`   | `LIFTOFF_ENV_VARS`   | Comma-separated KEY=VALUE pairs                          | **none**                 |\n\n---\n\nOnce you have **liftoff** installed, here are some example workflows:\n\n### 🎯 Default canary rollout\n\n```bash\nliftoff canary \\\n  --project=my-gcp-project \\\n  --service=my-service \\\n  --image=gcr.io/my-gcp-project/my-app:canary\n```\n- Deploys no-traffic revisions in `europe-west2` \u0026 `europe-west4`.\n- Routes 10% → wait 5m → 50% → wait 5m → 100%.\n\n### 🌐 Custom regions \u0026 speed\n\n```bash\nliftoff canary \\\n  --project=my-gcp-project \\\n  --service=api-service \\\n  --image=gcr.io/my-gcp-project/api:v2 \\\n  --regions=us-central1,asia-northeast1 \\\n  --percentages=5,25,50,100 \\\n  --intervals=60,120,180\n```\n- Targets `us-central1` and `asia-northeast1`.\n- Gradually shifts traffic 5% → wait 1m → 25% → wait 2m → 50% → wait 3m → 100%.\n### 🌳 Environment variables\n\n```bash\nliftoff canary \\\n  --project=my-gcp-project \\\n  --service=api-service \\\n  --image=gcr.io/my-gcp-project/api:v2 \\\n  --regions=us-central1,asia-northeast1 \\\n  --percentages=5,25,50,100 \\\n  --intervals=60,120,180 \\\n  --env-vars=GOOGLE_PROJECT_ID=canary,DEBUG=true\"\n```\n### ⚡ Instant full rollout\n\n```bash\nliftoff canary \\\n  --project=my-gcp-project \\\n  --service=static-site \\\n  --image=gcr.io/my-gcp-project/site:latest \\\n  --percentages=100 \\\n  --intervals=0\n```\n- Skips staging phases and sends 100% traffic immediately.\n### ⚙️ Config \u0026 Defaults\n```bash\n# Save defaults for 'internal-api'\nliftoff config set internal-api \\\n  --project=my-gcp-project \\\n  --image=gcr.io/my-gcp-project/internal-api:canary \\\n  --regions=europe-west2,europe-west4 \\\n  --percentages=10,50,100 \\\n  --intervals=300,300\n\n# View all saved configs\nliftoff config view\n```\n- You can set/view default config settings per service video with the config command\n---\n\n### 🔍 Flags \u0026 Commands Reference\n\n```\nliftoff --help\n```\n\n```\nliftoff canary --help\n```\n\nKey flags for `canary`:\n- `--project, -p`   : GCP project ID (required)\n- `--service, -s`   : Cloud Run service name (required)\n- `--image, -i`     : Container image URL (required)\n- `--regions`       : Regions list\n- `--percentages`   : Traffic split percentages\n- `--intervals`     : Seconds between shifts\n\n\n### ❤️ Contributing\n\nWe ❤️ pull requests!\n1. Fork ✅\n2. Create a feature branch 🌿\n3. Write tests 🧪\n4. Send PR 📬\n\nPlease follow our [Contributing Guidelines](CONTRIBUTING.md).\n\n---\n\n### 📜 License\n\n[MIT](LICENSE)\n\nEnjoy safe liftoffs! 🚀\nMade by [Framequery](https://www.framequery.com/)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframequery%2Fliftoff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fframequery%2Fliftoff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframequery%2Fliftoff/lists"}