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

# dbt deploy action for deploying dbt code to Astro

> Use pre-built Astronomer CI/CD templates to automate deploying dbt code to Astro using GitHub Actions.

<Note>There is a hard limit of 10 dbt bundles per Astro Deployment</Note>

If you have a dbt project that you want to use with the deploy action for a GitHub action, you can choose to use either the dbt deploy on its own, or you can create GitHub actions that combine the `infer` action with a dbt deploy.

## Prerequisites

* An [Astro project](/docs/cli/v1.43/develop-project#create-an-astro-project) hosted in a GitHub repository.
* An [Astro Deployment](/docs/astro/create-deployment).
* A [Deployment API token](/docs/astro/deployment-api-tokens), [Workspace API token](/docs/astro/workspace-api-tokens), or [Organization API token](/docs/astro/organization-api-tokens).
* Access to [GitHub Actions](https://github.com/features/actions).

Each CI/CD template implementation might have additional requirements.

<Warning>
  If you use a [self-hosted runner](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners) to execute jobs from GitHub Actions, the Astro CLI's `config.yaml` file, which stores default deploy details, might be shared across your organization and hence multiple CI/CD pipelines. To reduce the risk of accidentally deploying to the wrong Deployment, ensure the following:

  * Add `ASTRO_API_TOKEN` to your repository and include a check in your GitHub workflow to verify that it exists.
  * Use Deployment API tokens, which are scoped only to one Deployment, instead of Workspace or Organization API tokens.
  * Specify `deployment-id` or `deployment-name` in your action. For example, `astro deploy <deployment-id>` or `astro deploy -n <deployment-name>`.
  * Add the command `astro logout` at the end of your workflow to ensure that your authentication token is cleared from the `config.yaml` file
</Warning>

### Setup

<Note>Each template installs the Astro CLI with [`setup-astro-cli`](https://github.com/astronomer/setup-astro-cli) before `deploy-action` runs. Astronomer recommends installing the CLI in a separate step so that you can pin or upgrade the CLI version independently of the action, including with Dependabot, and reuse a single installation across multiple deploy steps. To pin a version, set the `version` input, for example `version: "1.40.1"`. If you omit this step, `deploy-action` installs the latest version of the Astro CLI itself.</Note>

<Tabs>
  <Tab title="Single branch">
    #### Prerequisites (Single branch)

    * The root folder name for the directory that contains your dbt project.

    #### Implementation (Single branch)

    To automate code deploys to a single Deployment using [GitHub Actions](https://github.com/features/actions) for a dbt project, complete the following setup in a Git-based repository that hosts an Astro project:

    1. Set the following as a [GitHub secret](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository):

    * `ASTRO_API_TOKEN`: The value for your Workspace or Organization API token.

    2. In your project repository, create a new YAML file in `.github/workflows` that includes the following configuration:

    ```yaml wrap theme={null}
    name: Astronomer CI - Deploy dbt code

    on:
      push:
        branches:
          - main

    env:
      ## Sets Deployment API credentials as environment variables
      ASTRO_API_TOKEN: ${{ secrets.ASTRO_API_TOKEN }}

    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Install Astro CLI
          uses: astronomer/setup-astro-cli@v0.0.1
        - name: Deploy to Astro
          uses: astronomer/deploy-action@v0.14.0
          with:
            deployment-id: <deployment-id>
            deploy-type: dbt
            root-folder: <dbt-root-folder>
    ```

    3. (Optional) You can add [optional configurations](https://github.com/astronomer/deploy-action/blob/main/README.md#configuration-options) to customize your workflow. For example, if you add [`wake-on-deploy`](https://github.com/astronomer/deploy-action/blob/main/README.md#wake-on-deploy) to your configuration, the Deploy Action wakes a hibernating Deployment before deploying code to it.

    <Warning>Using `wake-on-deploy` takes precedence over any existing Deployment hibernation overrides that you configured through the Astro UI or `config.yaml` file.</Warning>
  </Tab>

  <Tab title="Multiple branch">
    The following template can be used to create a multiple branch CI/CD pipeline using GitHub Actions. A multiple branch pipeline can be used to test dags in a development Deployment and promote them to a production Deployment.

    #### Configuration requirements

    * You have both a `dev` and `main` branch of an Astro project hosted in a single GitHub repository.
    * You have respective `dev` and `prod` Deployments on Astro where you deploy your GitHub branches to.
    * You have at least one API token with access to both of your Deployments.
    * The root folder name for the directory that contains your dbt project.

    #### Implementation (Multiple branch)

    1. Set the following as [GitHub secrets](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository):

    * `PROD_ASTRO_API_TOKEN`: The value for your production Workspace or Organization API token.
    * `DEV_ASTRO_API_TOKEN`: The value for your development Workspace or Organization API token.

    2. In your project repository, create a new YAML file in `.github/workflows` that includes the following configuration:

    ```yaml expandable wrap theme={null}
    name: Astronomer CI - Deploy dbt code (Multiple Branches)

    on:
      push:
        branches: [dev]
      pull_request:
        types:
          - closed
        branches: [main]

    jobs:
      dev-push:
        if: github.ref == 'refs/heads/dev'
        env:
          ## Sets DEV Deployment API credential as an environment variable
          ASTRO_API_TOKEN: ${{ secrets.DEV_ASTRO_API_TOKEN }}
        runs-on: ubuntu-latest
        steps:
        - name: Install Astro CLI
          uses: astronomer/setup-astro-cli@v0.0.1
        - name: Deploy to Astro
          uses: astronomer/deploy-action@v0.14.0
          with:
            deployment-id: <dev-deployment-id>
            deploy-type: dbt
            root-folder: <dbt-root-folder>
      prod-push:
        if: github.event.action == 'closed' && github.event.pull_request.merged == true
        env:
          ## Sets Prod Deployment API credential as an environment variable
          ASTRO_API_TOKEN: ${{ secrets.PROD_ASTRO_API_TOKEN }}
        runs-on: ubuntu-latest
        steps:
        - name: Install Astro CLI
          uses: astronomer/setup-astro-cli@v0.0.1
        - name: Deploy to Astro
          uses: astronomer/deploy-action@v0.14.0
          with:
            deployment-id: <prod-deployment-id>
            deploy-type: dbt
            root-folder: <dbt-root-folder>
    ```

    3. (Optional) You can add [optional configurations](https://github.com/astronomer/deploy-action/blob/main/README.md#configuration-options) to customize your workflow. For example, if you add [`wake-on-deploy`](https://github.com/astronomer/deploy-action/blob/main/README.md#wake-on-deploy) to your configuration, the Deploy Action wakes a hibernating Deployment before deploying code to it.

    <Warning>Using `wake-on-deploy` takes precedence over any existing Deployment hibernation overrides that you configured through the Astro UI or `config.yaml` file.</Warning>
  </Tab>

  <Tab title="Combine dbt and Astro project">
    In addition to configuring the deploy action to deploy just your dbt changes, you can also configure the action to do a `dbt deploy` and an `infer` deploy.

    #### Prerequisites (Combine dbt and Astro project)

    * The root folder name for the directory that `contct.ains` your dbt project

    #### Implementation (Combine dbt and Astro project)

    To automate code deploys to a single Deployment using [GitHub Actions](https://github.com/features/actions) for a dbt project, complete the following setup in a Git-based repository that hosts both an Astro project and a dbt project:

    1. Set the following as a [GitHub secret](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository):

    * `ASTRO_API_TOKEN`: The value for your Workspace or Organization API token.

    2. In your project repository, create a new YAML file in `.github/workflows` that includes the following configuration:

    ```yaml wrap theme={null}
    name: Astronomer CI - Deploy dbt and Astro project code

    on:
      push:
        branches:
          - main

    env:
      ## Sets Deployment API credentials as environment variables
      ASTRO_API_TOKEN: ${{ secrets.ASTRO_API_TOKEN }}

    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Install Astro CLI
          uses: astronomer/setup-astro-cli@v0.0.1
        - name: DBT Deploy to Astro
          uses: astronomer/deploy-action@v0.14.0
          with:
            deployment-id: <deployment-id>
            deploy-type: dbt
            root-folder: <dbt-root-folder>
        - name: DAGs/Image Deploy to Astro
          uses: astronomer/deploy-action@v0.14.0
          with:
            deployment-id: <deployment-id>
            root-folder: <astro-project-root-folder>
            parse: true
    ```

    3. (Optional) You can add [optional configurations](https://github.com/astronomer/deploy-action/blob/main/README.md#configuration-options) to customize your workflow. For example, if you add [`wake-on-deploy`](https://github.com/astronomer/deploy-action/blob/main/README.md#wake-on-deploy) to your configuration, the Deploy Action wakes a hibernating Deployment before deploying code to it.

    <Warning>Using `wake-on-deploy` takes precedence over any existing Deployment hibernation overrides that you configured through the Astro UI or `config.yaml` file.</Warning>
  </Tab>
</Tabs>
