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

# Bitbucket Pipelines

> Set up Bitbucket Pipelines workflow for coverage reporting.

## Overview

Upload test coverage reports to CodeAnt AI for comprehensive analysis, visualization, and tracking of your code coverage metrics.

**Reference Repository**: [codeant-coverage](https://bitbucket.org/codeantworkspace/codeant-coverage/src/main/)

## Features

* 📊 Upload coverage reports in XML format (Cobertura XML, JaCoCo XML)
* 🔍 Automatic coverage analysis and insights
* 📈 Track coverage trends over time
* 🎯 Integration with pull requests
* 🚀 Easy setup with minimal configuration
* 🏢 Support for self-hosted/enterprise instances

## Setup

### 1. Get Your Access Token

Bitbucket supports two token scopes — use whichever fits your setup:

| Token Type                  | Best For                 | Where to Create                                    |
| --------------------------- | ------------------------ | -------------------------------------------------- |
| **Repository Access Token** | Single repository        | Repository **Settings → Security → Access tokens** |
| **Workspace Access Token**  | All repos in a workspace | Workspace **Settings → Security → Access tokens**  |

**Repository Access Token** (repo-level):

1. Go to your repository **Settings**
2. Navigate to **Security > Access tokens**
3. Click **Create repository access token**
4. Select permissions:
   * **Repositories**: Read, Write
   * **Pull requests**: Read, Write
5. Copy the generated token

**Workspace Access Token** (workspace-level):

1. Go to your workspace **Settings**
2. Navigate to **Security > Access tokens**
3. Click **Create workspace access token**
4. Select the same permissions as above
5. Copy the generated token

<img src="https://mintcdn.com/codeantai/yGtXdRPWJV6-JMZc/images/setup/bitbucket/access_token_scopes.png?fit=max&auto=format&n=yGtXdRPWJV6-JMZc&q=85&s=8b618e65800400e47313d936aa1d784e" alt="Bitbucket access token scopes" width="2572" height="988" data-path="images/setup/bitbucket/access_token_scopes.png" />

> **Note:** Do **not** use an **Atlassian API Token** (generated at [id.atlassian.com](https://id.atlassian.com)) — that token authenticates with Jira Cloud, Confluence Cloud, and Jira Align only, and will **not** work with Bitbucket. See [Atlassian docs](https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/). Use a **Bitbucket Repository Access Token** or **Workspace Access Token** instead.

### 2. Configure Repository Variables

Before using the pipe, configure these repository variables in **Repository Settings → Pipelines → Repository variables**:

* `BITBUCKET_ACCESS_TOKEN` - Your Bitbucket Repository Access Token with write access

## Basic Usage

### Example 1: Basic Coverage Upload

```yaml theme={null}
image: python:3.11

pipelines:
  default:
    - step:
        name: Run tests and generate coverage
        script:
          - pip install pytest pytest-cov
          - pytest --cov=. --cov-report=xml:coverage.xml

    - step:
        name: Upload coverage to CodeAnt AI
        script:
          - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
            variables:
              ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
              COVERAGE_FILE: coverage.xml
```

### Example 2: Pull Request Coverage Analysis

```yaml theme={null}
image: python:3.11

pipelines:
  pull-requests:
    '**':
      - step:
          name: Test and Coverage
          caches:
            - pip
          script:
            - pip install pytest pytest-cov
            - pytest --cov=. --cov-report=xml:coverage.xml

      - step:
          name: Upload to CodeAnt AI
          script:
            - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
              variables:
                ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
                COVERAGE_FILE: coverage.xml
```

### Example 3: Advanced Configuration with Debug Mode

```yaml theme={null}
- step:
    name: Upload coverage to CodeAnt AI
    script:
      - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
        variables:
          ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
          COVERAGE_FILE: coverage.xml
          API_BASE_URL: https://api.codeant.ai
          PLATFORM: bitbucket
          FAIL_ON_ERROR: 'true'
          DEBUG: 'false'
```

## Configuration Variables

| Variable                 | Required | Default                  | Description                                                                                                                                       |
| ------------------------ | -------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BITBUCKET_ACCESS_TOKEN` | Yes      | -                        | Bitbucket Repository Access Token for authentication (set as repository variable and pass as `ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN` in pipeline) |
| `COVERAGE_FILE`          | Yes      | `coverage.xml`           | Path to the coverage XML file (e.g., coverage.xml)                                                                                                |
| `API_BASE_URL`           | No       | `https://api.codeant.ai` | CodeAnt AI API base URL (for self-hosted instances)                                                                                               |
| `PLATFORM`               | No       | `bitbucket`              | Git platform (github, gitlab, bitbucket)                                                                                                          |
| `FAIL_ON_ERROR`          | No       | `true`                   | Fail the build if coverage upload fails                                                                                                           |
| `DEBUG`                  | No       | `false`                  | Enable debug logging                                                                                                                              |

## Supported Coverage Formats

> **Important:** Only XML format is supported for coverage reports.

* Cobertura XML (`.xml`)
* JaCoCo XML

## Language-Specific Examples

### Python with pytest

```yaml theme={null}
image: python:3.11

pipelines:
  pull-requests:
    '**':
      - step:
          name: Test and Coverage
          caches:
            - pip
          script:
            - pip install pytest pytest-cov
            - pytest --cov=. --cov-report=xml:coverage.xml

      - step:
          name: Upload to CodeAnt AI
          script:
            - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
              variables:
                ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
```

### JavaScript with Jest

```yaml theme={null}
image: node:18

pipelines:
  pull-requests:
    '**':
      - step:
          name: Test and Coverage
          caches:
            - node
          script:
            - npm install
            - npm test -- --coverage --coverageReporters=cobertura

      - step:
          name: Upload to CodeAnt AI
          script:
            - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
              variables:
                ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
                COVERAGE_FILE: coverage/cobertura-coverage.xml
```

### Java with Maven

```yaml theme={null}
image: maven:3.8-openjdk-11

pipelines:
  pull-requests:
    '**':
      - step:
          name: Test and Coverage
          caches:
            - maven
          script:
            - mvn clean test jacoco:report

      - step:
          name: Upload to CodeAnt AI
          script:
            - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
              variables:
                ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
                COVERAGE_FILE: target/site/jacoco/jacoco.xml
```

### Go with go-cover

```yaml theme={null}
image: golang:1.21

pipelines:
  pull-requests:
    '**':
      - step:
          name: Test and Coverage
          script:
            - go test -coverprofile=coverage.out ./...
            - go install github.com/axw/gocov/gocov@latest
            - go install github.com/AlekSi/gocov-xml@latest
            - gocov convert coverage.out | gocov-xml > coverage.xml

      - step:
          name: Upload to CodeAnt AI
          script:
            - pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
              variables:
                ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
                COVERAGE_FILE: coverage.xml
```

## Coverage Configuration

### Python Coverage Configuration

Create a `.coveragerc` file in your project's root folder to include all source files in the test coverage calculation:

```ini theme={null}
[run]
# include every Python file under the repo root
source = .

# exclude tests, virtualenvs, build artifacts, etc.
omit =
    */tests/*
    */.venv/*
    */build/*
    */dist/*
```

When you assign source to `.`, it checks for every Python file in the root folder and its subdirectories. You can omit directories by placing them in the omit section.

## How It Works

1. The pipe fetches the latest coverage upload script from CodeAnt AI
2. Automatically decodes and prepares the script for execution
3. Uploads your coverage report along with commit and repository information
4. CodeAnt AI processes the report and provides analysis on your pull requests
5. Lines executed by your tests are marked as "covered"
6. Coverage percentage is calculated and status checks are performed on every push

## Troubleshooting

### Enable Debug Mode

Set `DEBUG: 'true'` to see detailed logs:

```yaml theme={null}
- pipe: docker://public.ecr.aws/d2p9q4a9/codeant-coverage:latest
  variables:
    ACCESS_TOKEN: $BITBUCKET_ACCESS_TOKEN
    DEBUG: 'true'
```

### Coverage File Not Found

**Issue**: Coverage file not found error

**Solution**: Ensure the coverage file is generated before upload and verify the `COVERAGE_FILE` path is correct. Use artifacts to pass files between steps if needed.

### Upload Fails But Pipeline Continues

**Issue**: Upload fails but pipeline continues

**Solution**: Set `FAIL_ON_ERROR: 'false'` to continue the pipeline even if upload fails (default is `true`).

### Authentication Errors

**Issue**: Authentication errors during upload

**Solution**: Verify your `BITBUCKET_ACCESS_TOKEN` is valid, has write access, and is marked as secured in Repository Variables.

### Low Coverage Reporting

**Issue**: Coverage reporting is lower than expected

**Solution**: Check your coverage configuration file (e.g., `.coveragerc`), ensure all source files are included, and verify omit patterns aren't excluding too much code.

## Support

* 📧 Email: [support@codeant.ai](mailto:support@codeant.ai)
* 📚 Documentation: [https://docs.codeant.ai](https://docs.codeant.ai)
* 🐛 Repository: [https://bitbucket.org/codeantworkspace/codeant-coverage/src/main/](https://bitbucket.org/codeantworkspace/codeant-coverage/src/main/)

## License

MIT License - see LICENSE file for details
