> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trunk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Other CI Providers

> Configure Flaky Tests using any CI Provider

Trunk Flaky Tests integrates with your CI provider by adding an upload step in each of your testing CI jobs via the [Trunk Analytics CLI](../../reference/cli-reference).

<Info>
  **Not using GitHub for source control?**

  Flaky Test support for source control providers like GitLab and BitBucket is still experimental. If you're using a source control provider other than GitHub, [**contact us**](mailto:support@trunk.io) **to get started**.&#x20;
</Info>

Before you start on these steps, see the [Test Frameworks](../frameworks/) docs for instructions on producing JUnit XML output for your test runner, supported by virtually all test frameworks, which is what Trunk ingests.

## Setup steps

Work through the steps below in order. Once you've finished the last one, you're set up — head to [app.trunk.io](https://app.trunk.io) to see your results.

<Steps>
  <Step title={<a href="#trunk-organization-slug-and-token">Get your Trunk organization slug and token</a>} />

  <Step title={<a href="#add-the-trunk-token-as-a-secret">Set your slug and token as a variable in CI</a>} />

  <Step title={<a href="#upload-to-trunk">Configure your CI to upload to Trunk</a>} />

  <Step title={<a href="#validate-your-uploads">Validate your uploads in Trunk</a>} />
</Steps>

## Trunk Organization Slug and Token

Before setting up uploads to Trunk, you must sign in to [app.trunk.io](https://app.trunk.io/login?intent=flaky%20tests) and obtain your Trunk organization slug and token.

### Trunk Slug

You can find your organization slug under **Settings** → **Organization** → **General**. You'll save this as a variable in CI in a later step.

### Trunk Token

You can find your token under **Settings** → **Organization** → **General**, in the **API** section. Since this is a secret, do not leak it publicly. Ensure you get your *organization token*, not your project/repo token.

## Add the Trunk Token as a Secret

Store the Trunk slug and API token obtained in the previous step in your CI provider as a secret, environment variable, or an equivalent concept and name them `TRUNK_ORG_URL_SLUG` and `TRUNK_API_TOKEN` respectively.

## Upload to Trunk

Add an `Upload Test Results` step after running tests in each of your CI jobs that run tests. This should be minimally all jobs that run on pull requests, as well as from jobs that run on your main or [stable branches](../../detection/), for example,`main`, `master`, or `develop`.

<Tip>
  It is important to upload test results from CI runs on [**stable branches**](../../detection/), such as `main`, `master`, or `develop`. This will give you a stronger signal about the health of your code and tests.

  Trunk can also detect test flakes on PR and merge branches. To best detect flaky tests, it is recommended to upload test results from stable, PR, and merge branch CI runs.

  [Learn more about detection](../../detection/)
</Tip>

### Example Upload Script

The following is an example of a script to upload test results after your tests run. Note: you must either run `trunk` from the repo root when uploading test results or pass a `--repo-root` argument.

To find out how to produce the report files the uploader needs, see the instructions for your test framework in the [frameworks](../frameworks/) docs.

You can install the Trunk Analytics CLI locally like this:

<CodeGroup>
  ```bash Linux (x64) theme={null}
  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
  ```

  ```bash Linux (arm64) theme={null}
  SKU="trunk-analytics-cli-aarch64-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
  ```

  ```bash macOS (arm64) theme={null}
  SKU="trunk-analytics-cli-aarch64-apple-darwin.tar.gz"
  curl -fL --retry 3 \
    "https://github.com/trunk-io/analytics-cli/releases/latest/download/${SKU}" \
    | tar -xz

  chmod +x trunk-analytics-cli
  ```

  ```bash macOS (x64) theme={null}
  SKU="trunk-analytics-cli-x86_64-apple-darwin.tar.gz"
  curl -fL --retry 3 \
    "https://github.com/trunk-io/analytics-cli/releases/latest/download/${SKU}" \
    | tar -xz

  chmod +x trunk-analytics-cli
  ```
</CodeGroup>

Then, you can validate the results using the `trunk-analytics-cli validate` command like this:

```bash theme={null}
./trunk-analytics-cli validate --junit-paths <PATH_TO_REPORTS>
```

See the [uploader.md](../../reference/cli-reference.md) for all available command line arguments and usage.

### Environment Variables

Set these environment variables before running `trunk-analytics-cli upload` on unsupported CI systems:

<Info>
  **Config Requirement:** `CUSTOM` must be set to `true` for environment variables to take effect and override the auto-detection of CI.

  All other variables are optional but recommended.
</Info>

| Variable         | Description                                                                                                      | Example                               |
| ---------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
| `CUSTOM`         | Set to `true` to indicate this CI system is not one of our supported providers                                   | `CUSTOM=true`                         |
| `JOB_URL`        | Direct link to the CI job/build page. This is the link users will click when viewing test failure logs in Trunk. | `https://ci.example.com/builds/12345` |
| `JOB_NAME`       | Name of the CI job or test suite                                                                                 | `unit-tests`                          |
| `AUTHOR_EMAIL`   | Email address of the commit author                                                                               | `dev@example.com`                     |
| `AUTHOR_NAME`    | Full name of the commit author                                                                                   | `Jane Developer`                      |
| `COMMIT_BRANCH`  | Git branch being tested                                                                                          | `main`                                |
| `COMMIT_MESSAGE` | Commit message for the tested commit                                                                             | `Fix authentication bug`              |
| `PR_NUMBER`      | Pull request number (if applicable)                                                                              | `123`                                 |
| `PR_TITLE`       | Pull request title (if applicable)                                                                               | `Add new feature`                     |

### About JOB\_URL

The `JOB_URL` variable controls where the "Logs" link in Trunk Flaky Tests points to. When users click "Logs" on a test failure, they'll be taken to this URL to view the complete CI job output.

**Best practice:** Provide the most specific link possible:

* Direct link to the specific job/build where the test ran
* Link that shows the full logs and test output
* **Avoid** dashboard or workflow overview links (less helpful for debugging)

<Info>
  **For GitHub Actions users:** While GitHub Actions is auto-detected, you can override the default workflow URL with a direct job URL. See [GitHub Actions - Getting Direct Links to Job Logs](./github-actions#getting-direct-links-to-job-logs) for instructions.
</Info>

### Stale files

Ensure you report every test run in CI and **clean up stale files** produced by your test framework. If you're reusing test runners and using a glob like `**/junit.xml` to upload tests, stale files not cleaned up will be included in the current test run, throwing off detection of flakiness. You should clean up all your results files after every upload step.

## Validate Your Uploads

Once your pipeline has run on a stable branch, head to [app.trunk.io](https://app.trunk.io) and confirm Trunk received your results.

* The **Uploads** tab lists every report Trunk has ingested, with status and any warnings (missing file paths, malformed XML, and so on).
* The **Tests** tab shows individual test cases once an upload has been processed.

If a recent run isn't showing up, check your CI logs for upload errors and confirm your `TRUNK_API_TOKEN` and `TRUNK_ORG_URL_SLUG` secrets are set on the project running the pipeline.
