Skip to main content
You can automatically detect and manage flaky tests in your Bazel projects by integrating with Trunk. This document explains how to configure Bazel to output compatible reports that can be uploaded to Trunk for analysis.

Setup steps

Work through the steps below in order. Once you’ve finished the last one, you’ll be ready to move on to configure uploads in CI.

Generating Reports

Trunk can parse JSON serialized Build Event Protocol (BEP) files to detect flaky tests. You can run tests with Bazel in CI with the --nobuild_event_json_file_path_conversion option to produce a serialized BEP file.

Report File Path

You can specify the path of the generated report through the build_event_json_file option:
bazel test <TARGETS> \
    --nobuild_event_json_file_path_conversion \
    --build_event_json_file=build_events.json
Trunk can parse the build_events.json file to locate your test reports. You will still need to configure your test runners to output compatible reports, and you can refer to the guides for individual test frameworks.
Trunk accepts BEP files in both JSON and binary formats. Each output format has its own path-conversion flag, so pick the pair that matches the file you generate:
  • JSON: --build_event_json_file with --nobuild_event_json_file_path_conversion
  • Binary protobuf: --build_event_binary_file with --nobuild_event_binary_file_path_conversion
Pass whichever file you generated to the analytics CLI’s --bazel-bep-path. The CLI detects the format automatically, so you don’t need to tell it which one you used.

Bazel flags

These Bazel flags affect whether Trunk receives complete test reports. Review them before configuring uploads.

Build Without the Bytes

If your CI environment is set up to build without the bytes, you will need the following flag to pull the reports from the remote execution engine:
--remote_download_regex='.*/test.xml'

Keep Going After Test Failures

Avoid setting --test_keep_going=false (or --notest_keep_going) if you intend to quarantine tests. Leave it at its default (true). When --test_keep_going is false, Bazel stops at the first failing test, so later tests never run and never reach the BEP report. If that first failure is a quarantined test, Trunk sees only an already-quarantined failure and marks the run as passing. The tests that never ran might have failed, and the PR merges anyway.

Try It Locally

The Validate Command

SKU="trunk-analytics-cli-x86_64-unknown-linux.tar.gz"
curl -fL --retry 3 \
  "https://github.com/trunk-io/analytics-cli/releases/latest/download/${SKU}" \
  | tar -xz

chmod +x trunk-analytics-cli
./trunk-analytics-cli validate --bazel-bep-path=build_events.json

Test Upload

Before modifying your CI jobs to automatically upload test results to Trunk, try uploading a single test run manually. You make an upload to Trunk using the following command:
./trunk-analytics-cli upload --bazel-bep-path=build_events.json \
    --org-url-slug <TRUNK_ORG_URL_SLUG> \
    --token <TRUNK_ORG_TOKEN>

Codeowners and Bazel Targets

If your test cases don’t have file paths that can be matched against your CODEOWNERS file, you can pass --use-bazel-target-for-codeowners to fall back to the Bazel target name (e.g. //path/to:target) when associating test cases to owners:
./trunk-analytics-cli upload --bazel-bep-path=build_events.json \
    --org-url-slug <TRUNK_ORG_URL_SLUG> \
    --token <TRUNK_ORG_TOKEN> \
    --use-bazel-target-for-codeowners
When using the Analytics Uploader GitHub Action, set the use-bazel-target-for-codeowners: true input alongside bazel-bep-path.

Next Steps

Configure your CI to upload test runs to Trunk. Find the guides for your CI framework below:
azure

Azure DevOps Pipelines

bitbucket

BitBucket Pipelines

buildkite

BuildKite

circle-ci

CircleCI

drone

Drone CI

github

GitHub Actions

gitlab

GitLab

jenkins

Jenkins

semaphore

Semaphore

teamcity

TeamCity

travis

Travis CI

other

Other CI Providers