Apache 2.0 · Ephemeral environments · GoodRx OSS

Every pull request gets a real environment.

A multi-service env per pull request. Builds itself. Tears itself down on merge.

$git clone https://github.com/GoodRxOSS/lifecycle

demo · 14 min walkthrough
Fourteen-minute walkthrough showing a pull request creating an ephemeral environment.

// the shift

Stop sharing one staging.
Start shipping in parallel.

Without Lifecycle

  • One shared staging. One queue at a time.
  • Local works. Staging doesn't. The drift is the norm.
  • Twelve services, wired by hand, for one PR.
  • Old envs linger. Costs creep. Cleanup is manual.

With Lifecycle

  • Each pull request opens its own isolated environment.
  • Run the exact branch, against the exact dependencies.
  • Multi-service topology builds itself from one config.
  • Merge or close. The env is gone. No janitor needed.

// the path

From pull request to live URL in four steps.

No tickets, no provisioning calls, no cleanup chores.

  1. 01

    Open a pull request

    Push your branch. Lifecycle picks it up the moment the pull request opens.

  2. 02

    Lifecycle builds it

    Every service builds, deploys, and wires together from one config.

  3. 03

    Test on a real URL

    A unique URL lands in the pull request. Share with reviewers, QA, designers.

  4. 04

    Merge, it’s gone

    Close or merge. The env tears itself down. No stale envs, no orphan costs.

// what it does

Connected multi-service.
From one config.

Most preview tools start a container. Lifecycle starts the topology: frontend, APIs, queues, databases. Each on ephemeral DNS, wired like prod.

lifecycle.yaml
version: "1.0.0"

environment:
  defaultServices:
    - name: "api"
    - name: "postgres"

services:
  - name: "api"
    github:
      repository: "acme/api"
      branchName: "main"
      docker:
        defaultTag: "main"
        app:
          dockerfilePath: "Dockerfile"
          ports: [8080]
          env:
            DATABASE_URL: "postgresql://app:pw@{{{postgres_internalHostname}}}:5432/appdb"

  - name: "postgres"
    docker:
      dockerImage: "postgres"
      defaultTag: "15-alpine"
      ports: [5432]
      env:
        POSTGRES_USER: "app"
        POSTGRES_PASSWORD: "pw"
        POSTGRES_DB: "appdb"

result › one pull request builds api + postgres, wired through ephemeral DNS.
  • 01

    Auto-deploy on pull request

    Push, get an environment. No imperative steps.

  • 02

    Cross-repo composition

    Compose services from multiple repos in one env.

  • 03

    Automatic cleanup

    Merge or close › environment is reclaimed.

  • 04

    Webhooks & automation

    Hook env events into your existing CI/CD.

  • 05

    Mission-control comments

    URLs, status, logs delivered into the pull request.

  • 06

    Debug from chat

    Triage build and deploy failures in a chat-driven agent session.

Self-hosted on your Kubernetes · brings its own controller · no SaaS lock-in

// pick a door

Run it, or build it with us.

01 · run it

Get it running on a sample repo.

Clone, follow the guide, watch your first pull request spin up its own env in under ten minutes.

02 · community

Star it, hang out, send pull requests.

Apache 2.0, built in the open.