Repository navigation
Conversation
✅ Deploy Preview for treeherder ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
First run is green on all nine jobs: https://github.com/mozilla/treeherder/actions/runs/34714644932
One thing to sort out before merge or shortly after: Codecov rejected the uploads with |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #9868 +/- ##
========================================
Coverage 84.18% 84.18%
========================================
Files 648 648
Lines 39668 39668
Branches 3541 3469 -72
========================================
Hits 33395 33395
- Misses 5886 6127 +241
+ Partials 387 146 -241 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
ed3b697 to
901d2fe
Compare
5517e84 to
79392b3
Compare
27c350a to
03b59dc
Compare
f9d4a03 to
510d6ed
Compare
First step of migrating CI from CircleCI to GitHub Actions. This adds a
`ci.yml` workflow that mirrors every CircleCI job except `deploy`:
- javascript-tests, javascript-integration-tests, javascript-lint
- builds (docs + linters via tox)
- python-tests-{general,perf,frontend,telemetry} (tox docker envs)
- test-docker-build (BuildKit build of docker/Dockerfile, no push)
Job names match the CircleCI job names so required status checks can be
swapped one-for-one at cutover. A composite `setup-pnpm` action replaces
the CircleCI `setup-pnpm` command. Dependabot now also tracks action
versions.
CircleCI keeps running unchanged; it is removed in a later PR once the
two systems have run side by side and the deploy workflow is in place.
510d6ed to
2f76ca7
Compare
Summary
First step of migrating CI from CircleCI to GitHub Actions. This PR adds a
ci.ymlworkflow that mirrors every CircleCI job exceptdeploy, and leaves.circleci/config.ymluntouched so both systems run side by side.javascript-testsjavascript-testspnpm test:ci+ Codecovjavascript-integration-testsjavascript-integration-testsjavascript-lintjavascript-lintpnpm lint,pnpm markdownlintbuildsbuildstox -e docs,tox -e linterspython-tests-general/-perf/-frontend/-telemetrytox -e docker-*+ Codecovtest-docker-buildtest-docker-builddocker/Dockerfile, no pushJob names deliberately match the CircleCI names so required status checks can be swapped one-for-one at cutover.
Other changes
.github/actions/setup-pnpm: composite action replacing the CircleCIsetup-pnpmcommand (pnpm via corepack, Node fromengines, store cache)..github/dependabot.yml: trackgithub-actionsversions.Manual preparation, by phase
Everything below is done outside the repo, by hand, by someone with the right access. Nothing in this section is automated by any PR. Names only are shown here; values are never displayed by CircleCI and must be looked up or regenerated at the source given.
Check what is already set at any time (names only, never values):
As of 2026-09-15 both lists are empty.
Phase 1: this PR
The workflow needs no repo configuration to pass: every job is green with zero secrets or variables set. The single manual step is for coverage.
CODECOV_TOKENWhy it is needed: Codecov has protected-branch mode on for this repo, so tokenless uploads are rejected with
Token required because branch is protected. Jobs still pass becausefail_ci_if_error: false, and CircleCI keeps uploading in the meantime, so this does not block landing. Set it at or before merge, then re-run the workflow on this PR and confirm the Codecov step logs successful uploads for both thejavascriptandpythonflags.Do not change required status checks on
masterin this phase. They stay pointed at theci/circleci: *contexts; the Actions jobs are informational until cutover.Do not touch
.circleci/. Both systems run on every PR until they have agreed for at least a week or ~20 merged PRs.Validation only possible after merge:
ci.ymluntil it is onmaster. On the first fork PR after merge, confirm the workflow runs and all jobs pass with no secrets (the Codecov step falls back to tokenless and is rejected, which is expected and harmless on forks).cancel-in-progressverified 2026-09-22: a force-push to Add GitHub Actions deploy workflow alongside CircleCI #9884 (same workflow file) while run 35754368085 was in flight left that runcancelledand started a fresh one.Phase 2: deploy workflow (follow-up PR)
The deploy workflow builds the production image and pushes it to Docker Hub and GCP Artifact Registry, exactly as the CircleCI
deployjob does today. It reads the following. All must exist before the workflow can even dry-run.Secrets (GitHub repo admin):
DOCKER_USERmozilla/treeherderimage; visible on hub.docker.com)DOCKER_PASSVariables, plain non-secret values (GitHub repo admin, values from a GCP admin):
DOCKERHUB_REPOmozilla/treeherderGCP_GAR_REGISTRYus-docker.pkg.dev:gcloud artifacts repositories list --project=<gar-project>, take<location>-docker.pkg.devGCP_PROJECT_ID_OF_GCP_GARtreeherder-prodArtifact Registry repositoryGCP_WIP_PROJECT_NUMBERgcloud projects describe <project-id> --format='value(projectNumber)'GCP_WIP_IDgcloud iam workload-identity-pools list --location=global --project=<pool-project>GCP_WIP_PROVIDER_IDgithub)GCP_GAR_PUSHER_SERVICE_ACCOUNT_EMAILgcloud iam service-accounts listThe workflow assembles the Artifact Registry image path as
${GCP_GAR_REGISTRY}/${GCP_PROJECT_ID_OF_GCP_GAR}/treeherder-prod/treeherder, matching CircleCI, and the OIDC provider path asprojects/${GCP_WIP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WIP_ID}/providers/${GCP_WIP_PROVIDER_ID}.GCP: add a GitHub OIDC provider to the existing Workload Identity Pool (needs
roles/iam.workloadIdentityPoolAdminon the pool project androles/iam.serviceAccountAdminon the pusher service account). The pool currently trusts only CircleCI's issuer; GitHub signs with a different one, so a second provider is required. The attribute condition pins it to this repository.The service account keeps its existing Artifact Registry writer role. Leave the CircleCI provider in place until cutover.
Optional, recommended: create a GitHub environment named
deployand put the Docker Hub secrets there instead of at repo level, so only the deploy workflow can read them. The deploy workflow has a commented-outenvironment: deployline for this.Record the current required status checks on
master(repo admin, Settings > Branches or Settings > Rules). Nothing changes yet; cutover needs the list. The branch-protection API returns 404 for non-admin tokens, so this has to be read from the UI.Verification once all of the above exists: run the deploy workflow via
workflow_dispatchwith itspushinput left false. That exercisesversion.json, the image build, the Docker Hub login, and the GCP token exchange without publishing anything.Phase 3: cutover (third PR)
Repo changes in that PR: delete
.circleci/config.yml, swap the README badge, updateui/contribute.jsonand a couple of doc comments, and rename thebuildsjob todocs-and-linters.By hand, in the same sitting as merging that PR (otherwise PRs block on checks that never report):
ci/circleci: <job>to the bare job names:javascript-tests,javascript-integration-tests,javascript-lint,docs-and-linters(formerlybuilds),python-tests-general,python-tests-perf,python-tests-frontend,python-tests-telemetry,test-docker-build.mozillaorg only if Treeherder was its last user (check with Mozilla's GitHub admins first).DOCKER_USER,DOCKER_PASS,DOCKERHUB_REPO,GCP_*,CODECOV_TOKEN).Rollback before Phase 3 is "do nothing": CircleCI remains the system of record. After Phase 3, rollback is reverting the cutover PR and re-adding the required checks.
Notes for reviewers
ubuntu-latestis 4 vCPU for public repos, matching the CircleCIlargeclass the Jest/Playwright worker counts were tuned for.CODECOV_TOKENis the one exception and is covered above; an earlier version of this description said tokenless uploads would work, which turned out to be wrong for this repo.deploy(Docker Hub + GCP Artifact Registry) comes in a follow-up PR once a GitHub OIDC provider is added to the GCP Workload Identity Pool..circleci/, README badge, required checks) is a third PR after both systems have agreed for a while.buildsis a misnomer: it only runstox -e docsandtox -e linters, and the rspack production build already happens insidetest-docker-buildvia the Dockerfile. The name is kept here so the required status check swaps one-for-one. It will be renamed todocs-and-lintersat cutover, when the required check is updated anyway.Failed to save: ... another job may be creating this cache). Harmless; one wins and later runs hit it.