186 lines
5.8 KiB
Makefile
186 lines
5.8 KiB
Makefile
PACKER_VERSION ?= 1.2.0
|
|
ANNOUNCE ?= http://10.2.2.1:6969/announce
|
|
WEBSEED ?= http://10.2.2.1
|
|
|
|
DOCKER_IMAGE ?= labsync-builder
|
|
|
|
CWD=$(abspath $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))))
|
|
|
|
COMPRESSION_LEVEL ?= 5
|
|
|
|
ANSIBLE_LIMIT ?= qemumachine
|
|
ANSIBLE_TAGS ?=
|
|
|
|
qemu_ifname_br = brlabsync
|
|
qemu_ifname_tap = taplabsync
|
|
qemu_hostname = qemumachine
|
|
qemu_host_ip = 10.2.2.1
|
|
qemu_network = 10.2.2.0
|
|
qemu_netmask = 24
|
|
qemu_vm_ip = 10.2.2.10
|
|
qemu_disk = tmp/qemu-disk.img
|
|
qemu_target ?= debian-stretch
|
|
qemu_kernel = $(qemu_target).linux
|
|
qemu_torrent = $(qemu_target).torrent
|
|
qemu_initramfs = $(shell \
|
|
if [ -e images/$(qemu_target).initramfs.dev ] && [ `date -r images/$(qemu_target).initramfs.dev +%s` -gt `date -r images/$(qemu_target).initramfs +%s` ]; then \
|
|
echo "$(qemu_target).initramfs.dev"; \
|
|
else \
|
|
echo "$(qemu_target).initramfs"; \
|
|
fi \
|
|
)
|
|
ci_environment=$(shell env | sed -n 's/^\(CI_.*\)=.*/-e \1/p')
|
|
|
|
.PHONY: default
|
|
default: dockerimg images/debian-stretch.squashfs
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
rm -f images/*
|
|
rm -rf tmp
|
|
|
|
.PHONY: dockerimg
|
|
dockerimg:
|
|
docker build --pull -t "$(DOCKER_IMAGE)" --cache-from "$(DOCKER_IMAGE)" --build-arg "PACKER_VERSION=$(PACKER_VERSION)" docker
|
|
|
|
images:
|
|
[ ! -d "$@" ] && mkdir "$@"
|
|
touch "$@"
|
|
|
|
images/debian-stretch.squashfs: images
|
|
docker run \
|
|
--rm \
|
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
-v "${PWD}/packer:/workdir" \
|
|
-v "${PWD}/images:/images" \
|
|
-e "user=`id -u`" \
|
|
-e "group=`id -g`" \
|
|
-e "ANNOUNCE=$(ANNOUNCE)" \
|
|
-e "WEBSEED=$(WEBSEED)" \
|
|
-e "COMPRESSION_LEVEL=$(COMPRESSION_LEVEL)" \
|
|
$(ci_environment) \
|
|
"$(DOCKER_IMAGE)" \
|
|
debian-stretch
|
|
|
|
images/debian-stretch.torrent: images
|
|
docker run \
|
|
--rm \
|
|
-v "${PWD}/images:/images" \
|
|
-e "user=`id -u`" \
|
|
-e "group=`id -g`" \
|
|
-e "ANNOUNCE=$(ANNOUNCE)" \
|
|
-e "WEBSEED=$(WEBSEED)" \
|
|
-e "TASK=torrent" \
|
|
"$(DOCKER_IMAGE)" \
|
|
debian-stretch
|
|
|
|
.PHONY: ansible
|
|
ansible:
|
|
docker run \
|
|
--rm \
|
|
-v "${PWD}/packer/ansible:/ansible" \
|
|
-e "user=`id -u`" \
|
|
-e "group=`id -g`" \
|
|
-e "ANNOUNCE=$(ANNOUNCE)" \
|
|
-e "WEBSEED=$(WEBSEED)" \
|
|
-e "TASK=ansible" \
|
|
-v "${SSH_AUTH_SOCK}:/var/run/ssh_auth_sock" \
|
|
-e "SSH_AUTH_SOCK=/var/run/ssh_auth_sock" \
|
|
"$(DOCKER_IMAGE)" \
|
|
-i inventories \
|
|
$(if $(ANSIBLE_TAGS),-t $(ANSIBLE_TAGS),) \
|
|
-l $(ANSIBLE_LIMIT) \
|
|
--ssh-extra-args="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
|
|
playbook.yml
|
|
|
|
# updates the initramfs
|
|
# only used for development
|
|
images/debian-stretch.initramfs.dev: tmp/initramfs-extracted/debian-stretch packer/initramfs/labsync
|
|
cp packer/initramfs/labsync tmp/initramfs-extracted/debian-stretch/scripts/labsync
|
|
(cd tmp/initramfs-extracted/debian-stretch && find . | cpio -H newc -o | gzip > $(CWD)/images/debian-stretch.initramfs.dev)
|
|
|
|
tmp:
|
|
[ ! -d "$@" ] && mkdir "$@" || true
|
|
|
|
tmp/initramfs-extracted/debian-stretch: images/debian-stretch.initramfs
|
|
rm -rf tmp/initramfs-extracted/debian-stretch
|
|
mkdir -p tmp/initramfs-extracted/debian-stretch
|
|
(cd tmp/initramfs-extracted/debian-stretch && zcat "$(CWD)/images/debian-stretch.initramfs" | cpio -i)
|
|
touch tmp/initramfs-extracted/debian-stretch
|
|
|
|
$(qemu_disk): tmp
|
|
qemu-img create "$@" 20G
|
|
|
|
tmp/netboot.tar.gz: tmp
|
|
wget -c -O "$@" https://cdn-aws.deb.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/netboot.tar.gz
|
|
touch "$@"
|
|
|
|
tmp/tftproot: tmp/netboot.tar.gz
|
|
[ ! -d tmp/tftproot ] && mkdir tmp/tftproot || true
|
|
tar -xzf "$<" -C "$@"
|
|
rm tmp/tftproot/debian-installer/amd64/boot-screens/txt.cfg
|
|
|
|
tmp/tftproot/images: tmp/tftproot
|
|
ln -s ../../images tmp/tftproot/images
|
|
|
|
tmp/tftproot/debian-installer/amd64/boot-screens/txt.cfg: txt.cfg
|
|
ln -s ../../../../../txt.cfg "$@"
|
|
|
|
|
|
/sys/devices/virtual/net/$(qemu_ifname_tap):
|
|
sudo ip tuntap add dev $(qemu_ifname_tap) mode tap user $(USER)
|
|
|
|
/sys/devices/virtual/net/$(qemu_ifname_br):
|
|
sudo brctl addbr $(qemu_ifname_br)
|
|
|
|
/sys/devices/virtual/net/$(qemu_ifname_br)/brif/$(qemu_ifname_tap): /sys/devices/virtual/net/$(qemu_ifname_tap) /sys/devices/virtual/net/$(qemu_ifname_br)
|
|
sudo brctl addif $(qemu_ifname_br) $(qemu_ifname_tap)
|
|
|
|
.PHONY: docker-services
|
|
docker-services: qemu-network
|
|
docker-compose up -d
|
|
|
|
.PHONY: qemu-network
|
|
qemu-network: /sys/devices/virtual/net/$(qemu_ifname_br)/brif/$(qemu_ifname_tap)
|
|
if ! ip addr show dev $(qemu_ifname_br) | grep -F "$(qemu_host_ip)/$(qemu_netmask)"; then \
|
|
sudo ip addr add $(qemu_host_ip)/$(qemu_netmask) dev $(qemu_ifname_br); \
|
|
fi
|
|
sudo ip link set $(qemu_ifname_tap) up
|
|
sudo ip link set $(qemu_ifname_br) up
|
|
if ! sudo iptables -t nat -L POSTROUTING | grep -q "$(qemu_network)/$(qemu_netmask)"; then \
|
|
sudo iptables -t nat -A POSTROUTING -s $(qemu_network)/$(qemu_netmask) ! -o $(qemu_ifname_br) -j MASQUERADE; \
|
|
fi
|
|
|
|
.PHONY: qemu
|
|
qemu: qemu-network $(qemu_disk) docker-services
|
|
qemu-system-x86_64 \
|
|
-kernel "images/$(qemu_kernel)" \
|
|
-initrd "images/$(qemu_initramfs)" \
|
|
-drive format=raw,file="$(qemu_disk)" \
|
|
-append "boot=labsync labsync_disk=sda labsync_partsize_boot=512 labsync_torrent=http://10.2.2.1/$(qemu_torrent) quiet vga=792 ip=$(qemu_vm_ip):::255.255.255.0:$(qemu_hostname):ens3:off labsync_wait=pause" \
|
|
-enable-kvm \
|
|
-m 1G \
|
|
-net nic \
|
|
-net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no \
|
|
-boot order=n
|
|
|
|
.PHONY: qemu-localboot
|
|
qemu-localboot: qemu-network $(qemu_disk)
|
|
qemu-system-x86_64 \
|
|
-drive format=raw,file="$(qemu_disk)" \
|
|
-enable-kvm \
|
|
-m 1G \
|
|
-net nic \
|
|
-net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no \
|
|
-boot order=c
|
|
|
|
.PHONY: qemu-tftp docker-services
|
|
qemu-tftp: tmp/tftproot tmp/tftproot/images tmp/tftproot/debian-installer/amd64/boot-screens/txt.cfg qemu-network $(qemu_disk)
|
|
qemu-system-x86_64 \
|
|
-net nic -net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no \
|
|
-net nic -net user,tftp=.,bootfile=/tmp/tftproot/pxelinux.0 \
|
|
-enable-kvm \
|
|
-m 1G \
|
|
-drive format=raw,file="$(qemu_disk)" \
|
|
-boot n
|
|
|