Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🌱 (ci): Add GH action to validate generated helm charts for tutorials #4472

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions .github/workflows/test-helm-book.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Helm Docs Tutorials

on:
push:
paths:
akagami-harsh marked this conversation as resolved.
Show resolved Hide resolved
- "docs/book/src/cronjob-tutorial/testdata/project/**"
- "docs/book/src/getting-started/testdata/project/**"
- "docs/book/src/multiversion-tutorial/testdata/project/**"
- ".github/workflows/test-helm-book.yml"
pull_request:
paths:
- "docs/book/src/cronjob-tutorial/testdata/project/** "
- "docs/book/src/getting-started/testdata/project/**"
- "docs/book/src/multiversion-tutorial/testdata/project/**"
- ".github/workflows/test-helm-book.yml"

jobs:
akagami-harsh marked this conversation as resolved.
Show resolved Hide resolved
helm-test:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
folder: [
"docs/book/src/getting-started/testdata/project",
"docs/book/src/cronjob-tutorial/testdata/project",
"docs/book/src/multiversion-tutorial/testdata/project"
]
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Set project name
id: project
run: echo "name=$(basename ${{ matrix.folder }})" >> $GITHUB_OUTPUT

- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Install the latest version of kind
run: |
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

- name: Verify kind installation
run: kind version

- name: Create kind cluster
run: kind create cluster

- name: Prepare project
run: |
cd ${{ matrix.folder }}
go mod tidy
make docker-build IMG=${{ steps.project.outputs.name}}:v0.1.0
kind load docker-image ${{ steps.project.outputs.name}}:v0.1.0

- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

- name: Verify Helm installation
run: helm version

- name: Lint Helm chart
run: |
helm lint ${{ matrix.folder }}/dist/chart

- name: Install Prometheus Operator CRDs
run: |
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus-crds prometheus-community/prometheus-operator-crds

- name: Install cert-manager via Helm
run: |
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true

- name: Wait for cert-manager to be ready
run: |
kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager
kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-cainjector
kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-webhook

- name: Render Helm chart
run: |
helm template ${{ matrix.folder }}/dist/chart --namespace=${{ steps.project.outputs.name }}-system

- name: Install Helm chart
run: |
helm install my-release ${{ matrix.folder }}/dist/chart --create-namespace --namespace ${{ steps.project.outputs.name}}-system

- name: Check Helm release status
run: |
helm status my-release --namespace ${{ steps.project.outputs.name}}-system

9 changes: 8 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,16 @@ generate-docs: ## Update/generate the docs
./hack/docs/generate.sh

.PHONY: generate-charts
generate-charts: build ## Re-generate the helm chart testdata only
generate-charts: build ## Re-generate the helm chart testdata and docs samples
rm -rf testdata/project-v4-with-plugins/dist/chart
rm -rf docs/book/src/getting-started/testdata/project/dist/chart
rm -rf docs/book/src/cronjob-tutorial/testdata/project/dist/chart
rm -rf docs/book/src/multiversion-tutorial/testdata/project/dist/chart

(cd testdata/project-v4-with-plugins && ../../bin/kubebuilder edit --plugins=helm/v1-alpha)
akagami-harsh marked this conversation as resolved.
Show resolved Hide resolved
(cd docs/book/src/getting-started/testdata/project && ../../../../../../bin/kubebuilder edit --plugins=helm/v1-alpha)
(cd docs/book/src/cronjob-tutorial/testdata/project && ../../../../../../bin/kubebuilder edit --plugins=helm/v1-alpha)
(cd docs/book/src/multiversion-tutorial/testdata/project && ../../../../../../bin/kubebuilder edit --plugins=helm/v1-alpha)
akagami-harsh marked this conversation as resolved.
Show resolved Hide resolved

.PHONY: check-docs
check-docs: ## Run the script to ensure that the docs are updated
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Test Chart

on:
push:
pull_request:

jobs:
test-e2e:
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Install the latest version of kind
run: |
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

- name: Verify kind installation
run: kind version

- name: Create kind cluster
run: kind create cluster

- name: Prepare project
run: |
go mod tidy
make docker-build IMG=project:v0.1.0
kind load docker-image project:v0.1.0

- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

- name: Verify Helm installation
run: helm version

- name: Lint Helm Chart
run: |
helm lint ./dist/chart

# TODO: Uncomment if cert-manager is enabled
# - name: Install cert-manager via Helm
# run: |
# helm repo add jetstack https://charts.jetstack.io
# helm repo update
# helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
#
# - name: Wait for cert-manager to be ready
# run: |
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-cainjector
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-webhook

