Perfetto CI

此 CI 在 Android 的 TreeHugger 之上使用(而不是替代它)。它提供早期测试信号以及对 TreeHugger 不支持的其他操作系统和较旧 Android 设备的覆盖。

有关项目测试策略的更多详细信息,请参阅 Testing 页面。

CI 基于 GitHub actions。入口点是 .github/workflows/analyze.yml

analyze 步骤根据更改的文件触发其他工作流(UI、linux 测试等)。

GCE 中的自托管 runners

我们使用在 GitHub 项目中注册的自托管 runners。

托管它们的 Google Cloud 项目称为 perfetto-ci

源代码位于 infra/ci

Worker GCE VM

我们有可变数量的 GCE vms(参见 config.py 中的 GCE_VM_TYPE),由自动缩放器驱动,最多可达 MAX_VMS_PER_REGION

每个 GCE vm 运行固定数量(NUM_WORKERS_PER_VM)的 sandbox 容器。

每个 sandbox 容器运行一个 GitHub Action Runner 实例。

构建和测试在 Action Runner 中进行。

除此之外,每个 GCE vm 运行一个名为 worker 的特权 Docker 容器。worker 处理 VM 的基本设置,除了通过 supervisord 确保始终有 N 个 sandbox 运行之外什么都不做。

整个系统镜像只读。VM 本身是无状态的。除了 Google Cloud Storage(仅用于 UI 工件)和 GitHub 的缓存之外,没有状态持久化。SSD 仅用作交换的临时磁盘 - 以使用大的 tmpfs - 并在每次重启时清除。

VM 使用 Google Cloud Autoscaler 动态生成,并使用由 ci.perfetto.dev AppEngine 推送的 Stackdriver 自定义 metrics 作为成本函数。此类 metrics 是排队的 + 运行的 pull-requests 的数量。

GCE vm 和特权 docker 容器使用服务账户 gce-ci-worker@perfetto-ci.iam.gserviceaccount.com 运行。

sandbox 使用受限的服务账户 gce-ci-sandbox@perfetto-ci.iam.gserviceaccount.com 运行,该账户仅被允许在 gs://perfetto-ci-artifacts 中创建 - 但不能删除或覆盖 - 工件。

序列图

这是在 worker 实例上从引导到测试运行依次发生的事情。

make -C /infra/ci worker-start ┗━ gcloud start ... [GCE] # From /infra/ci/worker/gce-startup-script.sh docker run worker ... [worker] # From /infra/ci/worker/Dockerfile ┗━ /infra/ci/worker/worker_entrypoint.sh ┗━ supervisord ┗━ [N] /infra/ci/worker/sandbox_runner.py ┗━ docker run sandbox-N ... [sandbox-X] # From /infra/ci/sandbox/Dockerfile ┗━ /infra/ci/sandbox/sandbox_entrypoint.sh ┗━ github-action-runner/run.sh ┗━ .github/workflows/analyze.yml ┣━ .github/workflows/linux-tests.yml ┣━ .github/workflows/ui-tests.yml ... ┗━ .github/workflows/android-tests.yml

操作手册

Frontend (JS/HTML/CSS/py) 更改

本地测试:make -C infra/ci/frontend test

使用 make -C infra/ci/frontend deploy 部署

Worker/Sandbox 更改

  1. 使用以下命令构建并推送新的 docker 容器:

make -C infra/ci build push

  1. 重新启动 GCE 实例,手动或通过:

make -C infra/ci restart-workers

安全考虑