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

# Integrate with Bitbucket

> See how to manage your Upsun environments directly from your Bitbucket repository.

export const VariableBlock = ({name}) => {
  return <var spellCheck={false} title={`Replace '${name}' with your own data`}>{name}</var>;
};

export const SettingsIcon = () => <svg width="24px" height="24px" style={{
  display: 'inline',
  verticalAlign: 'middle'
}}>
    <title id="settings-icon">Settings</title>
    <path d="M10.5289 21.9416C9.86066 21.8582 9.3595 21.3576 9.19245 20.6903L9.02539 19.6892C8.85834 19.6058 8.77482 19.6058 8.60776 19.5224L7.93955 20.0229C7.43839 20.44 6.68665 20.44 6.10196 20.0229C6.10196 20.0229 4.09732 18.1042 4.01379 17.9374C3.51263 17.3535 3.51263 16.6027 3.93027 16.0187L4.51495 15.3514C4.43143 15.1845 4.43143 15.1011 4.3479 14.9343L3.42911 14.7674C2.76089 14.684 2.25973 14.1835 2.09268 13.4327C2.00915 13.1824 2.09268 10.4296 2.09268 10.4296C2.17621 9.76222 2.67737 9.2617 3.34558 9.09486L4.3479 8.92802C4.43143 8.8446 4.43143 8.76118 4.51495 8.59434L4.01379 7.92697C3.59616 7.42645 3.59616 6.67567 4.01379 6.09173C4.01379 6.09173 5.93491 4.08964 6.10196 4.00622C6.68665 3.5057 7.43839 3.5057 8.02307 3.9228L8.69129 4.50675C8.85834 4.42333 8.94187 4.42333 9.10892 4.33991L9.27597 3.42228C9.3595 2.75492 9.86066 2.2544 10.6124 2.08756C10.863 2.00414 13.2853 2.00414 13.5358 2.08756H13.6194C14.2876 2.17098 14.7887 2.6715 14.9558 3.33886L15.1228 4.33991C15.2064 4.42333 15.2899 4.50675 15.457 4.50675L16.1252 4.00622C16.6263 3.58912 17.3781 3.58912 17.9628 4.00622C17.9628 4.00622 19.9674 5.92489 20.0509 6.09173C20.5521 6.67567 20.5521 7.42645 20.1344 8.0104L19.6333 8.67776C19.7168 8.8446 19.7168 9.01144 19.8003 9.09486L20.7191 9.2617C21.3873 9.34512 21.972 9.92906 22.0556 10.5964V13.5996C21.972 14.2669 21.4709 14.7674 20.8027 14.9343L19.8003 15.1011C19.7168 15.268 19.7168 15.3514 19.6333 15.5182L20.218 16.269C20.6356 16.7695 20.6356 17.5203 20.218 18.1042L18.0463 20.2732C17.4616 20.6903 16.7099 20.6903 16.2087 20.2732L15.3734 19.6058C15.2064 19.6892 15.1228 19.6892 14.9558 19.7726L14.7887 20.6903C14.7052 21.3576 14.1205 21.9416 13.4523 22.025H10.5289V21.9416ZM11.5312 20.3566C11.8653 20.3566 12.1994 20.3566 12.45 20.3566C12.8676 20.3566 13.2017 20.0229 13.2853 19.6058L13.3688 18.9384C13.3688 18.6882 13.6194 18.4379 13.8699 18.2711L15.1228 17.7706C15.3734 17.6871 15.7075 17.6871 15.9581 17.854L16.5428 18.2711C16.8769 18.5213 17.3781 18.5213 17.6286 18.1877C17.7957 18.0208 18.0463 17.7706 18.2969 17.5203C18.5474 17.1866 18.631 16.7695 18.3804 16.4358L17.8792 16.0187C17.7122 15.7685 17.6286 15.4348 17.7957 15.1845L18.2969 14.0167C18.3804 13.7664 18.631 13.5996 18.9651 13.5161L19.6333 13.4327C20.0509 13.3493 20.385 13.0156 20.385 12.5985C20.385 12.2648 20.385 11.9311 20.385 11.6809C20.385 11.2638 20.0509 10.9301 19.6333 10.8467L18.9651 10.7633C18.7145 10.7633 18.4639 10.513 18.2969 10.2627L17.7957 9.01144C17.7122 8.76118 17.7122 8.4275 17.8792 8.17724L18.2969 7.59329C18.5474 7.25961 18.5474 6.84251 18.2133 6.50883C18.0463 6.34199 17.7957 6.09173 17.5451 5.84147C17.211 5.50779 16.7934 5.50779 16.4593 5.75805L16.0416 6.17515C15.7911 6.34199 15.457 6.42541 15.2064 6.25857L14.037 5.75805C13.7864 5.67463 13.6194 5.42437 13.5358 5.09069L13.3688 4.50675C13.2853 4.08964 12.9511 3.75596 12.5335 3.75596C12.1994 3.75596 11.8653 3.75596 11.6147 3.75596C11.1971 3.75596 10.863 4.08964 10.7795 4.50675L10.6959 5.17411C10.6959 5.42437 10.4453 5.67463 10.1948 5.84147L9.02539 6.25857C8.69129 6.42541 8.44071 6.34199 8.19013 6.17515L7.60544 5.75805C7.27133 5.50779 6.77017 5.50779 6.51959 5.84147C6.26901 6.00831 6.10196 6.25857 5.85138 6.42541C5.6008 6.75909 5.51727 7.17619 5.85138 7.50987L6.18549 8.09382C6.35254 8.34408 6.43607 8.67776 6.26901 8.92802L5.76785 10.0959C5.68433 10.3462 5.43375 10.513 5.09964 10.5964L4.43143 10.6798C4.01379 10.7633 3.67969 11.0969 3.67969 11.514C3.67969 11.8477 3.67969 12.1814 3.67969 12.4317C3.67969 12.8488 4.01379 13.1825 4.43143 13.2659L5.09964 13.3493C5.35022 13.3493 5.6008 13.5996 5.76785 13.8498L6.26901 15.1011C6.35254 15.3514 6.35254 15.6851 6.18549 15.9353L5.76785 16.5193C5.51727 16.8529 5.51727 17.3535 5.85138 17.6037C6.01843 17.7706 6.26901 18.0208 6.51959 18.2711C6.8537 18.5213 7.27133 18.6048 7.60544 18.3545L8.02307 17.854C8.27365 17.6871 8.60776 17.6037 8.85834 17.7706L10.0277 18.2711C10.2783 18.3545 10.4453 18.6048 10.5289 18.9384L10.6124 19.6058C10.7795 20.0229 11.1136 20.3566 11.5312 20.3566ZM18.798 6.92593C18.798 6.92593 18.798 7.00935 18.798 6.92593V6.92593Z"></path>
    <path d="M12.0324 17.0198C9.27597 17.0198 7.02075 14.7675 7.02075 12.0146C7.02075 9.26172 9.27597 7.00937 12.0324 7.00937C14.7887 7.00937 17.044 9.26172 17.044 12.0146C17.044 14.7675 14.7887 17.0198 12.0324 17.0198ZM12.0324 8.67777C10.1948 8.67777 8.69129 10.1793 8.69129 12.0146C8.69129 13.8498 10.1948 15.3514 12.0324 15.3514C13.8699 15.3514 15.3734 13.8498 15.3734 12.0146C15.3734 10.1793 13.8699 8.67777 12.0324 8.67777Z"></path>
  </svg>;

