Skip to content

Commit 731c311

Browse files
committed
feat(helm): app versioned charts
Signed-off-by: Marc Nuri <[email protected]>
1 parent d8cd090 commit 731c311

File tree

4 files changed

+167
-126
lines changed

4 files changed

+167
-126
lines changed

.github/workflows/helm-release.yaml

Lines changed: 0 additions & 125 deletions
This file was deleted.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: Release Helm Chart
2+
3+
on:
4+
push:
5+
tags:
6+
- '*'
7+
workflow_dispatch:
8+
9+
env:
10+
HELM_REGISTRY_USER: ${{ github.actor }}
11+
HELM_REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
12+
HELM_REGISTRY_ORG: ${{ github.repository_owner }}
13+
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.ref }}
16+
cancel-in-progress: false
17+
18+
jobs:
19+
release:
20+
name: Release Helm Chart
21+
if: github.repository == 'containers/kubernetes-mcp-server'
22+
runs-on: ubuntu-latest
23+
permissions:
24+
contents: read
25+
packages: write
26+
27+
steps:
28+
- name: Checkout
29+
uses: actions/checkout@v6
30+
31+
- name: Install Helm
32+
uses: azure/setup-helm@v4
33+
with:
34+
version: '3.19.2'
35+
36+
- name: Extract versions
37+
id: versions
38+
run: |
39+
CHART_VERSION=$(make helm-print-chart-version)
40+
echo "chart_version=$CHART_VERSION" >> $GITHUB_OUTPUT
41+
echo "Chart version: $CHART_VERSION"
42+
43+
APP_VERSION=$(make print-git-tag-version)
44+
echo "app_version=$APP_VERSION" >> $GITHUB_OUTPUT
45+
echo "App version: $APP_VERSION"
46+
47+
HELM_REGISTRY=$(make helm-print-registry)
48+
echo "helm_registry=$HELM_REGISTRY" >> $GITHUB_OUTPUT
49+
echo "Helm registry: $HELM_REGISTRY"
50+
51+
CHART_NAME=$(make helm-print-chart-name)
52+
echo "chart_name=$CHART_NAME" >> $GITHUB_OUTPUT
53+
echo "Chart name: $CHART_NAME"
54+
55+
- name: Validate with kubeconform
56+
run: make helm-validate
57+
58+
- name: Login to Helm registry
59+
run: |
60+
echo "${{ secrets.GITHUB_TOKEN }}" | helm registry login ${{ steps.versions.outputs.helm_registry }} -u ${{ github.actor }} --password-stdin
61+
62+
- name: Package Helm chart and push chart to OCI registry
63+
run: make helm-push
64+
65+
- name: Verify chart installation
66+
run: make helm-verify
67+
68+
- name: Generate release summary
69+
run: |
70+
echo "## Helm Chart Release Summary" >> $GITHUB_STEP_SUMMARY
71+
echo "" >> $GITHUB_STEP_SUMMARY
72+
echo "- **Chart Name:** ${{ steps.versions.outputs.chart_name }}" >> $GITHUB_STEP_SUMMARY
73+
echo "- **Chart Version:** ${{ steps.versions.outputs.chart_version }}" >> $GITHUB_STEP_SUMMARY
74+
echo "- **App Version:** ${{ steps.versions.outputs.app_version }}" >> $GITHUB_STEP_SUMMARY
75+
echo "- **Registry:** ${{ steps.versions.outputs.helm_registry }}/${{ github.repository_owner }}/charts" >> $GITHUB_STEP_SUMMARY
76+
echo "" >> $GITHUB_STEP_SUMMARY
77+
echo "### Installation Command" >> $GITHUB_STEP_SUMMARY
78+
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
79+
echo "helm install ${{ steps.versions.outputs.chart_name }} oci://${{ steps.versions.outputs.helm_registry }}/${{ github.repository_owner }}/charts/${{ steps.versions.outputs.chart_name }} --set ingress.host=<hostname> --version ${{ steps.versions.outputs.chart_version }} --create-namespace --namespace mcp-system" >> $GITHUB_STEP_SUMMARY
80+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY

Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ format: ## Format the code
7070
tidy: ## Tidy up the go modules
7171
go mod tidy
7272

73+
# Download and install golangci-lint if not already installed
7374
.PHONY: golangci-lint
74-
golangci-lint: ## Download and install golangci-lint if not already installed
75+
golangci-lint:
7576
@[ -f $(GOLANGCI_LINT) ] || { \
7677
set -e ;\
7778
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell dirname $(GOLANGCI_LINT)) $(GOLANGCI_LINT_VERSION) ;\
@@ -122,5 +123,9 @@ local-env-setup: ## Setup complete local development environment with Kind clust
122123
local-env-teardown: ## Tear down the local Kind cluster
123124
$(MAKE) kind-delete-cluster
124125