# TODO: Uncomment if Prometheus is enabled
# - name: Install Prometheus Operator CRDs
# run: |
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update
# helm install prometheus-crds prometheus-community/prometheus-operator-crds
#
# - name: Install Prometheus via Helm
# run: |
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update
# helm install prometheus prometheus-community/prometheus --namespace monitoring --create-namespace
#
# - name: Wait for Prometheus to be ready
# run: |
# kubectl wait --namespace monitoring --for=condition=available --timeout=300s deployment/prometheus-server

- name: Install Helm chart for project
run: |
helm install my-release ./dist/chart --create-namespace --namespace project-system

- name: Check Helm release status
run: |
helm status my-release --namespace project-system

# TODO: Uncomment if prometheus.enabled is set to true to confirm that the ServiceMonitor gets created
# - name: Check Presence of ServiceMonitor
# run: |
# kubectl wait --namespace project-system --for=jsonpath='{.kind}'=ServiceMonitor servicemonitor/project-controller-manager-metrics-monitor
2 changes: 2 additions & 0 deletions docs/book/src/cronjob-tutorial/testdata/project/PROJECT
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
domain: tutorial.kubebuilder.io
layout:
- go.kubebuilder.io/v4
plugins:
helm.kubebuilder.io/v1-alpha: {}
projectName: project
repo: tutorial.kubebuilder.io/project
resources:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Patterns to ignore when building Helm packages.
# Operating system files
.DS_Store

# Version control directories
.git/
.gitignore
.bzr/
.hg/
.hgignore
.svn/

# Backup and temporary files
*.swp
*.tmp
*.bak
*.orig
*~

# IDE and editor-related files
.idea/
.vscode/

# Helm chart artifacts
dist/chart/*.tgz
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
apiVersion: v2
name: project
description: A Helm chart to distribute the project project
type: application
version: 0.1.0
appVersion: "0.1.0"
icon: "https://example.com/icon.png"
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{{- define "chart.name" -}}
{{- if .Chart }}
{{- if .Chart.Name }}
{{- .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- else if .Values.nameOverride }}
{{ .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
project
{{- end }}
{{- else }}
project
{{- end }}
{{- end }}


{{- define "chart.labels" -}}
{{- if .Chart.AppVersion -}}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
{{- if .Chart.Version }}
helm.sh/chart: {{ .Chart.Version | quote }}
{{- end }}
app.kubernetes.io/name: {{ include "chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}


{{- define "chart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}


{{- define "chart.hasMutatingWebhooks" -}}
{{- $hasMutating := false }}
{{- range . }}
{{- if eq .type "mutating" }}
$hasMutating = true }}{{- end }}
{{- end }}
{{ $hasMutating }}}}{{- end }}


{{- define "chart.hasValidatingWebhooks" -}}
{{- $hasValidating := false }}
{{- range . }}
{{- if eq .type "validating" }}
$hasValidating = true }}{{- end }}
{{- end }}
{{ $hasValidating }}}}{{- end }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{{- if .Values.certmanager.enable }}
# Self-signed Issuer
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
labels:
{{- include "chart.labels" . | nindent 4 }}
name: selfsigned-issuer
namespace: {{ .Release.Namespace }}
spec:
selfSigned: {}
{{- if .Values.webhook.enable }}
---
# Certificate for the webhook
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
annotations:
{{- if .Values.crd.keep }}
"helm.sh/resource-policy": keep
{{- end }}
name: serving-cert
namespace: {{ .Release.Namespace }}
labels:
{{- include "chart.labels" . | nindent 4 }}
spec:
dnsNames:
- project.{{ .Release.Namespace }}.svc
- project.{{ .Release.Namespace }}.svc.cluster.local
- project-webhook-service.{{ .Release.Namespace }}.svc
issuerRef:
kind: Issuer
name: selfsigned-issuer
secretName: webhook-server-cert
{{- end }}
{{- if .Values.metrics.enable }}
---
# Certificate for the metrics
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
annotations:
{{- if .Values.crd.keep }}
"helm.sh/resource-policy": keep
{{- end }}
labels:
{{- include "chart.labels" . | nindent 4 }}
name: metrics-certs
namespace: {{ .Release.Namespace }}
spec:
dnsNames:
- project.{{ .Release.Namespace }}.svc
- project.{{ .Release.Namespace }}.svc.cluster.local
- project-metrics-service.{{ .Release.Namespace }}.svc
issuerRef:
kind: Issuer
name: selfsigned-issuer
secretName: metrics-server-cert
{{- end }}
{{- end }}
Loading