whatnow.site/makefile
2025-03-23 18:58:44 -04:00

112 lines
3.5 KiB
Makefile

##@ General
# Credit the the Woodpecker-CI team for this awesome help script
.PHONY: help
help: ## Display this help
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
install-tools: ## Install development tools
@hash yamllint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
pip install yamllint; \
fi ; \
hash ansible-lint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
pip install ansible-lint; \
fi
# Initiliaze git pre-commit hook to ensure vault.yaml is encrypted
# Credit to Nick Busey from HomelabOS
# https://gitlab.com/NickBusey/HomelabOS/-/issues/355
define _gitinit
if [ -d .git/ ]; then
rm .git/hooks/pre-commit > /dev/null 2>&1
cat <<EOT >> .git/hooks/pre-commit
# git pre-commit
printf "Checking that vault is encrypted...\n"
if ( cat ansible/vars/vault.yaml | grep -q "\$ANSIBLE_VAULT;" ); then
printf "\033[0;32mVault Encrypted. Safe to commit.\033[0m\n"
else
printf "\033[0;31mVault not encrypted! Run 'make encrypt' and try again.\033[0m\n"
exit 1
fi
printf "Running yamllint...\n"
hash yamllint > /dev/null 2>&1; if [ \$\$ -ne 0 ]; then yamllint . || exit 1; fi
printf "Running ansible-lint..."
hash ansible-lint > /dev/null 2>&1; if [ \$\$ -ne 0 ]; then ansible-lint || exit 1; fi
EOT
chmod +x .git/hooks/pre-commit
else
printf "\033[1;31mError\033[0;31m: Either the repository failed to download, or a new repository has not yet been initialized.\033[0m\n"
fi
echo Set git pre-commit hook
endef
export gitinit = $(value _gitinit)
.PHONY: init
init: install-tools reqs ## Initialize Git hooks, requirements, and dev tools
@ eval "$$gitinit"
##@ Requirements
reqs: ## Install Ansible Galaxy requirements
ansible-galaxy install -r ansible/roles/requirements.yaml
forcereqs: ## Force install Ansible Galaxy requirements
ansible-galaxy install -r ansible/roles/requirements.yaml --force
##@ Vault
encrypt: ## Encrypt the Ansible vault
ansible-vault encrypt ansible/vars/vault.yaml
decrypt: ## Decrypt the Ansible vault
ansible-vault decrypt ansible/vars/vault.yaml
##@ Test
.PHONY: lint
lint: install-tools ## Lint yaml and Ansible
yamllint ansible
ansible-lint
# If the first argument is "check"...
ifeq (check,$(firstword $(MAKECMDGOALS)))
# use the rest as arguments for "check"
RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# ...and turn them into do-nothing targets
$(eval $(RUN_ARGS):;@:)
endif
.PHONY: check
check: lint ## Plan OpenTofu and run Ansible playbook in check mode
#tofu plan
ansible-playbook -b ansible/run.yaml --check --diff $(RUN_ARGS)
.PHONY: serve
serve: ## Build and serve a preview of the Hugo site locally
hugo -s src serve --noHTTPCache --disableFastRender &
##@ Run
# If the first argument is "run"...
ifeq (run,$(firstword $(MAKECMDGOALS)))
# use the rest as arguments for "run"
RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# ...and turn them into do-nothing targets
$(eval $(RUN_ARGS):;@:)
endif
.PHONY: run
run: lint ## Apply OpenTofu and run Ansible playbook
#tofu apply
ansible-playbook -b ansible/run.yaml $(RUN_ARGS)
# If the first argument is "upgrade"...
ifeq (upgrade,$(firstword $(MAKECMDGOALS)))
# use the rest as arguments for "upgrade"
RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# ...and turn them into do-nothing targets
$(eval $(RUN_ARGS):;@:)
endif
.PHONY: upgrade
upgrade: ## Update and Upgrade apt packages
ansible-playbook -b ansible/upgrade.yaml $(RUN_ARGS)