name: publish-helm description: Generate a Nebius OCI Helm chart publication flow by creating a chart-local CHANGELOG.md, publish-helm.sh, and .github/workflows/<project>-chart-publish.yml with tag-driven releases and public pull verification.
Publish Helm
Create a repeatable Helm chart publication setup for charts released to Nebius Container Registry as OCI artifacts.
Use This Skill For
- Adding a release process to a new Helm chart.
- Standardizing Helm chart publication across chart directories in this repo.
- Enforcing a two-step release flow:
--prepon branch- merge the prep branch to
main --publishon clean syncedmain
Output Contract
Generate exactly these artifacts for the target chart:
<chart_dir>/CHANGELOG.md<chart_dir>/publish-helm.sh.github/workflows/<project-name>-chart-publish.yml
Inputs to Collect
project_name(for workflow filename/name)project_tag_prefix(for examplenccl-test-chart)main_branch(defaultmain)chart_dir(for examplehelm-charts/nccl-test)chart_name(the name fromChart.yaml)publish_environment(GitHub Actions environment name)
The templates assume the GitHub Actions environment exposes these Nebius variables and secret:
- Variables:
NB_REGION_ID,NB_REGISTRY_ID,NB_PROJECT_ID,NB_SERVICE_ACCOUNT_ID,NB_SERVICE_ACCOUNT_PUBLIC_KEY_ID - Optional variables:
NB_TENANT_ID,NB_REGISTRY_NAME - Secret:
NB_SERVICE_ACCOUNT_PRIVATE_KEY
Workflow
- Copy templates from
assets/into the target chart and workflow paths. - Replace placeholders:
__PROJECT_NAME____PROJECT_TAG_PREFIX____MAIN_BRANCH____CHART_DIR____CHART_NAME____PUBLISH_ENVIRONMENT__
- Keep
publish-helm.shexecutable. - Validate:
bash -n <chart_dir>/publish-helm.sh- YAML parse for
.github/workflows/<project-name>-chart-publish.yml helm lint <chart_dir>helm template smoke <chart_dir> --namespace <chart_name> >/dev/null
- Document runtime usage in the chart README:
./publish-helm.sh --prep X.Y.Z./publish-helm.sh --publish X.Y.Z- note that the prep step updates both the chart-local changelog and
Chart.yaml - note that the publish step only tags; CI does the OCI package/push work
Guardrails
- Keep one canonical release path. Do not add a second manual-release flow
beside
publish-helm.shplus the tag-driven workflow. --prepshould start from a strictly clean worktree, including untracked files, so the release-prep commit stays isolated.--prepshould fail before editing files if the target tag already exists locally or onorigin.--prepshould update the chart-localCHANGELOG.mdandChart.yamltogether, then validate the chart before committing.--publishonly creates and pushes the tag; no content edits.--publishmust fail ifChart.yamldoes not already declare versionX.Y.Z, or if the target release section is missing or empty.- The workflow should publish from the pushed tag only. Do not keep a separate workflow-dispatch release version override unless the user explicitly asks for one.
- The workflow should verify the published chart is anonymously pullable when the target registry is intended to be public.
- Workflow/job check names should include
project_nameto avoid ambiguous checks across monorepos.
Resources
assets/CHANGELOG.md.templateassets/publish-helm.sh.templateassets/project-name-chart-publish.yml.template