Files
OpenTofuPlayground/Makefile
Lutz Finsterle b2a3e00452
Some checks failed
Deploy / Update Proxmox Dev VMs / Detect changed Proxmox tfvars (push) Successful in 26s
Test / Static Analysis (push) Failing after 25s
Test / Unit Tests — Docker Stack (push) Has been skipped
Test / Unit Tests — K8s Stack (push) Has been skipped
Deploy / Update Proxmox Dev VMs / Provision ${{ matrix.tfvars }} (push) Failing after 32s
Deploy / Update Proxmox Dev VMs / Destroy ${{ matrix.tfvars }} (push) Has been skipped
Test / Integration Test — K8s (k3d) (push) Has been skipped
New Function: DEV VM
2026-03-20 10:06:05 +01:00

184 lines
8.6 KiB
Makefile

.PHONY: help validate fmt fmt-fix test-unit test-unit-docker test-unit-k8s \
test-unit-proxmox test-integration-docker test-integration-k8s test-all clean
TOFU ?= tofu
TFLINT ?= tflint
K3D ?= k3d
DOCKER ?= docker
# Names used for local integration test clusters / containers
TEST_K3D_CLUSTER ?= tofu-test
TEST_DOCKER_NET ?= tofu-test-net
TEST_APP_NAME ?= testapp
##─────────────────────────────────────────────────────────────────────────────
## help Show this message
##─────────────────────────────────────────────────────────────────────────────
help:
@grep -E '^##' Makefile | sed 's/^## //'
##─────────────────────────────────────────────────────────────────────────────
## Static analysis (no infrastructure required)
##─────────────────────────────────────────────────────────────────────────────
## validate Run 'tofu validate' on all stacks
validate:
@echo "── Validating Docker stack ──"
$(TOFU) init -backend=false -input=false > /dev/null
$(TOFU) validate
@echo "── Validating K8s stack ──"
cd k8s && $(TOFU) init -backend=false -input=false > /dev/null
cd k8s && $(TOFU) validate
@echo "── Validating Proxmox stack ──"
cd proxmox && $(TOFU) init -backend=false -input=false > /dev/null
cd proxmox && $(TOFU) validate
@echo "All configurations valid."
## fmt-check Check HCL formatting in all .tf files
fmt-check:
$(TOFU) fmt -check -recursive
## fmt-fix Auto-format all .tf files
fmt-fix:
$(TOFU) fmt -recursive
## lint Run tflint on both stacks (requires tflint in PATH)
lint:
@echo "── Linting Docker stack ──"
$(TFLINT) --recursive
@echo "── Linting K8s stack ──"
cd k8s && $(TFLINT) --recursive
##─────────────────────────────────────────────────────────────────────────────
## Unit tests (mocked providers — no real infrastructure)
##─────────────────────────────────────────────────────────────────────────────
## test-unit-docker Run Docker stack unit tests (tofu test)
test-unit-docker:
@echo "── Docker stack unit tests ──"
$(TOFU) init -backend=false -input=false > /dev/null
$(TOFU) test
## test-unit-k8s Run K8s stack unit tests (tofu test)
test-unit-k8s:
@echo "── K8s stack unit tests ──"
cd k8s && $(TOFU) init -backend=false -input=false > /dev/null
cd k8s && $(TOFU) test
## test-unit-proxmox Run Proxmox stack unit tests (tofu test)
test-unit-proxmox:
@echo "── Proxmox stack unit tests ──"
cd proxmox && $(TOFU) init -backend=false -input=false > /dev/null
cd proxmox && $(TOFU) test
## test-unit Run all unit tests
test-unit: test-unit-docker test-unit-k8s test-unit-proxmox
##─────────────────────────────────────────────────────────────────────────────
## Integration tests (real local infrastructure)
##─────────────────────────────────────────────────────────────────────────────
## test-integration-docker Deploy to local Docker, verify, destroy
## Requires: Docker running locally with SSH to localhost
## SSH key: set DOCKER_TEST_KEY env var (default: ~/.ssh/id_ed25519)
DOCKER_TEST_KEY ?= $(HOME)/.ssh/id_ed25519
DOCKER_TEST_USER ?= $(shell whoami)
test-integration-docker:
@echo "── Docker integration test ──"
@echo "Using local Docker socket via SSH to localhost"
$(TOFU) init -backend=false -input=false > /dev/null
$(TOFU) workspace select $(TEST_APP_NAME) 2>/dev/null || $(TOFU) workspace new $(TEST_APP_NAME)
$(TOFU) apply -auto-approve \
-var="ssh_host=localhost" \
-var="ssh_user=$(DOCKER_TEST_USER)" \
-var="ssh_key_path=$(DOCKER_TEST_KEY)" \
-var="app_name=$(TEST_APP_NAME)" \
-var="environment=dev" \
-var="openresty_source_type=bind_mount" \
-var="openresty_remote_config_path=/tmp/tofu-test-openresty" \
-var="openresty_external_port=18080" \
-var="db_name=testdb" \
-var="db_user=testuser" \
-var="db_password=testpass"
@echo "── Verifying containers are running ──"
$(DOCKER) ps --filter "name=$(TEST_APP_NAME)" --format "table {{.Names}}\t{{.Status}}"
@echo "── Tearing down ──"
$(TOFU) destroy -auto-approve \
-var="ssh_host=localhost" \
-var="ssh_user=$(DOCKER_TEST_USER)" \
-var="ssh_key_path=$(DOCKER_TEST_KEY)" \
-var="app_name=$(TEST_APP_NAME)" \
-var="environment=dev" \
-var="openresty_source_type=bind_mount" \
-var="openresty_remote_config_path=/tmp/tofu-test-openresty" \
-var="openresty_external_port=18080" \
-var="db_name=testdb" \
-var="db_user=testuser" \
-var="db_password=testpass"
$(TOFU) workspace select default
$(TOFU) workspace delete $(TEST_APP_NAME)
@echo "Docker integration test passed."
## test-integration-k8s Deploy to local k3d cluster, verify, destroy
## Requires: k3d and kubectl in PATH
test-integration-k8s: _k3d-cluster-create
@echo "── K8s integration test ──"
$(K3D) kubeconfig get $(TEST_K3D_CLUSTER) > /tmp/test-kubeconfig
chmod 600 /tmp/test-kubeconfig
cd k8s && $(TOFU) init -backend=false -input=false > /dev/null
cd k8s && $(TOFU) workspace select $(TEST_APP_NAME) 2>/dev/null \
|| $(TOFU) workspace new $(TEST_APP_NAME)
cd k8s && $(TOFU) apply -auto-approve \
-var-file="apps/example-nodered.tfvars" \
-var="kubeconfig_path=/tmp/test-kubeconfig" \
-var="app_name=$(TEST_APP_NAME)" \
-var="rabbitmq_password=testpass" \
-var="loki_auth_token="
@echo "── Verifying K8s resources ──"
kubectl --kubeconfig /tmp/test-kubeconfig get all -n $(TEST_APP_NAME)
@echo "── Tearing down ──"
cd k8s && $(TOFU) destroy -auto-approve \
-var-file="apps/example-nodered.tfvars" \
-var="kubeconfig_path=/tmp/test-kubeconfig" \
-var="app_name=$(TEST_APP_NAME)" \
-var="rabbitmq_password=testpass" \
-var="loki_auth_token="
cd k8s && $(TOFU) workspace select default
cd k8s && $(TOFU) workspace delete $(TEST_APP_NAME)
$(MAKE) _k3d-cluster-delete
rm -f /tmp/test-kubeconfig
@echo "K8s integration test passed."
_k3d-cluster-create:
@if ! $(K3D) cluster list | grep -q $(TEST_K3D_CLUSTER); then \
echo "Creating k3d cluster '$(TEST_K3D_CLUSTER)'..."; \
$(K3D) cluster create $(TEST_K3D_CLUSTER) \
--agents 1 \
--k3s-arg "--disable=traefik@server:0" \
--wait; \
echo "Installing Traefik CRDs..."; \
kubectl --kubeconfig $$($(K3D) kubeconfig get $(TEST_K3D_CLUSTER)) \
apply -f https://raw.githubusercontent.com/traefik/traefik/v2.11/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml; \
else \
echo "k3d cluster '$(TEST_K3D_CLUSTER)' already exists."; \
fi
_k3d-cluster-delete:
$(K3D) cluster delete $(TEST_K3D_CLUSTER) 2>/dev/null || true
##─────────────────────────────────────────────────────────────────────────────
## Combined targets
##─────────────────────────────────────────────────────────────────────────────
## test-all Run validate + fmt-check + unit tests
test-all: validate fmt-check test-unit
@echo "All tests passed."
## clean Remove local .terraform dirs and state files
clean:
find . -name '.terraform' -type d -exec rm -rf {} + 2>/dev/null || true
find . -name 'terraform.tfstate*' -type f -delete 2>/dev/null || true
find . -name '.terraform.lock.hcl' -type f -delete 2>/dev/null || true
@echo "Cleaned."