# ## # # Run 'make help' for a summary # # ## # Binaries BIN := func BIN_DARWIN_AMD64 ?= $(BIN)_darwin_amd64 BIN_DARWIN_ARM64 ?= $(BIN)_darwin_arm64 BIN_LINUX_AMD64 ?= $(BIN)_linux_amd64 BIN_LINUX_ARM64 ?= $(BIN)_linux_arm64 BIN_LINUX_PPC64LE ?= $(BIN)_linux_ppc64le BIN_LINUX_S390X ?= $(BIN)_linux_s390x BIN_WINDOWS ?= $(BIN)_windows_amd64.exe # Version # A verbose version is built into the binary including a date stamp, git commit # hash and the version tag of the current commit (semver) if it exists. # If the current commit does not have a semver tag, 'tip' is used, unless there # is a TAG environment variable. Precedence is git tag, environment variable, 'tip' DATE := $(shell date -u +"%Y%m%dT%H%M%SZ") HASH := $(shell git rev-parse --short HEAD 2>/dev/null) VTAG := $(shell git tag --points-at HEAD | head -1) VTAG := $(shell [ -z $(VTAG) ] && echo $(ETAG) || echo $(VTAG)) VERS ?= $(shell [ -z $(VTAG) ] && echo 'tip' || echo $(VTAG) ) LDFLAGS := "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" # All Code prerequisites, including generated files, etc. CODE := $(shell find . -name '*.go') generate/zz_filesystem_generated.go go.mod schema/func_yaml-schema.json TEMPLATES := $(shell find templates -name '*' -type f) .PHONY: test docs # Default Targets all: build docs # Help Text # Headings: lines with `##$` comment prefix # Targets: printed if their line includes a `##` comment help: @echo 'Usage: make ... ' @echo '' @echo 'Available targets are:' @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) ############### ##@ Development ############### build: $(BIN) ## (default) Build binary for current OS $(BIN): $(CODE) env CGO_ENABLED=0 go build -ldflags $(LDFLAGS) ./cmd/$(BIN) test: $(CODE) ## Run core unit tests go test -race -cover -coverprofile=coverage.txt ./... check: bin/golangci-lint ## Check code quality (lint) ./bin/golangci-lint run --timeout 300s cd test && ../bin/golangci-lint run --timeout 300s bin/golangci-lint: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./bin v1.49.0 .PHONY: clean_templates clean_templates: # Removing temporary template files @rm -f templates/go/cloudevents/go.sum @rm -f templates/go/http/go.sum @rm -rf templates/node/cloudevents/node_modules @rm -rf templates/node/http/node_modules @rm -rf templates/python/cloudevents/__pycache__ @rm -rf templates/python/http/__pycache__ @rm -rf templates/typescript/cloudevents/node_modules @rm -rf templates/typescript/http/node_modules @rm -rf templates/typescript/cloudevents/build @rm -rf templates/typescript/http/build @rm -rf templates/rust/cloudevents/target @rm -rf templates/rust/http/target @rm -rf templates/quarkus/cloudevents/target @rm -rf templates/quarkus/http/target @rm -rf templates/springboot/cloudevents/target @rm -rf templates/springboot/http/target @rm -f templates/**/.DS_Store .PHONY: generate/zz_filesystem_generated.go generate/zz_filesystem_generated.go: clean_templates go generate pkg/functions/templates_embedded.go .PHONY: clean clean: clean_templates ## Remove generated artifacts such as binaries and schemas rm -f $(BIN) $(BIN_WINDOWS) $(BIN_LINUX) $(BIN_DARWIN_AMD64) $(BIN_DARWIN_ARM64) rm -f schema/func_yaml-schema.json rm -f coverage.txt docs: # Generating command reference doc go run docs/generator/main.go ############# ##@ Templates ############# test-templates: test-go test-node test-python test-quarkus test-springboot test-rust test-typescript ## Run all template tests test-go: ## Test Go templates cd templates/go/cloudevents && go mod tidy && go test cd templates/go/http && go mod tidy && go test test-node: ## Test Node templates cd templates/node/cloudevents && npm ci && npm test && rm -rf node_modules cd templates/node/http && npm ci && npm test && rm -rf node_modules test-python: ## Test Python templates cd templates/python/cloudevents && pip3 install -r requirements.txt && python3 test_func.py && rm -rf __pycache__ cd templates/python/http && python3 test_func.py && rm -rf __pycache__ test-quarkus: ## Test Quarkus templates cd templates/quarkus/cloudevents && mvn test && mvn clean cd templates/quarkus/http && mvn test && mvn clean test-springboot: ## Test Spring Boot templates cd templates/springboot/cloudevents && mvn test && mvn clean cd templates/springboot/http && mvn test && mvn clean test-rust: ## Test Rust templates cd templates/rust/cloudevents && cargo test && cargo clean cd templates/rust/http && cargo test && cargo clean test-typescript: ## Test Typescript templates cd templates/typescript/cloudevents && npm ci && npm test && rm -rf node_modules build cd templates/typescript/http && npm ci && npm test && rm -rf node_modules build ################### ##@ Extended Testing (cluster required) ################### test-integration: ## Run integration tests using an available cluster. go test -tags integration -timeout 30m --coverprofile=coverage.txt ./... -v .PHONY: func-instrumented func-instrumented: ## Func binary that is instrumented for e2e tests env CGO_ENABLED=1 go build -ldflags $(LDFLAGS) -cover -o func ./cmd/func test-e2e: func-instrumented ## Run end-to-end tests using an available cluster. ./test/e2e_extended_tests.sh test-e2e-runtime: func-instrumented ## Run end-to-end lifecycle tests using an available cluster for a single runtime. ./test/e2e_lifecycle_tests.sh $(runtime) test-e2e-on-cluster: func-instrumented ## Run end-to-end on-cluster build tests using an available cluster. ./test/e2e_oncluster_tests.sh ###################### ##@ Release Artifacts ###################### cross-platform: darwin-arm64 darwin-amd64 linux-amd64 linux-arm64 linux-ppc64le linux-s390x windows ## Build all distributable (cross-platform) binaries darwin-arm64: $(BIN_DARWIN_ARM64) ## Build for mac M1 $(BIN_DARWIN_ARM64): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o $(BIN_DARWIN_ARM64) -ldflags $(LDFLAGS) ./cmd/$(BIN) darwin-amd64: $(BIN_DARWIN_AMD64) ## Build for Darwin (macOS) $(BIN_DARWIN_AMD64): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o $(BIN_DARWIN_AMD64) -ldflags $(LDFLAGS) ./cmd/$(BIN) linux-amd64: $(BIN_LINUX_AMD64) ## Build for Linux amd64 $(BIN_LINUX_AMD64): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $(BIN_LINUX_AMD64) -ldflags $(LDFLAGS) ./cmd/$(BIN) linux-arm64: $(BIN_LINUX_ARM64) ## Build for Linux arm64 $(BIN_LINUX_ARM64): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o $(BIN_LINUX_ARM64) -ldflags $(LDFLAGS) ./cmd/$(BIN) linux-ppc64le: $(BIN_LINUX_PPC64LE) ## Build for Linux ppc64le $(BIN_LINUX_PPC64LE): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build -o $(BIN_LINUX_PPC64LE) -ldflags $(LDFLAGS) ./cmd/$(BIN) linux-s390x: $(BIN_LINUX_S390X) ## Build for Linux s390x $(BIN_LINUX_S390X): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=linux GOARCH=s390x go build -o $(BIN_LINUX_S390X) -ldflags $(LDFLAGS) ./cmd/$(BIN) windows: $(BIN_WINDOWS) ## Build for Windows $(BIN_WINDOWS): generate/zz_filesystem_generated.go env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o $(BIN_WINDOWS) -ldflags $(LDFLAGS) ./cmd/$(BIN) ###################### ##@ Schemas ###################### schema-generate: schema/func_yaml-schema.json ## Generate func.yaml schema schema/func_yaml-schema.json: pkg/functions/function.go pkg/functions/function_*.go go run schema/generator/main.go schema-check: ## Check that func.yaml schema is up-to-date mv schema/func_yaml-schema.json schema/func_yaml-schema-previous.json make schema-generate diff schema/func_yaml-schema.json schema/func_yaml-schema-previous.json ||\ (echo "\n\nFunction config schema 'schema/func_yaml-schema.json' is obsolete, please run 'make schema-generate'.\n\n"; rm -rf schema/func_yaml-schema-previous.json; exit 1) rm -rf schema/func_yaml-schema-previous.json