Files
my-rook-config/Makefile
T
Joshua Hoblitt fa89038264 helm: add helm-unittest harness for the charts
The charts have no unit tests. CI runs ct lint plus a helm template and
kustomize build, which prove the charts render but never assert what
they render, so conditional template logic goes unverified.

Add helm-unittest, pinned and installed as a standalone binary, a
test.helm make target, and a Helm Unittests workflow that runs it. The
first suite covers the toolbox deployment: the image composed from the
toolbox and cephImage settings, the precedence of both over the older
toolbox.image setting, the hostNetwork branch driven by the cluster
network provider, and the revisionHistoryLimit guard.

The new job is a required check in .mergify.yml, alongside the existing
chart linting.

Suites live under tests/ in a chart and are excluded from the packaged
chart via .helmignore. The runner is invoked with --strict so that a
misspelled key fails the suite instead of silently rendering defaults.

Signed-off-by: Joshua Hoblitt <josh@hoblitt.com>
2026-07-29 10:40:43 -07:00

356 lines
11 KiB
Makefile

# Copyright 2016 The Rook Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Linux doesn't guarantee file ordering, so sort the files to make sure order is deterministic.
# And in order to handle file paths with spaces, it's easiest to read the file names into an array.
# Set locale `LC_ALL=C` because different OSes have different sort behavior;
# `C` sorting order is based on the byte values,
# Reference: https://blog.zhimingwang.org/macos-lc_collate-hunt
export LC_ALL=C
.PHONY: all
all: build
.DEFAULT_GOAL := all
# ====================================================================================
# Build Options
# Controller-gen version
# f284e2e8... is master ahead of v0.5.0 which has ability to generate embedded objectmeta in CRDs
CONTROLLER_GEN_VERSION=v0.19.0
CT_VERSION := v3.13.0
KUSTOMIZE_VERSION := v5.3.0
MARKDOWNLINT_IMAGE_VERSION := v0.22.0
SHELLCHECK_VERSION := v0.10.0
# For future updates,the SHA of the 'latest' tag can be obtained like this:
# podman inspect --format='{{index .RepoDigests 0}}' docker.io/cytopia/yamllint:latest
#
YAMLLINT_IMAGE_SHA ?= sha256:3e9eb827ab2b12a5ea5f49d4257bb3aca94bba9f1ba427c8bc7f2456385a5204
# include here and not earlier so that the version numbers are available
# where needed
include build/makelib/common.mk
include build/makelib/helm.mk
# Set GOBIN
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
else
GOBIN=$(shell go env GOBIN)
endif
# set the shell to bash in case some environments use sh
SHELL := /usr/bin/env bash
# Can be used or additional go build flags
BUILDFLAGS ?=
LDFLAGS ?=
# Required for go-ceph rgw/admin account APIs which are gated behind
# the ceph_preview build tag. Can be removed when go-ceph promotes
# the account API out of preview.
TAGS ?= ceph_preview
# turn on more verbose build
V ?= 0
ifeq ($(V),1)
LDFLAGS += -v -n
BUILDFLAGS += -x
MAKEFLAGS += VERBOSE=1
else
MAKEFLAGS += --no-print-directory
endif
# whether to generate debug information in binaries. this includes DWARF
# and symbol tables.
DEBUG ?= 0
ifeq ($(DEBUG),0)
LDFLAGS += -s -w
endif
# platforms
PLATFORMS ?= $(ALL_PLATFORMS)
# PLATFORMS_TO_BUILD_FOR controls for which platforms to build the rook binary for
PLATFORMS_TO_BUILD_FOR ?= linux_amd64 linux_arm64
SERVER_PLATFORMS := $(filter linux_%,$(PLATFORMS))
CLIENT_PLATFORMS := $(filter-out linux_%,$(PLATFORMS))
# server projects that we build on server platforms
SERVER_PACKAGES = $(GO_PROJECT)/cmd/rook
# tests packages that will be compiled into binaries
TEST_PACKAGES = $(GO_PROJECT)/tests/integration
CHECKMAKE=go run github.com/checkmake/checkmake/cmd/checkmake@v0.3.2
ACTIONLINT := go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.12
# the root go project
GO_PROJECT=github.com/rook/rook
# inject the version number into the golang version package using the -X linker flag
LDFLAGS += -X $(GO_PROJECT)/pkg/version.Version=$(VERSION)
# CGO_ENABLED value
CGO_ENABLED_VALUE=0
# ====================================================================================
# Setup projects
# setup go projects
GO_STATIC_PACKAGES=
ifneq ($(filter $(PLATFORM),$(CLIENT_PLATFORMS) $(SERVER_PLATFORMS)),)
GO_STATIC_PACKAGES += $(CLIENT_PACKAGES)
endif
ifneq ($(filter $(PLATFORM),$(SERVER_PLATFORMS)),)
GO_STATIC_PACKAGES += $(SERVER_PACKAGES)
endif
GO_BUILDFLAGS=$(BUILDFLAGS)
GO_LDFLAGS=$(LDFLAGS)
GO_TAGS=$(TAGS)
GO_TEST_PACKAGES=$(TEST_PACKAGES)
GO_TEST_FLAGS=$(TESTFLAGS)
GO_TEST_SUITE=$(SUITE)
GO_TEST_FILTER=$(TESTFILTER)
include build/makelib/golang.mk
# ====================================================================================
# Targets
.PHONY: build.version
build.version:
@mkdir -p $(OUTPUT_DIR)
@echo "$(VERSION)" > $(OUTPUT_DIR)/version
.PHONY: build.common
build.common: build.version helm.build mod.check crds.manifests gen.rbac
@$(MAKE) go.init
@$(MAKE) go.validate
@$(MAKE) -C images/ceph list-image
do.build.platform.%:
@$(MAKE) PLATFORM=$* go.build
.PHONY: do.build.parallel
do.build.parallel: $(foreach p,$(PLATFORMS_TO_BUILD_FOR), do.build.platform.$(p))
.PHONY: build
build: build.common ## Only build for linux platform
@$(MAKE) go.build PLATFORM=linux_$(GOARCH)
@$(MAKE) -C images PLATFORM=linux_$(GOARCH)
.PHONY: build.all
build.all: build.common ## Build source code for all platforms.
ifneq ($(GOHOSTARCH),amd64)
$(error cross platform image build only supported on amd64 host currently)
endif
@$(MAKE) do.build.parallel
@$(MAKE) -C images build.all
.PHONY: install
install: build.common
@$(MAKE) go.install
.PHONY: check
check: test ## Runs checks (unit tests)
.PHONY: test
test: ## Runs unit tests.
@$(MAKE) go.test.unit
test-integration: ## Runs integration tests.
@$(MAKE) go.test.integration
.PHONY: lint.vet
lint.vet: ## Runs lint checks on go sources.
@$(MAKE) go.init
@$(MAKE) go.vet
.PHONY: lint.fmt
lint.fmt: $(YQ) ## Check formatting of go sources.
@$(MAKE) go.fmt
fix.fmt: $(YQ) ## Reformatting of go sources.
@$(MAKE) go.fmt-fix
golangci-lint: $(YQ)
@$(MAKE) go.golangci-lint
.PHONY: lint.go
lint.go: lint.fmt lint.vet golangci-lint ## run various go linters
.PHONY: lint.markdown
lint.markdown: check.container.runtime ## Check formatting of documentation sources
@$(MARKDOWNLINT) "Documentation/**/**.md" "#Documentation/Helm-Charts/**" --config .markdownlint-cli2.cjs
.PHONY: lint.markdown-links
lint.markdown-links: check.container.runtime
@$(DOCKERCMD) run --rm -v "$$PWD:/workspace" --entrypoint "/workspace/tests/scripts/check-markdown-links-internal.sh" ghcr.io/tcort/markdown-link-check:stable
.PHONY: fix.markdown
fix.markdown: check.container.runtime ## Check and fix formatting of documentation sources
@$(MARKDOWNLINT) "Documentation/**/**.md" "#Documentation/Helm-Charts/**" --fix --config .markdownlint-cli2.cjs
.PHONY: lint.yaml
lint.yaml: check.container.runtime ## lint yaml files
$(YAMLLINT) -c .yamllint deploy/examples/ --no-warnings
.PHONY: lint.helm
lint.helm: $(HELM) $(KUSTOMIZE) ## Check the helm charts
@ln -sf "$(notdir $(HELM))" "$(dir $(HELM))/helm"
PATH="$(dir $(HELM)):$$PATH" $(CT) lint --charts=./deploy/charts/rook-ceph,./deploy/charts/rook-ceph-cluster --validate-yaml=false --validate-maintainers=false --validate-chart-schema=false
$(HELM) -n rook-ceph template deploy/charts/rook-ceph > templated.yaml
$(HELM) -n rook-ceph template deploy/charts/rook-ceph-cluster >> templated.yaml
echo 'resources: [templated.yaml]' > kustomization.yaml
$(KUSTOMIZE) build >/dev/null
rm templated.yaml kustomization.yaml
.PHONY: test.helm
test.helm: $(HELM_UNITTEST) ## Run the helm chart unit tests
$(HELM_UNITTEST) --strict $(addprefix $(HELM_CHARTS_DIR)/,$(HELM_CHARTS))
.PHONY: lint.quick
lint.quick: lint.yaml lint.shell lint.make lint.go lint.helm lint.markdown ## run some (faster) linters
.PHONY: lint
lint: lint.quick lint.python ## Run various linters
.PHONY: lint.python
lint.python: ## lint python scripts
pylint $(shell find $(ROOT_DIR) -name '*.py') -E
.PHONY: lint.make
lint.make: ## lint the Makefile
@$(CHECKMAKE) Makefile
.PHONY: lint.shell
lint.shell: | $(SHELLCHECK) ## lint shell scripts
$(SHELLCHECK) --severity=warning --format=gcc --shell=bash $(shell find $(ROOT_DIR) -type f -name '*.sh') build/reset build/sed-in-place
.PHONY: lint.workflows
lint.workflows: ## lint the GitHub workflow files
@echo "linting GitHub workflows..."
@$(ACTIONLINT) -color
@echo "workflows are good."
.PHONY: gen.codegen
gen.codegen: codegen
.PHONY: codegen
codegen: ${CODE_GENERATOR} ## Run code generators.
@build/codegen/codegen.sh
.PHONY: mod.check
mod.check: go.mod.check ## Check if any go modules changed.
.PHONY: mod.update
mod.update: go.mod.update ## Update all go modules.
.PHONY: clean
clean: ## Remove all files that are created by building.
@$(MAKE) helm.dependency.clean
@$(MAKE) go.mod.clean
@$(MAKE) -C images clean
@rm -fr $(OUTPUT_DIR) $(WORK_DIR)
.PHONY: distclean
distclean: clean ## Remove all files that are created by building or configuring.
@rm -fr $(CACHE_DIR)
.PHONY: prune
prune: ## Prune cached artifacts.
@$(MAKE) -C images prune
.PHONY: gen.crds
gen.crds: crds.manifests crds.docs
.PHONY: crds.manifests
crds.manifests: $(CONTROLLER_GEN) $(YQ)
@echo Updating CRD manifests
@build/crds/build-crds.sh $(CONTROLLER_GEN) $(YQ)
.PHONY: crds.docs
crds.docs: ## Build the documentation for CRDs
@# default behavior: generate unless user sets SKIP_GEN_CRD_DOCS=true
@SKIP_GEN_CRD_DOCS=$(SKIP_GEN_CRD_DOCS) GOBIN=$(GOBIN) build/crds/generate-crd-docs.sh
.PHONY: crds
crds: crds.manifests crds.docs
.PHONY: gen.rbac
gen.rbac: gen-rbac
.PHONY: gen-rbac
gen-rbac: $(HELM) $(YQ) helm.dependency.build ## Generate RBAC from Helm charts
@# output only stdout to the file; stderr for debugging should keep going to stderr
HELM=$(HELM) ./build/rbac/gen-common.sh
.PHONY: gen.docs
gen.docs: docs ## generate docs
.PHONY: docs
docs: helm-docs ## generate documentation
.PHONY: gen.helm-docs
gen.helm-docs: helm-docs
helm-docs: $(HELM_DOCS) ## Use helm-docs to generate documentation from helm charts
$(HELM_DOCS) -c deploy/charts/rook-ceph \
-o ../../../Documentation/Helm-Charts/operator-chart.md \
-t ../../../Documentation/Helm-Charts/operator-chart.gotmpl.md \
-t ../../../Documentation/Helm-Charts/_templates.gotmpl
$(HELM_DOCS) -c deploy/charts/rook-ceph-cluster \
-o ../../../Documentation/Helm-Charts/ceph-cluster-chart.md \
-t ../../../Documentation/Helm-Charts/ceph-cluster-chart.gotmpl.md \
-t ../../../Documentation/Helm-Charts/_templates.gotmpl
docs-preview: ## Preview the documentation through mkdocs
mkdocs serve
docs-build: ## Build the documentation to the `site/` directory
mkdocs build --strict
.PHONY: gen.crd-docs
gen.crd-docs: generate-docs-crds
.PHONY: generate-docs-crds
generate-docs-crds: crds.docs ## Build the documentation for CRDs
.PHONY: generate
generate: gen.codegen gen.crds gen.rbac ## Update all generated files (code, manifests, charts, and docs).
# ====================================================================================
# Help
# available options:
define HELPTEXT
DEBUG Whether to generate debug symbols. Default is 0.
PLATFORM The platform to build.
SUITE The test suite to run.
TESTFILTER Tests to run in a suite.
VERSION The version information compiled into binaries.
The default is obtained from git.
V Set to 1 enable verbose build. Default is 0.
endef
export HELPTEXT
.PHONY: help
help: ## Show this help menu.
@echo "Usage: make [TARGET ...]"
@echo ""
@grep --no-filename -E '^[a-zA-Z_%-. ]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
@echo ""
@echo "available options:"
@echo "$$HELPTEXT"