Helm
Navecd has first class support for Helm. It can install and upgrade Charts. Drift detection is enabled by default and implemented by patching Helm with Server-Side Apply (SSA).
Install Helm Chart
To install a Helm Chart, declare a desired HelmRelease Component:
package myapp
import (
  "github.com/kharf/navecd/schema/component"
)
myRelease: component.#HelmRelease & {
    name:      "my-release"
    namespace: ns.content.metadata.name
    chart: {
        name:    "my-chart"
        repoURL: "oci://my-chart-repository"
        version: "x.x.x"
    }
    values: {
      foo: "bar"
    }
}
Private Repositories
Private Repositories are supported either through Workload Identity or Kubernetes Secrets.
A Secret can be referenced as follows:
package myapp
import (
  "github.com/kharf/navecd/schema/component"
)
myRelease: component.#HelmRelease & {
    name:      "my-release"
    namespace: ns.content.metadata.name
    chart: {
        name:    "my-chart"
        repoURL: "oci://my-chart-repository"
        version: "x.x.x"
        auth: secretRef: {
          name: "secret-name"
          // Can not be cross namespace. Field wil be deleted in upcoming versions.
          namespace: "secret-namespace"
        }
    }
    values: {
      foo: "bar"
    }
}
Custom Resource Definitions (CRDs)
Helm 3 supports installation of CRDs through a crds directory inside a Chart, but it does not support upgrades/deletions.
See reason.
However, CRD upgrade is supported by Navecd and can be enabled:
Info
Navecd never deletes CRDs contained in a Chart. It only handles installations and upgrades.
package myapp
import (
  "github.com/kharf/navecd/schema/component"
)
myRelease: component.#HelmRelease & {
    name:      "my-release"
    namespace: ns.content.metadata.name
    chart: {
        name:    "my-chart"
        repoURL: "oci://my-chart-repository"
        version: "x.x.x"
    }
    crds: allowUpgrade: true
    values: {
      foo: "bar"
    }
}
Patches / Post Rendering
Patches allow to manipulate rendered manifests before they are installed or upgraded. Manifests are identified by their GVK(Group/Version/Kind), Name and Namespace for namespaced manifests.
package myapp
import (
  "github.com/kharf/navecd/schema/component"
)
myRelease: component.#HelmRelease & {
    name:      "my-release"
    namespace: ns.content.metadata.name
    chart: {
        name:    "my-chart"
        repoURL: "oci://my-chart-repository"
        version: "x.x.x"
    }
    crds: allowUpgrade: true
    values: {
      foo: "bar"
    }
    patches: [
      #deployment & {
        apiVersion: "apps/v1"
        kind: "Deployment"
        metadata: {
          name:      "deployment-from-chart"
          namespace: ns.content.metadata.name
        }
        spec: {
          replicas: 2 @ignore(conflict)
        }
      },
    ]
}
Noticed the @ignore(conflict) build attribute at line 32?
Patches can also be used to "flag" manifest fields of Helm Chart templates.
Read more here: Conflict Management