Back to Perfetto

ui.perfetto.dev Cloud scripts

infra/ui.perfetto.dev/README.md

55.33.8 KB
Original Source

ui.perfetto.dev Cloud scripts

See go/perfetto-ui-autopush for docs on how this works end-to-end.

Channel deployment model

Three channels are served from gs://ui.perfetto.dev/:

ChannelSource branchTrigger
autopushmainpush to main
canarycanarypush to canary
stablestablepush to stable

Each Cloud Build trigger invokes ui_builder_entrypoint.sh with the branch name as $1. The entrypoint maps autopush/canary/stable to the channel of the same name and runs ui/release/build_channel.py --channel=<name> --upload, which builds the UI from the branch HEAD and uploads /v<version>/** to GCS.

The shared root /index.html (and /bigtrace.html) carries a data-perfetto_version='{"stable":...,"canary":...,"autopush":...}' map that the UI bootstrap reads to decide which /v<version>/ to load. To keep parallel deploys race-free, each channel only modifies its own entry in that map, using GCS x-goog-if-generation-match as a CAS primitive.

The stable channel additionally owns the HTML body itself (it is the only channel that overwrites the body) and the shared /service_worker.* files. Canary and autopush never write the body or service_worker, so canary instability cannot break stable users.

Release branches

Pushes to long-lived release branches (anything other than main/canary/stable) are wired to the same cloudbuild_release.yaml trigger, which passes $BRANCH_NAME. The entrypoint normalises any such branch to --channel=release. The release mode uploads /v<version>/ only and does NOT modify the root index.html map or /service_worker.*, so the build is reachable by direct URL but no channel points to it until the branch is eventually merged into stable.

/appengine : GAE <> GCS proxy

The Google AppEngine instance that responds to ui.perfetto.dev. It simply passes through the requests to the bucket gs://ui.perfetto.dev . This should NOT be re-deployed when uploading a new version of the ui, as the actual UI artifacts live in GCS.

We are using AppEngine for historical reasons, at some point this should be migrated to a Type 7 Google Cloud Load Balancer, which supports direct backing by a GCS bucket. The only blocker for that is figuring out a seamless migration strategy for the SSL certificate.

/builder : Docker container for Google Cloud Build

Contains the Dockerfile to generate the container image which is used by Google Cloud Build when auto-triggering new ui builds. Cloud Build invokes the equivalent of:

bash
docker run europe-docker.pkg.dev/perfetto-ui/builder/perfetto-ui-builder \
    /ui_builder_entrypoint.sh <channel>

where <channel> is one of autopush, canary, stable (see the channel table above).

NOTE: the ui_builder_entrypoint.sh script is bundled in the docker container. The container needs to be re-built and re-pushed if the script changes.

To update the container:

Prerequisite: Install the Google Cloud SDK from https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz

bash
# Obtain a temporary token to impersonate the service account as per
# https://cloud.google.com/artifact-registry/docs/docker/authentication
# You need to be a member of perfetto-cloud-infra.prod to do this.
gcloud auth print-access-token \
    --impersonate-service-account [email protected] | docker login \
    -u oauth2accesstoken \
    --password-stdin https://europe-docker.pkg.dev

docker build -t europe-docker.pkg.dev/perfetto-ui/builder/perfetto-ui-builder infra/ui.perfetto.dev/builder
docker push europe-docker.pkg.dev/perfetto-ui/builder/perfetto-ui-builder