build: add image builder and image variants
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
SHELL := /bin/bash
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
ROOT_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
|
||||
OUTPUT_DIR := $(ROOT_DIR)/output
|
||||
TMP_DIR := $(ROOT_DIR)/tmp
|
||||
VERSION ?=
|
||||
LIBVIRT_URI ?= qemu:///system
|
||||
LIBVIRT_POOL ?= default
|
||||
LIBVIRT_NETWORK ?= default
|
||||
TERRAFORM_DIR := $(ROOT_DIR)/terraform
|
||||
TERRAFORM_LOCK_TIMEOUT ?= 60s
|
||||
VM_NAME ?= parch-cloud
|
||||
SSH_KEY ?= $(HOME)/.ssh/id_ed25519
|
||||
TERRAFORM_VARS = -var="libvirt_uri=$(LIBVIRT_URI)" -var="libvirt_pool=$(LIBVIRT_POOL)" -var="libvirt_network=$(LIBVIRT_NETWORK)" \
|
||||
-var="vm_name=$(VM_NAME)" -var="ssh_public_key_path=$(SSH_KEY).pub"
|
||||
|
||||
.PHONY: help check-deps install-deps install-qemu-deps build build-cloud list verify info clean clean-output clean-tmp \
|
||||
qemu-check qemu-init qemu-plan qemu-up qemu-down qemu-ip qemu-ssh
|
||||
|
||||
help:
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*##/ {printf " %-16s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
||||
|
||||
check-deps:
|
||||
@missing=0; \
|
||||
for command in pacstrap arch-chroot pacman gpgconf losetup mount mountpoint umount \
|
||||
truncate sgdisk mkfs.fat mkfs.btrfs udevadm blockdev fstrim qemu-img sha256sum; do \
|
||||
if ! command -v "$$command" >/dev/null 2>&1; then \
|
||||
echo "Missing command: $$command"; \
|
||||
missing=1; \
|
||||
fi; \
|
||||
done; \
|
||||
if (( missing )); then \
|
||||
echo "Install the build dependencies with: make install-deps"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "Build commands are available."
|
||||
|
||||
install-deps:
|
||||
@sudo pacman -S --needed --noconfirm arch-install-scripts btrfs-progs dosfstools gptfdisk gnupg qemu-img systemd util-linux
|
||||
|
||||
install-qemu-deps:
|
||||
@sudo pacman -S --needed --noconfirm qemu-full libvirt terraform
|
||||
|
||||
build: check-deps
|
||||
@if [[ $$(id -u) -eq 0 ]]; then \
|
||||
cd "$(ROOT_DIR)" && ./build.sh "$(VERSION)"; \
|
||||
else \
|
||||
cd "$(ROOT_DIR)" && sudo ./build.sh "$(VERSION)"; \
|
||||
fi
|
||||
|
||||
build-cloud: check-deps
|
||||
@if [[ $$(id -u) -eq 0 ]]; then \
|
||||
cd "$(ROOT_DIR)" && ./build.sh "$(VERSION)" cloud-image; \
|
||||
else \
|
||||
cd "$(ROOT_DIR)" && sudo ./build.sh "$(VERSION)" cloud-image; \
|
||||
fi
|
||||
|
||||
list:
|
||||
@if [[ -d "$(OUTPUT_DIR)" ]] && compgen -G "$(OUTPUT_DIR)/*.qcow2" >/dev/null; then \
|
||||
find "$(OUTPUT_DIR)" -maxdepth 1 -type f -name '*.qcow2' -printf '%f\t%s bytes\n'; \
|
||||
else \
|
||||
echo "No QCOW2 images found. Run 'make build' first."; \
|
||||
fi
|
||||
|
||||
verify:
|
||||
@if [[ ! -d "$(OUTPUT_DIR)" ]] || ! compgen -G "$(OUTPUT_DIR)/*.SHA256" >/dev/null; then \
|
||||
echo "No checksum files found in $(OUTPUT_DIR)."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
cd "$(OUTPUT_DIR)"; \
|
||||
for checksum in *.SHA256; do sha256sum --check "$$checksum"; done
|
||||
|
||||
info: check-deps
|
||||
@if [[ ! -d "$(OUTPUT_DIR)" ]] || ! compgen -G "$(OUTPUT_DIR)/*.qcow2" >/dev/null; then \
|
||||
echo "No QCOW2 images found in $(OUTPUT_DIR)."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
for image in "$(OUTPUT_DIR)"/*.qcow2; do qemu-img info "$$image"; done
|
||||
|
||||
clean-output:
|
||||
@rm -rf -- "$(OUTPUT_DIR)"
|
||||
@echo "Removed $(OUTPUT_DIR)."
|
||||
|
||||
clean-tmp:
|
||||
@rm -rf -- "$(TMP_DIR)"
|
||||
@echo "Removed $(TMP_DIR)."
|
||||
|
||||
clean: clean-output clean-tmp
|
||||
|
||||
qemu-check:
|
||||
@command -v terraform >/dev/null || { echo "Missing command: terraform"; exit 1; }
|
||||
@command -v virsh >/dev/null || { echo "Missing command: virsh (install libvirt)"; exit 1; }
|
||||
@virsh -c "$(LIBVIRT_URI)" pool-info "$(LIBVIRT_POOL)" >/dev/null || { echo "Cannot access libvirt pool '$(LIBVIRT_POOL)' through $(LIBVIRT_URI)."; exit 1; }
|
||||
@virsh -c "$(LIBVIRT_URI)" net-info "$(LIBVIRT_NETWORK)" >/dev/null || { echo "Libvirt network '$(LIBVIRT_NETWORK)' is unavailable."; exit 1; }
|
||||
|
||||
qemu-init:
|
||||
@terraform -chdir="$(TERRAFORM_DIR)" init -input=false
|
||||
|
||||
qemu-plan: qemu-check
|
||||
@terraform -chdir="$(TERRAFORM_DIR)" plan -input=false -lock-timeout=$(TERRAFORM_LOCK_TIMEOUT) $(TERRAFORM_VARS)
|
||||
|
||||
qemu-up: qemu-check
|
||||
@if ! compgen -G "$(OUTPUT_DIR)/Parch-Linux-x86_64-cloudimg-*.qcow2" >/dev/null; then $(MAKE) build-cloud; fi
|
||||
@terraform -chdir="$(TERRAFORM_DIR)" init -input=false
|
||||
@terraform -chdir="$(TERRAFORM_DIR)" apply -auto-approve -input=false -lock-timeout=$(TERRAFORM_LOCK_TIMEOUT) $(TERRAFORM_VARS)
|
||||
|
||||
qemu-down: qemu-check
|
||||
@terraform -chdir="$(TERRAFORM_DIR)" destroy -auto-approve -input=false -lock-timeout=$(TERRAFORM_LOCK_TIMEOUT) $(TERRAFORM_VARS)
|
||||
|
||||
qemu-ip: qemu-check
|
||||
@leases="$$(virsh -c "$(LIBVIRT_URI)" net-dhcp-leases "$(LIBVIRT_NETWORK)")"; \
|
||||
if printf '%s\n' "$$leases" | grep -Eq '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'; then \
|
||||
printf '%s\n' "$$leases"; \
|
||||
else \
|
||||
printf '%s\n' "No DHCP lease yet. Start the VM with 'make qemu-up', then run 'make qemu-ip' again."; \
|
||||
fi
|
||||
|
||||
qemu-ssh: qemu-check
|
||||
@ip="$$(virsh -c "$(LIBVIRT_URI)" domifaddr "$(VM_NAME)" --source lease | awk '/ipv4/ {sub(/\/.*/, "", $$4); print $$4; exit}')"; \
|
||||
if [[ -z "$$ip" ]]; then echo "No IP for $(VM_NAME) yet. Run 'make qemu-up', wait for boot, then retry."; exit 1; fi; \
|
||||
exec ssh -o IdentitiesOnly=yes -i "$(SSH_KEY)" arch@"$$ip"
|
||||
Reference in New Issue
Block a user