diff --git a/.github/workflows/pkr-bld-hyperv-x64.yml b/.github/workflows/pkr-bld-hyperv-x64.yml index e05b8c58f..457665362 100644 --- a/.github/workflows/pkr-bld-hyperv-x64.yml +++ b/.github/workflows/pkr-bld-hyperv-x64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-parallels-arm64.yml b/.github/workflows/pkr-bld-parallels-arm64.yml index d57a3e4cf..c67d11752 100644 --- a/.github/workflows/pkr-bld-parallels-arm64.yml +++ b/.github/workflows/pkr-bld-parallels-arm64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 @@ -36,11 +37,11 @@ jobs: steps: - name: Checkout uses: actions/checkout@main -# - name: Setup Packer -# if: steps.verify-changed-files.outputs.files_changed == 'true' -# uses: hashicorp/setup-packer@main -# with: -# version: latest + # - name: Setup Packer + # if: steps.verify-changed-files.outputs.files_changed == 'true' + # uses: hashicorp/setup-packer@main + # with: + # version: latest - name: Bento build run: | eval "$(chef shell-init bash)" diff --git a/.github/workflows/pkr-bld-parallels-x64.yml b/.github/workflows/pkr-bld-parallels-x64.yml index 1969684e1..2ca5a163d 100644 --- a/.github/workflows/pkr-bld-parallels-x64.yml +++ b/.github/workflows/pkr-bld-parallels-x64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 @@ -36,10 +37,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@main -# - name: Setup Packer -# uses: hashicorp/setup-packer@main -# with: -# version: latest + # - name: Setup Packer + # uses: hashicorp/setup-packer@main + # with: + # version: latest - name: Bento build run: | eval "$(chef shell-init bash)" diff --git a/.github/workflows/pkr-bld-qemu-arm64.yml b/.github/workflows/pkr-bld-qemu-arm64.yml index 4e93a7ce1..a7e1e2a91 100644 --- a/.github/workflows/pkr-bld-qemu-arm64.yml +++ b/.github/workflows/pkr-bld-qemu-arm64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-qemu-x64.yml b/.github/workflows/pkr-bld-qemu-x64.yml index 3b2e8b988..11cc31af9 100644 --- a/.github/workflows/pkr-bld-qemu-x64.yml +++ b/.github/workflows/pkr-bld-qemu-x64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-virtualbox-arm64.yml b/.github/workflows/pkr-bld-virtualbox-arm64.yml index ceafc7825..b3955889d 100644 --- a/.github/workflows/pkr-bld-virtualbox-arm64.yml +++ b/.github/workflows/pkr-bld-virtualbox-arm64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-virtualbox-x64.yml b/.github/workflows/pkr-bld-virtualbox-x64.yml index 13eba58ad..7d90538d1 100644 --- a/.github/workflows/pkr-bld-virtualbox-x64.yml +++ b/.github/workflows/pkr-bld-virtualbox-x64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-vmware-arm64.yml b/.github/workflows/pkr-bld-vmware-arm64.yml index 7be4caf84..ac199a047 100644 --- a/.github/workflows/pkr-bld-vmware-arm64.yml +++ b/.github/workflows/pkr-bld-vmware-arm64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/pkr-bld-vmware-x64.yml b/.github/workflows/pkr-bld-vmware-x64.yml index 911d40fa7..bb21a193b 100644 --- a/.github/workflows/pkr-bld-vmware-x64.yml +++ b/.github/workflows/pkr-bld-vmware-x64.yml @@ -15,6 +15,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 diff --git a/.github/workflows/test-pkr-bld-parallels.yml b/.github/workflows/test-pkr-bld-parallels.yml index 0c660185e..50c9862c1 100644 --- a/.github/workflows/test-pkr-bld-parallels.yml +++ b/.github/workflows/test-pkr-bld-parallels.yml @@ -14,6 +14,7 @@ jobs: os: - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - debian-11 - debian-12 diff --git a/CHANGELOG.md b/CHANGELOG.md index 690d919fe..4d72463a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Markdown table generated at |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| | almalinux-8 | | x | na | x | na | x | na | x | na | | almalinux-9 | | x | x | x | | x | x | x | x | +| alpine-3.21 | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TDB | TDB | | amazonlinux-2023 | | | | | | x | | | | | centos-stream-9 | | x | x | x | | x | x | x | x | | centos-stream-10 | | x | x | x | | x | x | x | x | diff --git a/alpine-3.21-aarch64-virtualbox-build.sh b/alpine-3.21-aarch64-virtualbox-build.sh new file mode 100755 index 000000000..68b8e337c --- /dev/null +++ b/alpine-3.21-aarch64-virtualbox-build.sh @@ -0,0 +1,55 @@ +#!/bin/sh + +if [ ! -z "${BASH_VERSION+x}" ]; then + this_file="${BASH_SOURCE[0]}" + set -o pipefail +elif [ ! -z "${ZSH_VERSION+x}" ]; then + this_file="${(%):-%x}" + set -o pipefail +else + this_file="${0}" +fi +set -feu + +export ARCH="${ARCH:-aarch64}" +export VERSION="${VERSION:-3.21.2}" +export VERSION_MAJOR_MINOR="${VERSION%.*}" + +# Getting script directory location +SCRIPT_RELATIVE_DIR=$(dirname -- "${this_file}") +cd -- "$SCRIPT_RELATIVE_DIR" || exit + +# set tmp dir for files +ALPDIR="$(pwd)/builds/build_files/alpine-${VERSION}-${ARCH}-virtualbox" +[ -d "$ALPDIR" ] || mkdir -p -- "$ALPDIR" + +echo "Cleaning up old files" +set +f +rm -f -- "$ALPDIR"/*.iso "$ALPDIR"/*.ovf "$ALPDIR"/*.vmdk "$ALPDIR"/*.vdi + +NAME='generic_alpine-'"${VERSION}"'-'"${ARCH}"'-uefi-tiny-r0' +export QCOW="${NAME}"'.qcow2' +export VMDK="${NAME}"'.vmdk' +export VDI="${NAME}"'.vdi' + +if [ ! -f "$ALPDIR"'/'"${QCOW}" ]; then + wget -q -O -- "$ALPDIR"'/'"${QCOW}" 'https://dl-cdn.alpinelinux.org/alpine/v'"${VERSION_MAJOR_MINOR}"'/releases/cloud/'"${QCOW}" +fi + +if [ ! -f "${VMDK}" ]; then + qemu-img convert -f qcow2 -O vmdk -- "$ALPDIR"'/'"${QCOW}" "$ALPDIR"'/'"${VMDK}" # & +fi + +if [ ! -f "${VMDK}" ]; then + qemu-img convert -f qcow2 -O vdi -- "$ALPDIR"'/'"${QCOW}" "$ALPDIR"'/'"${VDI}" # & +fi + +wait + +echo "starting packer build of alpine ${VERSION} for ${ARCH}" +if bento build --vars 'ssh_timeout=60m' --vars vbox_source_path="$ALPDIR"/alpine_arm64.ovf,vbox_checksum=null "$(pwd)"/os_pkrvars/alpine/alpine-3.21-aarch64.pkrvars.hcl; then + echo "Cleaning up files" + rm -rf -- "$ALPDIR" +else + exit 1 +fi diff --git a/builds.yml b/builds.yml index 59ae5334a..6391bde7c 100644 --- a/builds.yml +++ b/builds.yml @@ -1,5 +1,5 @@ --- -vagrant_cloud_account: 'bento' +vagrant_cloud_account: "bento" default_architectures: - x86_64 @@ -9,6 +9,7 @@ public: - amazonlinux-2023 - almalinux-8 - almalinux-9 + - alpine-3.21 - centos-stream-9 - centos-stream-10 - debian-11 @@ -30,6 +31,7 @@ public: slugs: - almalinux-8 - almalinux-9 + - alpine-3.21 - debian-12 - debian-11 - fedora-latest @@ -51,6 +53,7 @@ do_not_build: - rhel - windows # - almalinux +# - alpine-3.21 # - centos # - debian # - fedora diff --git a/os_pkrvars/alpine/alpine-3.21-aarch64.pkrvars.hcl b/os_pkrvars/alpine/alpine-3.21-aarch64.pkrvars.hcl new file mode 100644 index 000000000..dd479c42f --- /dev/null +++ b/os_pkrvars/alpine/alpine-3.21-aarch64.pkrvars.hcl @@ -0,0 +1,10 @@ +os_name = "alpine" +os_version = "3.21" +os_arch = "aarch64" +iso_url = "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/aarch64/alpine-standard-3.21.3-aarch64.iso" +iso_checksum = "file:https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/aarch64/alpine-standard-3.21.3-aarch64.iso.sha256" +parallels_guest_os_type = "otherlinux" +vbox_guest_os_type = "ArchLinux_arm64" +vmware_guest_os_type = "otherlinux" +parallels_boot_wait = "0s" +boot_command = ["e inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/fedora/ks.cfg inst.repo=https://download.fedoraproject.org/pub/fedora/linux/releases/41/Server/aarch64/os/ "] diff --git a/os_pkrvars/alpine/alpine-3.21-x86_64.pkrvars.hcl b/os_pkrvars/alpine/alpine-3.21-x86_64.pkrvars.hcl new file mode 100644 index 000000000..18a3b1556 --- /dev/null +++ b/os_pkrvars/alpine/alpine-3.21-x86_64.pkrvars.hcl @@ -0,0 +1,9 @@ +os_name = "alpine" +os_version = "3.21" +os_arch = "x86_64" +iso_url = "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-standard-3.21.3-x86_64.iso" +iso_checksum = "file:https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-standard-3.21.3-x86_64.iso.sha256" +parallels_guest_os_type = "otherlinux" +vbox_guest_os_type = "ArchLinux_64" +vmware_guest_os_type = "otherlinux-64" +boot_command = ["e inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/fedora/ks.cfg inst.repo=https://download.fedoraproject.org/pub/fedora/linux/releases/41/Server/x86_64/os/ "] diff --git a/os_pkrvars/alpine/alpine-3_21-aarch64.pkrvars.hcl b/os_pkrvars/alpine/alpine-3_21-aarch64.pkrvars.hcl new file mode 100644 index 000000000..f1e3ff39b --- /dev/null +++ b/os_pkrvars/alpine/alpine-3_21-aarch64.pkrvars.hcl @@ -0,0 +1,21 @@ +os_name = "alpine" +os_version = "3_21" +os_arch = "aarch64" +iso_url = "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/aarch64/alpine-standard-3.21.3-aarch64.iso" +iso_checksum = "file:https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/aarch64/alpine-standard-3.21.3-aarch64.iso.sha256" +parallels_guest_os_type = "otherlinux" +vbox_guest_os_type = "ArchLinux_arm64" +vmware_guest_os_type = "otherlinux" +parallels_boot_wait = "0s" +boot_command = ["root", + "ifconfig eth0 up && udhcpc -i eth0", + "wget http://{{ .HTTPIP }}:{{ .HTTPPort }}/answers", + "setup-alpine -f answers", + "{{user `ssh_password`}}", + "{{user `ssh_password`}}", + "y", + "rc-service sshd stop", + "mount /dev/sda3 /mnt", + "echo 'PermitRootLogin yes' >> /mnt/etc/ssh/sshd_config", + "umount /mnt", + "reboot"] diff --git a/packer_templates/http/alpine/ks.cfg b/packer_templates/http/alpine/ks.cfg new file mode 100644 index 000000000..b8c66af4e --- /dev/null +++ b/packer_templates/http/alpine/ks.cfg @@ -0,0 +1,46 @@ +lang en_US.UTF-8 +keyboard --xlayouts='us' +network --bootproto=dhcp --noipv6 --onboot=on --device=eth0 +rootpw --plaintext vagrant +firewall --disabled +selinux --permissive +timezone UTC +bootloader --timeout=1 --location=mbr --append="net.ifnames=0 biosdevname=0" +text +skipx +zerombr +clearpart --all --initlabel +autopart --nohome --nolvm --noboot +firstboot --disabled +reboot --eject +user --name=vagrant --plaintext --password vagrant + +%packages +bzip2 +tar +wget +nfs-utils +net-tools +rsync +akms +%end + +%post +# sudo +echo 'Defaults:vagrant !requiretty' > /etc/sudoers.d/vagrant +echo '%vagrant ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/vagrant +chmod 440 /etc/sudoers.d/vagrant + +# Enable hyper-v daemons only if using hyper-v virtualization +if [ $(virt-what) == "hyperv" ]; then +apk add hvtools + +rc-service hv_fcopy_daemon start +rc-service hv_kvp_daemon start +rc-service hv_vss_daemon start + +rc-update add hv_fcopy_daemon +rc-update add hv_kvp_daemon +rc-update add hv_vss_daemon +fi +%end diff --git a/packer_templates/pkr-builder.pkr.hcl b/packer_templates/pkr-builder.pkr.hcl index 41a627197..ff708570a 100644 --- a/packer_templates/pkr-builder.pkr.hcl +++ b/packer_templates/pkr-builder.pkr.hcl @@ -121,17 +121,31 @@ locals { "${path.root}/scripts/fedora/real-tmp_fedora.sh", "${path.root}/scripts/fedora/cleanup_dnf.sh", "${path.root}/scripts/_common/minimize.sh" - ] : [ - "${path.root}/scripts/rhel/update_dnf.sh", - "${path.root}/scripts/_common/motd.sh", - "${path.root}/scripts/_common/sshd.sh", - "${path.root}/scripts/_common/vagrant.sh", - "${path.root}/scripts/_common/virtualbox.sh", - "${path.root}/scripts/_common/vmware.sh", - "${path.root}/scripts/_common/parallels.sh", - "${path.root}/scripts/rhel/cleanup_dnf.sh", - "${path.root}/scripts/_common/minimize.sh" - ] + ] : var.os_name == "alpine" ? [ + "${path.root}/scripts/alpine/networking_alpine.sh", + "${path.root}/scripts/alpine/update_apk.sh", + "${path.root}/scripts/_common/motd.sh", + "${path.root}/scripts/_common/sshd.sh", + "${path.root}/scripts/alpine/install-supporting-packages_alpine.sh", + "${path.root}/scripts/alpine/build-tools_alpine.sh", + "${path.root}/scripts/_common/virtualbox.sh", + "${path.root}/scripts/_common/vmware.sh", + "${path.root}/scripts/_common/parallels.sh", + "${path.root}/scripts/_common/vagrant.sh", + "${path.root}/scripts/alpine/real-tmp_alpine.sh", + "${path.root}/scripts/alpine/cleanup_apk.sh", + "${path.root}/scripts/_common/minimize.sh" + ] : [ + "${path.root}/scripts/rhel/update_dnf.sh", + "${path.root}/scripts/_common/motd.sh", + "${path.root}/scripts/_common/sshd.sh", + "${path.root}/scripts/_common/vagrant.sh", + "${path.root}/scripts/_common/virtualbox.sh", + "${path.root}/scripts/_common/vmware.sh", + "${path.root}/scripts/_common/parallels.sh", + "${path.root}/scripts/rhel/cleanup_dnf.sh", + "${path.root}/scripts/_common/minimize.sh" + ] ) ) ) diff --git a/packer_templates/scripts/_common/virtualbox.sh b/packer_templates/scripts/_common/virtualbox.sh index 8b0447d46..9e5edd7db 100644 --- a/packer_templates/scripts/_common/virtualbox.sh +++ b/packer_templates/scripts/_common/virtualbox.sh @@ -22,6 +22,8 @@ virtualbox-iso|virtualbox-ovf) apt-get install -y build-essential dkms bzip2 tar linux-headers-"$(uname -r)" elif [ -f "/usr/bin/zypper" ]; then zypper install -y perl cpp gcc make bzip2 tar kernel-default-devel + elif [ -f "/sbin/apk" ]; then + apk add perl musl-dev gcc make bzip2 tar linux-headers fi echo "installing the vbox additions for architecture $ARCHITECTURE" diff --git a/packer_templates/scripts/_common/vmware.sh b/packer_templates/scripts/_common/vmware.sh index b6a3c171e..c84d7fffc 100644 --- a/packer_templates/scripts/_common/vmware.sh +++ b/packer_templates/scripts/_common/vmware.sh @@ -1,4 +1,6 @@ -#!/bin/bash -eux +#!/bin/sh + +set -eux # set a default HOME_DIR environment variable if not set HOME_DIR="${HOME_DIR:-/home/vagrant}" @@ -12,7 +14,7 @@ vmware-iso|vmware-vmx) systemctl start vmtoolsd elif [ -f "/usr/bin/apt-get" ]; then # determine the major Debian version we're runninng - major_version="$(grep VERSION_ID /etc/os-release | awk -F= '{print $2}' | tr -d '"')" + major_version="$(. /etc/os-release | printf '%s' "${VERSION_ID}")" architecture="$(uname -m)" # open-vm-tools for amd64 are only available in bullseye-backports repo echo "install open-vm-tools" diff --git a/packer_templates/scripts/alpine/build-tools_alpine.sh b/packer_templates/scripts/alpine/build-tools_alpine.sh new file mode 100644 index 000000000..1a00d8f16 --- /dev/null +++ b/packer_templates/scripts/alpine/build-tools_alpine.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -eux + +apk add autoconf gcc libelf libtool linux-headers make musl-dev perl diff --git a/packer_templates/scripts/alpine/cleanup_apk.sh b/packer_templates/scripts/alpine/cleanup_apk.sh new file mode 100644 index 000000000..c7fa101ac --- /dev/null +++ b/packer_templates/scripts/alpine/cleanup_apk.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +set -eux + +echo "reduce the grub menu time to 1 second" +sed -i -e 's/^GRUB_TIMEOUT=[0-9]\+$/GRUB_TIMEOUT=1/' /etc/default/grub +grub2-mkconfig -o /boot/grub2/grub.cfg + +echo "Remove development and kernel source packages" +apk del linux-headers libelf gcc make perl + +echo "Remove older versions of packages the from cache directory" +apk cache clean + +echo "clean whole package cache" +rm -rf /var/cache/apk/* + +echo "truncate any logs that have built up during the install" +find /var/log -type f -exec truncate --size=0 {} \; + +echo "Remove any non-loopback network configs" +if test -d /etc/sysconfig/network-scripts +then + find /etc/sysconfig/network-scripts -name "ifcfg-*" -not -name "ifcfg-lo" -exec rm -f {} \; +fi + +echo "remove the install log" +rm -f /root/anaconda-ks.cfg /root/original-ks.cfg + +echo "remove the contents of /tmp and /var/tmp" +rm -rf /tmp/* /var/tmp/* + +echo "Force a new random seed to be generated" +# https://wiki.alpinelinux.org/wiki/Entropy_and_randomness +dd if=/dev/zero of=/var/tmp/tempfile bs=1M count=200 && find / -size +1k && ls -R / && rm /var/tmp/tempfile && sync + +echo "Wipe netplan machine-id (DUID) so machines get unique ID generated on boot" +truncate -s 0 /etc/machine-id +if test -f /var/lib/dbus/machine-id +then + truncate -s 0 /var/lib/dbus/machine-id # if not symlinked to "/etc/machine-id" +fi + +echo "Clear the history so our install commands aren't there" +rm -f /root/.wget-hsts +export HISTSIZE=0 diff --git a/packer_templates/scripts/alpine/install-supporting-packages_alpine.sh b/packer_templates/scripts/alpine/install-supporting-packages_alpine.sh new file mode 100644 index 000000000..fe2999d3e --- /dev/null +++ b/packer_templates/scripts/alpine/install-supporting-packages_alpine.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -eux + +# Chef with Fedora >= 30 requires libxcrypt-compat to be installed +# dnf -y install libxcrypt-compat +# https://gitlab.alpinelinux.org/alpine/aports/-/issues/13251 +# not yet^ diff --git a/packer_templates/scripts/alpine/networking_alpine.sh b/packer_templates/scripts/alpine/networking_alpine.sh new file mode 100644 index 000000000..917ed96b2 --- /dev/null +++ b/packer_templates/scripts/alpine/networking_alpine.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -eux + +case "$PACKER_BUILDER_TYPE" in + 'virtualbox'*) + ## https://access.redhat.com/site/solutions/58625 (subscription required) + # add 'single-request-reopen' so it is included when /etc/resolv.conf is generated + cat >> /etc/NetworkManager/dispatcher.d/fix-slow-dns <> /etc/resolv.conf + EOF + chmod +x /etc/NetworkManager/dispatcher.d/fix-slow-dns + systemctl restart NetworkManager.service + echo 'Slow DNS fix applied (single-request-reopen)' + ;; + *) + echo 'Slow DNS fix not required for this platform, skipping' + ;; +esac diff --git a/packer_templates/scripts/alpine/real-tmp_alpine.sh b/packer_templates/scripts/alpine/real-tmp_alpine.sh new file mode 100644 index 000000000..083eb5d4f --- /dev/null +++ b/packer_templates/scripts/alpine/real-tmp_alpine.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -eux + +#echo "Don't use the tmpfs based /tmp dir that is limited to 50% of RAM" +#systemctl mask tmp.mount + + +# One can modify their /etc/fstab with, e.g.: +# /tmp /tmp tmpfs defaults,size=8G 0 0 diff --git a/packer_templates/scripts/alpine/update_apk.sh b/packer_templates/scripts/alpine/update_apk.sh new file mode 100644 index 000000000..56503a1a5 --- /dev/null +++ b/packer_templates/scripts/alpine/update_apk.sh @@ -0,0 +1,7 @@ +#!/bin/sh -eux + +# update all packages +apk upgrade --available + +reboot; +sleep 60;