If you have code in a Bitbucket repository, you might want to connect it to an Upsun project.
This means you can keep your Bitbucket workflows
and treat the Bitbucket repository as the source of truth for your code.

Your Upsun project becomes a mirror of your Bitbucket repository.
This means you shouldn't push code directly to Upsun.
Any changes you push directly get overwritten by the integration when changes happen in the Bitbucket repository.

When you set up an integration with Bitbucket, it automates the following processes for you:

* Creating a new environment when a branch is created or a pull request is opened.
* Rebuilding the environment when new code is pushed to Bitbucket.
* Deleting the environment when a pull request is merged.

You can set up an integration with either Bitbucket Cloud
or a self-hosted [Bitbucket Server](https://confluence.atlassian.com/bitbucketserver/).

## Before you begin

To manage source integrations, you need to be a [project admin](/docs/administration/users).

You also need a Bitbucket Cloud or Bitbucket Server repository with working code.

## Bitbucket Cloud

### 1. Create an OAuth consumer

To integrate your Upsun project with an existing Bitbucket Cloud repository,
[create an OAuth consumer](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/):

<img src="https://mintcdn.com/upsun-c9761871/Bn5ANCnmxZmegLTL/images/integrations/bitbucket/bitbucket-oauth-consumer.svg?fit=max&auto=format&n=Bn5ANCnmxZmegLTL&q=85&s=7649bef349e76080f56724bb0a67eb02" alt="A screenshot of how to setup the Bitbucket OAuth consumer" width="484" height="684" data-path="images/integrations/bitbucket/bitbucket-oauth-consumer.svg" />

<Info>
  Be sure to define the above as a *private* consumer by checking the **This is a private consumer** box.
</Info>

The **Callback URL** isn't important in this case.
You can set it to `http://localhost`.

Copy the **Key** and **Secret** for your consumer.

### 2. Enable the Cloud integration

To enable the integration, use either the [CLI](/cli) or the [Console](/docs/administration/web).

<Tabs>
  <Tab title="Using the CLI">
    Run the following command:

    ```bash theme={null}
    upsun integration:add \
      --project <PROJECT_ID> \
      --type bitbucket \
      --repository <OWNER/REPOSITORY> \
      --key <CONSUMER_KEY> \
      --secret <CONSUMER_SECRET>
    ```

    * `PROJECT_ID` is the ID of your Upsun project.
    * `OWNER/REPOSITORY` is the name of your repository in Bitbucket.
    * `CONSUMER_KEY` is the key of the [OAuth consumer you created](#1-create-an-oauth-consumer).
    * `CONSUMER_SECRET` is the secret of the [OAuth consumer you created](#1-create-an-oauth-consumer).

    For example, if your repository is located at `https://bitbucket.org/platformsh/platformsh-docs`,
    the command is similar to the following:

    ```bash theme={null}
    upsun integration:add \
      --project abcdefgh1234567 \
      --type bitbucket \
      --repository platformsh/platformsh-docs \
      --key abc123 \
      --secret abcd1234 \
    ```
  </Tab>

  <Tab title="In the Console">
    1. Select the project where you want to enable the integration.
    2. Click **<SettingsIcon /> Settings**.
    3. Under **Project settings**, click **Integrations**.
    4. Click **+ Add integration**.
    5. Under **Bitbucket**, click **+ Add**.
    6. Complete the form with:
       * The repository in the form `owner/repository`
       * The [key and secret you generated](#1-create-an-oauth-consumer)
    7. Check that the other options match what you want.
    8. Click **Add integration**.
  </Tab>
</Tabs>

In both the CLI and Console, you can choose from the following options:

| CLI flag               | Default | Description                                                                                                                                                                                                                                                                                                                                                                               |
| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fetch-branches`       | `true`  | Whether to mirror and update branches on Upsun and create inactive environments from them. When enabled, merging on an Upsun environment isn't possible. That is, merging environments must be done on the source repository rather than on the Upsun project. See note below for details related to this flag and synchronizing code from a parent environment.                          |
| `prune-branches`       | `true`  | Whether to delete branches from Upsun that don't exist in the Bitbucket repository. When enabled, branching (creating environments) must be done on the source repository rather than on the Upsun project. Branches created on Upsun that are not on the source repository will not persist and will be quickly pruned. Automatically disabled when fetching branches is disabled.       |
| `build-pull-requests`  | `true`  | Whether to track all pull requests and create active environments from them, which builds the pull request.                                                                                                                                                                                                                                                                               |
| `resync-pull-requests` | `false` | Whether to sync data from the parent environment on every push to a pull request.                                                                                                                                                                                                                                                                                                         |
| `resources-init`       | `false` | To [specify a resource initialization strategy](/docs/manage-resources/resource-init#first-deployment) for new containers. Once set, the strategy applies to **all** the deployments you launch through your source integration. See more information on [available resource initialization strategies](/docs/manage-resources/resource-init#specify-a-resource-initialization-strategy). |

<Note>
  To [keep your repository clean](/docs/core-concepts/best-practices/clean-repository) and avoid performance issues, make sure you enable both the `fetch-branches` and `prune-branches` options.
</Note>

#### 3. Validate the integration

Verify that your integration is functioning properly [using the CLI](/docs/integrations/overview#validate-integrations):

```bash theme={null}
upsun integration:validate
```

##### Add the webhook manually

If the integration was added with the correct permissions, the necessary webhook is added automatically.
If you see a message that the webhook wasn't added, add one manually.

To configure a webhook on a Bitbucket repository,
you need to have Admin [user permissions](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/).

1. Get the webhook URL by running this command: `upsun integration:get --property hook_url`.
2. Copy the returned URL.
3. Follow the [Bitbucket instructions to create a webhook](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/#Create-webhooks)
   using the URL you copied.
   Make sure to update the triggers to include all pull request events except comments and approval.

You can now start pushing code, creating new branches,
and opening pull requests
directly in your Bitbucket repository.
Your Upsun environments are automatically created and updated.

## Bitbucket Server

### 1. Generate a token

To integrate your Upsun project with a repository on a Bitbucket Server instance,
you first need to create an access token associated with your account.

[Generate a token](https://confluence.atlassian.com/display/BitbucketServer/HTTP+access+tokens).
and give it at least read access to projects and admin access to repositories.
Copy the token.

### 2. Enable the Server integration

To enable the integration, use either the [CLI](/cli) or the [Console](/docs/administration/web).

<Tabs>
  <Tab title="Using the CLI">
    Run the following command:

    ```bash theme={null}
    upsun integration:add \
      --project PROJECT_ID \
      --type bitbucket_server \
      --repository OWNER/REPOSITORY \
      --username BITBUCKET_USERNAME \
      --token BITBUCKET_SERVER_ACCESS_TOKEN \
      --bitbucket-url BITBUCKET_SERVER_URL
    ```

    * `PROJECT_ID` is the ID of your Upsun project.
    * `OWNER/REPOSITORY` is the name of the repository in Bitbucket server.
    * `BITBUCKET_SERVER_ACCESS_TOKEN` is the [token you generated](#1-generate-a-token).
    * `BITBUCKET_SERVER_URL` is the URL for your Bitbucket server.

    For example, if your repository is located at `https://example.com/platformsh/platformsh-docs`,
    the command is similar to the following:

    ```bash theme={null}
    upsun integration:add \
      --project abcdefgh1234567 \
      --type bitbucket_server \
      --repository platformsh/platformsh-docs \
      --username user@example.com \
      --token abc123 \
      --bitbucket-url https://example.com
    ```
  </Tab>

  <Tab title="In the Console">
    1. Select the project where you want to enable the integration.
    2. Click **Settings**.
    3. Under **Project settings**, click **Integrations**.
    4. Click **+ Add integration**.
    5. Under **Bitbucket server**, click **+ Add**.
    6. Complete the form with:
       * Your server URL
       * Your Bitbucket username
       * The [token you generated](#1-generate-a-token)
       * The Bitbucket server project name
       * The repository in the form `owner/repository`
    7. Check that the other options match what you want.
    8. Click **Add integration**.
  </Tab>
</Tabs>

In both the CLI and Console, you can choose from the following options:

| CLI flag                          | Default | Description                                                                                                                                           |
| --------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fetch-branches`                  | `true`  | Whether to mirror and update branches on Upsun and create inactive environments from them.                                                            |
| `prune-branches`                  | `true`  | Whether to delete branches from Upsun that don't exist in the Bitbucket server repository. Automatically disabled when fetching branches is disabled. |
| `build-pull-requests`             | `true`  | Whether to track all pull requests and create active environments from them, which builds the pull request.                                           |
| `pull-requests-clone-parent-data` | `true`  | Whether to clone data from the parent environment when creating a pull request environment.                                                           |

To [keep your repository clean](/docs/core-concepts/best-practices/clean-repository) and avoid performance issues,
make sure you enable both the `fetch-branches` and `prune-branches` options.

#### 3. Validate the integration

Verify that your integration is functioning properly [using the CLI](/docs/integrations/overview#validate-integrations):

```bash theme={null}
upsun integration:validate
```

##### Add the webhook manually

If the integration was added with the correct permissions, the necessary webhook is added automatically.
If you see a message that the webhook wasn't added, add one manually.

To configure a webhook on a Bitbucket repository,
you need to have Admin [user permissions](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/).

1. Get the webhook URL by running this command: `upsun integration:get --property hook_url`.
2. Copy the returned URL.
3. Follow the [Bitbucket instructions to create a webhook](https://confluence.atlassian.com/bitbucketserver076/managing-webhooks-in-bitbucket-server-1026535073.html#ManagingwebhooksinBitbucketServer-creatingwebhooksCreatingwebhooks)
   using the URL you copied.
   Send all events except comments and approval.

You can now start pushing code, creating new branches,
and opening pull requests
directly in your Bitbucket repository.
Your Upsun environments are automatically created and updated.

## Environment parent and status

When a **branch** is created in Bitbucket,
an environment is created in Upsun with the default branch as its parent.
It starts as an [inactive environment](/docs/glossary#inactive-environment) with no data or services.

When a **pull request** is opened in Bitbucket,
an environment is created in Upsun with the pull request's target branch as its parent.
It starts as an [active environment](/docs/glossary#active-environment) with a copy of its parent's data.

## Source of truth

When you add an integration, your Bitbucket repository is considered to be the source of truth for the project.
Your Upsun project is only a mirror of that repository and you can only push commits to Bitbucket.

To clone your code, follow these steps:

<Tabs>
  <Tab title="Using the CLI">
    Run the following command:

    ```bash theme={null}
    upsun get PROJECT_ID
    ```
  </Tab>

  <Tab title="Using Git">
    1. In the Console, open the project you want to clone.
    2. Click **Code**.
    3. Click **Git**.
    4. Run the command you find using Git.
  </Tab>
</Tabs>

When you do this, you're cloning from your integrated Bitbucket repository,
if you have the [appropriate access to do so](/docs/integrations/source/troubleshoot).

### Sync, fetch, and prune

An integration from your source repository to Upsun establishes that:

* your source repository is the source of truth, where Git operations occur
* Upsun is a mirror of that repository, provisioning infrastructure according to configuration, and orchestrating environments according to the branch structure of the your source repository repository

Actions that take place on Upsun don't affect commits on your source repository.
Because of this, the your source repository integration enables both `fetch-branches` (track branches on your source repository) and `prune-branches` (delete branches that don't exist on your source repository) by default.
You can change these settings but it is recommended to keep them.

When enabled by default, you are limited by design as to what actions can be performed within the context of an Upsun project with a your source repository integration:

| Action                       | Observation                                                                                                                                                                                       | Recommendation                                                                                                                                                                                                                                                                                |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Branch from parent           | Running [`environment:branch`](/cli/reference#environmentbranch) with the CLI, or selecting **Branch** in Console produces a new child environment, but it's deleted shortly after automatically. | Contribute to the your source repository repository itself by creating a branch and pull request. When the PR has been opened, a new environment will be provisioned for it.                                                                                                                  |
| Merge in parent              | Running [`environment:merge`](/cli/reference#environmentmerge) with the CLI fails locally, and the **Merge** option in Console is not clickable.                                                  | Review and merge pull requests and/or branches on the your source repository repository.                                                                                                                                                                                                      |
| Merge into child (sync code) | Running [`environment:synchronize`](/cli/reference#environmentsynchronize) with the CLI fails locally, and the **Sync** option in Console won't allow you to include `code` in that sync.         | Perform the merge locally from a matching branch on your source repository. For example, clone the most recent parent (`git pull origin parent-branch`), switch to the pull request branch (`git checkout ga-staging`), and then merge the parent into the current branch (`git merge main`). |

## Pull request URLs

When a pull request is deployed, the integration reports the primary URL for the deployed environment.
So you get a link to the deployed environment right in the pull request.

If you have multiple routes,
ensure the correct one is reported by [specifying the primary route](/docs/routes#route-configuration-reference).