126+
.PHONY: print-git-tag-version
127+
print-git-tag-version: ## Print the GIT_TAG_VERSION
128+
@echo $(GIT_TAG_VERSION)
129+
125130
# Include build configuration files
126131
-include build/*.mk

build/helm.mk

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
##@ Helm Chart build targets
2+
3+
HELM_CHART_DIR = ./charts/kubernetes-mcp-server
4+
HELM_CHART_VERSION = $(shell grep '^version:' $(HELM_CHART_DIR)/Chart.yaml | awk '{print $$2}')
5+
HELM_PACKAGE_DIR = ./_output/helm-packages
6+
HELM_REGISTRY ?= ghcr.io
7+
HELM_REGISTRY_ORG ?= containers
8+
HELM_CHART_NAME = kubernetes-mcp-server
9+
10+
KUBECONFORM = $(shell pwd)/_output/tools/bin/kubeconform
11+
KUBECONFORM_VERSION ?= latest
12+
13+
CLEAN_TARGETS += $(HELM_PACKAGE_DIR)
14+
15+
.PHONY: helm-lint
16+
helm-lint: ## Lint the Helm chart
17+
helm lint $(HELM_CHART_DIR)
18+
19+
.PHONY: helm-template
20+
helm-template: ## Render Helm chart templates (dry run)
21+
helm template test-release $(HELM_CHART_DIR) --set ingress.host=localhost --debug
22+
23+
# Download and install kubeconform if not already installed
24+
.PHONY: kubeconform
25+
kubeconform:
26+
@[ -f $(KUBECONFORM) ] || { \
27+
set -e ;\
28+
echo "Installing kubeconform to $(KUBECONFORM)..." ;\
29+
mkdir -p $(shell dirname $(KUBECONFORM)) ;\
30+
TMPDIR=$$(mktemp -d) ;\
31+
curl -L https://github.com/yannh/kubeconform/releases/$(KUBECONFORM_VERSION)/download/kubeconform-$(shell uname -s | tr '[:upper:]' '[:lower:]')-$(shell uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz | tar xz -C $$TMPDIR ;\
32+
mv $$TMPDIR/kubeconform $(KUBECONFORM) ;\
33+
rm -rf $$TMPDIR ;\
34+
}
35+
36+
.PHONY: helm-validate
37+
helm-validate: kubeconform ## Validate Helm chart manifests with kubeconform
38+
helm template test-release $(HELM_CHART_DIR) --set ingress.host=localhost | $(KUBECONFORM) -strict -summary -ignore-missing-schemas
39+
40+
.PHONY: helm-package
41+
helm-package: helm-lint helm-template ## Package the Helm chart
42+
@mkdir -p $(HELM_PACKAGE_DIR)
43+
@echo "Updating appVersion to $(GIT_TAG_VERSION)..."
44+
@sed -i.bak "s/appVersion: .*/appVersion: \"$(GIT_TAG_VERSION)\"/" $(HELM_CHART_DIR)/Chart.yaml
45+
@echo "Updated Chart.yaml:"
46+
@cat $(HELM_CHART_DIR)/Chart.yaml
47+
helm package $(HELM_CHART_DIR) --destination $(HELM_PACKAGE_DIR)
48+
@mv $(HELM_CHART_DIR)/Chart.yaml.bak $(HELM_CHART_DIR)/Chart.yaml
49+
50+
.PHONY: helm-push
51+
helm-push: helm-package ## Push Helm chart to OCI registry (assumes helm registry login has been performed)
52+
@chart_package=$$(ls $(HELM_PACKAGE_DIR)/$(HELM_CHART_NAME)-*.tgz 2>/dev/null | head -n 1); \
53+
if [ -z "$$chart_package" ]; then echo "Error: No chart package found in $(HELM_PACKAGE_DIR)"; exit 1; fi; \
54+
echo "Pushing chart package: $$chart_package"; \
55+
helm push "$$chart_package" oci://$(HELM_REGISTRY)/$(HELM_REGISTRY_ORG)/charts
56+
57+
58+
.PHONY: helm-verify
59+
helm-verify: ## Verify chart installation from OCI registry
60+
@echo "Testing chart template rendering from OCI registry..."
61+
helm template test-install oci://$(HELM_REGISTRY)/$(HELM_REGISTRY_ORG)/charts/$(HELM_CHART_NAME) \
62+
--set ingress.host=localhost --version $(HELM_CHART_VERSION) --debug
63+
64+
.PHONY: helm-publish
65+
helm-publish: helm-package helm-push helm-verify ## Package, push, and verify Helm chart release
66+
@echo "Helm chart $(HELM_CHART_NAME) version $(HELM_CHART_VERSION) published successfully"
67+
68+
# Print the Helm chart version
69+
.PHONY: helm-print-chart-version
70+
helm-print-chart-version:
71+
@echo $(HELM_CHART_VERSION)
72+
73+
# Print the Helm chart name
74+
.PHONY: helm-print-chart-name
75+
helm-print-chart-name:
76+
@echo $(HELM_CHART_NAME)
77+
78+
# Print the Helm registry
79+
.PHONY: helm-print-registry
80+
helm-print-registry:
81+
@echo $(HELM_REGISTRY)

0 commit comments

Comments
 (0)