# Other CI Providers

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](https://docs.trunk.io/flaky-tests/uploader).

{% hint style="warning" %}
**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**.
{% endhint %}

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

### Checklist

By the end of this guide, you should achieve the following.

* [ ] Get your Trunk organization slug and token
* [ ] Set your slug and token as a variable in CI
* [ ] Configure your CI to upload to Trunk
* [ ] Validate your uploads in Trunk

After completing these checklist items, you'll be integrated with Trunk.

### 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 > Manage > Organization Name > Slug**. You'll save this as a variable in CI in a later step.

#### Trunk Token

You can find your token under **Settings > Organization > Manage > Organization API Token > View Organization API Token > View**. 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_SLUG` and `TRUNK_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](https://docs.trunk.io/flaky-tests/detection), for example,`main`, `master`, or `develop`.

{% hint style="danger" %}
It is important to upload test results from CI runs on [**stable branches**](https://docs.trunk.io/flaky-tests/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](https://docs.trunk.io/flaky-tests/detection)
{% endhint %}

#### 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](https://docs.trunk.io/flaky-tests/get-started/frameworks "mention") docs.

You can install the Trunk Analytics CLI locally like this:

{% tabs %}
{% tab title="Linux (x64)" %}

```bash
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
```

{% endtab %}

{% tab title="Linux (arm64)" %}

```bash
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
```

{% endtab %}

{% tab title="macOS (arm64)" %}

```bash
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
```

{% endtab %}

{% tab title="macOS (x64)" %}

```bash
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
```

{% endtab %}
{% endtabs %}

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

```bash
./trunk-analytics-cli validate --junit-paths <PATH_TO_REPORTS>
```

See the [uploader](https://docs.trunk.io/flaky-tests/uploader "mention") for all available command line arguments and usage.

#### Environment Variables

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

{% hint style="info" %}
**Config Requirement:** `CUSTOM` must be set to `true` for environment varaibles to take effect and override the auto-detection of CI.

All other variables are optional but recommended.
{% endhint %}

| 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
* ❌ Link to a dashboard or workflow overview (less helpful for debugging)

{% hint style="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](https://docs.trunk.io/flaky-tests/get-started/github-actions#getting-direct-links-to-job-logs) for instructions.
{% endhint %}

#### 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.

{% hint style="success" %}
**Have questions?**

Join us and 1500+ fellow engineers [on Slack](https://slack.trunk.io/) to get help with Trunk.
{% endhint %}
