> For the complete documentation index, see [llms.txt](https://developer.harness.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.harness.io/continuous-delivery/3.0/use-deployments/helm/helm-deployment-strategies/blank-canvas.md).

# Blank canvas Helm deployment

The managed deployment strategies (canary and blue-green) add opinionated step sequences to your stage. The blank canvas approach uses the **Helm Basic Deploy** step directly. You compose only the steps you need, in the order that fits your workflow. There is no automatic rollback unless you add a **Helm Rollback** step yourself.

Use the blank canvas approach when:

* You are deploying a Helm chart without needing canary validation or blue-green traffic switching.
* You want full control over step ordering and do not want Harness to pre-populate a step sequence.
* You need to run `helm test` or custom pre/post-deploy operations around the install.

***

### Before you begin <a href="#before-you-begin" id="before-you-begin"></a>

Before you configure a blank canvas stage, make sure you have the following in place:

* **A Helm service:** Go to [Helm services](/continuous-delivery/3.0/use-deployments/helm/helm-services.md) to set up a service with a Helm chart source and an artifact.
* **A Helm infrastructure:** Go to [Helm infrastructure](/continuous-delivery/3.0/use-deployments/helm/helm-infrastructure.md) to connect a cluster and namespace.
* **A Harness delegate in the target cluster:** The delegate runs the deployment steps against your cluster.
* **Runtime configuration:** Every Helm stage requires a `runtime` block specifying the connector and namespace. Go to [Helm runtime configuration](/continuous-delivery/3.0/use-deployments/helm/overview.md#helm-runtime-configuration) to understand the required fields.

***

### How it works <a href="#how-it-works" id="how-it-works"></a>

When you select **Deploy without a strategy** (or start with a blank stage and add steps manually), Harness does not pre-populate any steps. You add a Helm Basic Deploy step as the primary deploy action, then layer in any rollback, testing, or cleanup steps your workflow requires.

The **Helm Basic Deploy** step runs `helm upgrade --install`. It:

* Resolves the chart source, values files, and artifact image tag from your service definition.
* Runs `helm upgrade --install <release-name> <chart-path>` with all resolved values files and command flags.
* Waits for all deployed workloads to reach ready status unless **Skip Steady State Check** is enabled.
* Does not support automatic rollback unless you add a **Helm Rollback** step to the rollback group.

***

### Configure the Helm Basic Deploy step <a href="#configure-the-helm-basic-deploy-step" id="configure-the-helm-basic-deploy-step"></a>

Click **Helm Basic Deploy** in the stage canvas to open its configuration panel.

The following fields are available:

| Field                             | Description                                                                                                                                  | Required |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| **Name**                          | Display name for this step in the stage canvas. Default: `Helm Basic Deploy`.                                                                | Required |
| **Ignore Failed Release History** | When enabled, proceeds with deployment even if the previous Helm release is in a failed state. Default: `false`.                             | Optional |
| **Skip Steady State Check**       | When enabled, skips waiting for all deployed workloads to reach ready status after `helm upgrade --install`. Default: `false`.               | Optional |
| **Run Chart Tests**               | When enabled, runs `helm test` against the release after a successful deployment. Default: `false`.                                          | Optional |
| **Skip Cleanup**                  | When enabled, skips cleanup of a failed first release. Use to inspect resources left behind by a failed initial install. Default: `false`.   | Optional |
| **Print Manifests**               | When enabled, logs the full rendered chart manifest in the step output with secrets redacted. Default: `false`.                              | Optional |
| **Server-Side Rendering**         | When enabled, passes `--server` to `helm template` so manifests are rendered against the live cluster rather than locally. Default: `false`. | Optional |
| **Command Flags**                 | Additional flags appended to the `helm upgrade` command, for example `--atomic` or `--cleanup-on-fail`.                                      | Optional |

Go to [Helm Basic Deploy step library](/continuous-delivery/3.0/use-deployments/helm/step-library/helm-basic-deploy.md) for the full field reference.

***

### Pipeline YAML <a href="#pipeline-yaml" id="pipeline-yaml"></a>

The minimal blank canvas stage uses a single **Helm Basic Deploy** step:

```yaml
pipeline:
  stages:
    - name: helm-deploy
      id: helm_deploy
      service:
        type: helm
        items:
          - id: <your-service-id>
      environment:
        id: <your-environment-id>
        deploy-to: <your-infrastructure-id>
      steps:
        - name: Helm Basic Deploy
          id: helmBasicDeployStep
          template:
            uses: helmDeployBasicStep
      runtime:
        kubernetes:
          namespace: <target-namespace>
          connector: <your-kubernetes-connector-id>
```

***

### Add a rollback step <a href="#add-a-rollback-step" id="add-a-rollback-step"></a>

To support rollback, add a **Helm Rollback** step to the rollback group of the stage. Without this step, a failed deployment cannot be automatically reverted.

```yaml
rollback:
  - group:
      steps:
        - name: Helm Rollback
          id: helmRollbackStep
          template:
            uses: helmRollbackStep
```

Go to [Helm Rollback step library](/continuous-delivery/3.0/use-deployments/helm/step-library/helm-rollback.md) for the full field reference.

***

### Steps to add before the deploy step <a href="#steps-to-add-before-the-deploy-step" id="steps-to-add-before-the-deploy-step"></a>

#### Helm Delete (pre-clean) <a href="#helm-delete-pre-clean" id="helm-delete-pre-clean"></a>

If a previous release is in a failed state and **Ignore Failed Release History** is insufficient, you can explicitly uninstall the release before deploying. Go to [Helm Delete step library](/continuous-delivery/3.0/use-deployments/helm/step-library/helm-delete.md) for configuration details.

```yaml
- name: Pre-clean
  id: helmDeleteStep
  template:
    uses: helmDeleteStep
    with:
      release: my-release
```

***

### Steps to add after the deploy step <a href="#steps-to-add-after-the-deploy-step" id="steps-to-add-after-the-deploy-step"></a>

#### Helm Delete (post-clean) <a href="#helm-delete-post-clean" id="helm-delete-post-clean"></a>

Use the **Helm Delete** step after a successful deploy to uninstall a previous or temporary release. Go to [Helm Delete step library](/continuous-delivery/3.0/use-deployments/helm/step-library/helm-delete.md) for configuration details.

```yaml
- name: Uninstall old release
  id: helmDeleteStep
  template:
    uses: helmDeleteStep
    with:
      release: my-old-release
```

***

### Example: deploy with chart tests <a href="#example-deploy-with-chart-tests" id="example-deploy-with-chart-tests"></a>

This stage installs a Helm chart and runs `helm test` after deployment to validate the release:

```yaml
pipeline:
  stages:
    - name: helm-deploy
      id: helm_deploy
      service:
        type: helm
        items:
          - id: my-helm-service
      environment:
        id: production
        deploy-to: production-infra
      steps:
        - name: Helm Basic Deploy
          id: helmBasicDeployStep
          template:
            uses: helmDeployBasicStep
            with:
              deploy_test: true
      rollback:
        - group:
            steps:
              - name: Helm Rollback
                id: helmRollbackStep
                template:
                  uses: helmRollbackStep
      runtime:
        kubernetes:
          namespace: production
          connector: my-k8s-connector
```

***

### Example: pre-clean and deploy <a href="#example-pre-clean-and-deploy" id="example-pre-clean-and-deploy"></a>

This stage uninstalls any broken previous release before installing fresh:

```yaml
pipeline:
  stages:
    - name: helm-fresh-install
      id: helm_fresh_install
      service:
        type: helm
        items:
          - id: my-helm-service
      environment:
        id: staging
        deploy-to: staging-infra
      steps:
        - name: Delete Previous Release
          id: helmDeleteStep
          template:
            uses: helmDeleteStep
        - name: Helm Basic Deploy
          id: helmBasicDeployStep
          template:
            uses: helmDeployBasicStep
      runtime:
        kubernetes:
          namespace: staging
          connector: my-k8s-connector
```

***

### Next steps <a href="#next-steps" id="next-steps"></a>

* Go to [Helm canary deployment](/continuous-delivery/3.0/use-deployments/helm/helm-deployment-strategies/canary.md) for incremental traffic validation before full promotion.
* Go to [Helm blue-green deployment](/continuous-delivery/3.0/use-deployments/helm/helm-deployment-strategies/blue-green.md) for zero-downtime deployments with instant rollback.
* Go to [Helm Basic Deploy step library](/continuous-delivery/3.0/use-deployments/helm/step-library/helm-basic-deploy.md) for the full field reference.
