diff --git a/.github/workflows/amd64-fatpack-image.yml b/.github/workflows/amd64-fatpack-image.yml index 1e5a6eb30..8b4207539 100644 --- a/.github/workflows/amd64-fatpack-image.yml +++ b/.github/workflows/amd64-fatpack-image.yml @@ -61,12 +61,12 @@ jobs: echo "BUILD_VERSION=$(git describe --always --tags)" >> $GITHUB_ENV - name: Hello RaspiBlitz - run: echo "Building the raspiblitz-amd64-debian-image-${{env.BUILD_DATE}}-${{env.BUILD_VERSION}} at " + run: echo "Building the raspiblitz-amd64-debian-image-${{env.BUILD_DATE}}-${{env.BUILD_VERSION}}" - name: Run the build script run: | cd ci/amd64 - bash packer.build.amd64-debian.sh fatpack $GITHUB_ACTOR $GITHUB_HEAD_REF + bash packer.build.amd64-debian.sh --pack fatpack --github_user $GITHUB_ACTOR --branch $GITHUB_HEAD_REF --preseed_file preseed.cfg --boot uefi--desktop gnome - name: Compute checksum of the raw image run: | diff --git a/.github/workflows/amd64-lean-image.yml b/.github/workflows/amd64-lean-image.yml index 750ca9d33..f36059778 100644 --- a/.github/workflows/amd64-lean-image.yml +++ b/.github/workflows/amd64-lean-image.yml @@ -44,7 +44,7 @@ jobs: - name: Run the build script run: | cd ci/amd64 - bash packer.build.amd64-debian.sh lean $GITHUB_ACTOR $GITHUB_HEAD_REF + bash packer.build.amd64-debian.sh --pack lean --github_user $GITHUB_ACTOR --branch $GITHUB_HEAD_REF --preseed_file preseed.cfg --boot uefi --desktop gnome - name: Compute checksum of the raw image run: | diff --git a/.github/workflows/amd64-lean-legacyboot-image.yml b/.github/workflows/amd64-lean-legacyboot-image.yml new file mode 100644 index 000000000..7fa20f049 --- /dev/null +++ b/.github/workflows/amd64-lean-legacyboot-image.yml @@ -0,0 +1,71 @@ +name: amd64-lean-legacyboot-image-build + +concurrency: + group: amd64-lean-legacyboot-image-build-${{ github.head_ref }} + cancel-in-progress: true + +on: + workflow_dispatch: + push: + branches: ["dev", "v1.8", "v1.9"] + paths: + - "build_sdcard.sh" + - "home.admin/bitcoin.install.sh" + - "home.admin/tor.install.sh" + - "home.admin/blitz.i2pd.sh" + - "home.admin/blitz.web.sh" + - "home.admin/blitz.display.sh" + - "ci/amd64/**" + pull_request: + branches: ["dev", "v1.8", "v1.9"] + paths: + - "build_sdcard.sh" + - "home.admin/bitcoin.install.sh" + - "home.admin/tor.install.sh" + - "home.admin/blitz.i2pd.sh" + - "home.admin/blitz.web.sh" + - "home.admin/blitz.display.sh" + - "ci/amd64/**" + +jobs: + amd64-image-build: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + + - name: Set values + run: | + echo "BUILD_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + echo "BUILD_VERSION=$(git describe --always --tags)" >> $GITHUB_ENV + + - name: Hello RaspiBlitz + run: echo "Building the raspiblitz-amd64-debian-image-${{env.BUILD_DATE}}-${{env.BUILD_VERSION}}" + + - name: Run the build script + run: | + cd ci/amd64 + bash packer.build.amd64-debian.sh --pack lean --github_user $GITHUB_ACTOR --branch $GITHUB_HEAD_REF --preseed_file preseed.cfg --boot bios --desktop none + + - name: Compute checksum of the raw image + run: | + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu + sha256sum raspiblitz-amd64-debian-lean.qcow2 > raspiblitz-amd64-debian-lean.qcow2.sha256 + + - name: Compress image + run: | + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu + gzip -v9 raspiblitz-amd64-debian-lean.qcow2 + + - name: Compute checksum of the compressed image + run: | + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu + sha256sum raspiblitz-amd64-debian-lean.qcow2.gz > raspiblitz-amd64-debian-lean.qcow2.gz.sha256 + + - name: Upload the image and checksums + uses: actions/upload-artifact@v3 + with: + name: raspiblitz-amd64-image-${{env.BUILD_DATE}}-${{env.BUILD_VERSION}} + path: | + ${{github.workspace}}/ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu/raspiblitz-amd64-debian-lean.qcow2.sha256 + ${{github.workspace}}/ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu/raspiblitz-amd64-debian-lean.qcow2.gz + ${{github.workspace}}/ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu/raspiblitz-amd64-debian-lean.qcow2.gz.sha256 diff --git a/Makefile b/Makefile index e50f48d11..13882020f 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,16 @@ SHELL = /bin/bash GITHUB_ACTOR = $(shell git remote -v | grep origin | head -1 | cut -d/ -f4) GITHUB_HEAD_REF = $(shell git rev-parse --abbrev-ref HEAD) -amd64-lean-image: +amd64-lean-desktop-uefi-image: # Run the build script cd ci/amd64 && \ - bash packer.build.amd64-debian.sh lean $(GITHUB_ACTOR) $(GITHUB_HEAD_REF) 0 + bash packer.build.amd64-debian.sh \ + --pack lean \ + --github_user $(GITHUB_ACTOR) \ + --branch $(GITHUB_HEAD_REF) \ + --preseed_file preseed.cfg \ + --boot uefi\ + --desktop gnome # Compute the checksum of the qemu image cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu && \ @@ -22,10 +28,42 @@ amd64-lean-image: # List the generated files ls -lah ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu/raspiblitz-amd64-debian-lean.qcow2.* -amd64-fatpack-image: +amd64-lean-server-legacyboot-image: # Run the build script cd ci/amd64 && \ - bash packer.build.amd64-debian.sh fatpack $(GITHUB_ACTOR) $(GITHUB_HEAD_REF) + bash packer.build.amd64-debian.sh \ + --pack lean \ + --github_user $(GITHUB_ACTOR) \ + --branch $(GITHUB_HEAD_REF) \ + --preseed_file preseed.cfg \ + --boot bios-256k.bin \ + --desktop none + + # Compute the checksum of the qemu image + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu && \ + sha256sum raspiblitz-amd64-debian-lean.qcow2 > raspiblitz-amd64-debian-lean.qcow2.sha256 + + # Compress the image + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu && \ + gzip -v9 raspiblitz-amd64-debian-lean.qcow2 + + # Compute the checksum of the compressed image + cd ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu && \ + sha256sum raspiblitz-amd64-debian-lean.qcow2.gz > raspiblitz-amd64-debian-lean.qcow2.gz.sha256 + + # List the generated files + ls -lah ci/amd64/builds/raspiblitz-amd64-debian-lean-qemu/raspiblitz-amd64-debian-lean.qcow2.* + +amd64-fatpack-desktop-uefi-image: + # Run the build script + cd ci/amd64 && \ + bash packer.build.amd64-debian.sh \ + --pack fatpack \ + --github_user $(GITHUB_ACTOR) \ + --branch $(GITHUB_HEAD_REF) \ + --preseed_file preseed.cfg \ + --boot uefi\ + --desktop gnome # Compute the checksum of the qemu image cd ci/amd64/builds/raspiblitz-amd64-debian-fatpack-qemu && \ @@ -45,7 +83,10 @@ amd64-fatpack-image: arm64-rpi-lean-image: # Run the build script cd ci/arm64-rpi && \ - bash packer.build.arm64-rpi.local.sh lean $(GITHUB_ACTOR) $(GITHUB_HEAD_REF) + bash packer.build.arm64-rpi.local.sh \ + --pack lean \ + --github_user $(GITHUB_ACTOR) \ + --branch $(GITHUB_HEAD_REF) # Compute the checksum of the raw image cd ci/arm64-rpi/packer-builder-arm && \ @@ -65,7 +106,10 @@ arm64-rpi-lean-image: arm64-rpi-fatpack-image: # Run the build script cd ci/arm64-rpi && \ - bash packer.build.arm64-rpi.local.sh fatpack $(GITHUB_ACTOR) $(GITHUB_HEAD_REF) + bash packer.build.arm64-rpi.local.sh \ + --pack fatpack \ + --github_user $(GITHUB_ACTOR) \ + --branch $(GITHUB_HEAD_REF) # Compute the checksum of the raw image cd ci/arm64-rpi/packer-builder-arm && \ diff --git a/build_sdcard.sh b/build_sdcard.sh index fa02aadde..bcaa06b2f 100644 --- a/build_sdcard.sh +++ b/build_sdcard.sh @@ -291,9 +291,8 @@ HandleLidSwitchDocked=ignore" | tee /etc/systemd/logind.conf.d/nosuspend.conf # https://github.com/rootzoll/raspiblitz/issues/138 # https://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html # https://stackoverflow.com/questions/38188762/generate-all-locales-in-a-docker-image -if [ "${baseimage}" = "raspios_arm64" ] || [ "${baseimage}" = "debian" ]; then +if [ "${baseimage}" = "raspios_arm64" ] || [ "${cpu}" = aarch64 ] && [ "${baseimage}" = "debian" ]; then echo -e "\n*** FIXING LOCALES FOR BUILD ***" - sed -i "s/^# en_US.UTF-8 UTF-8.*/en_US.UTF-8 UTF-8/g" /etc/locale.gen sed -i "s/^# en_US ISO-8859-1.*/en_US ISO-8859-1/g" /etc/locale.gen locale-gen diff --git a/ci/README.md b/ci/README.md index f978fc2c1..fc50e5c2b 100644 --- a/ci/README.md +++ b/ci/README.md @@ -1,29 +1,33 @@ # Automated builds -* The images are built using the dev branch. -* The lean image has no Gnome desktop or WebUI installed. -* Issue: https://github.com/rootzoll/raspiblitz/issues/3053 -* The templates are made using: https://github.com/chef/bento + +
+Table of Contents - [Local build](#local-build) - [Generate an arm64-rpi image](#generate-an-arm64-rpi-image) - [Generate an amd64 image](#generate-an-amd64-image) + - [amd64-lean-desktop-uefi-image](#amd64-lean-desktop-uefi-image) + - [amd64-lean-server-legacyboot-image](#amd64-lean-server-legacyboot-image) - [Images generated in github actions](#images-generated-in-github-actions) - [Write the image to a disk connected with USB](#write-the-image-to-a-disk-connected-with-usb) - [Convert the qcow2 volume to a raw disk image](#convert-the-qcow2-volume-to-a-raw-disk-image) - [Write to a disk connected with USB with Balena Etcher or `dd`](#write-to-a-disk-connected-with-usb-with-balena-etcher-or-dd) - - [Extend the partition on the new disk (optional)](#extend-the-partition-on-the-new-disk-optional) - [The first boot](#the-first-boot) - - [fatpack image](#fatpack-image) - - [lean image](#lean-image) - - [Add Gnome desktop (optional)](#add-gnome-desktop-optional) + - [Lean image with Gnome desktop (default image)](#lean-image-with-gnome-desktop-default-image) + - [Lean server image without Gnome desktop](#lean-server-image-without-gnome-desktop) + - [Add Gnome desktop to the server image (optional)](#add-gnome-desktop-to-the-server-image-optional) + - [Fatpack images](#fatpack-images) + - [Extend the root partition (optional - recommended)](#extend-the-root-partition-optional---recommended) - [Add wifi (optional)](#add-wifi-optional) - [Add wifi driver (optional)](#add-wifi-driver-optional) - [Workflow notes](#workflow-notes) - - [Packer .json settings:](#packer-json-settings) - [VNC](#vnc) + - [Packer settings](#packer-settings) - [Flashing](#flashing) +
+ ## Local build with the [Makefile](https://github.com/rootzoll/raspiblitz/blob/dev/Makefile) * needs ~20 GB free space @@ -33,7 +37,7 @@ with the [Makefile](https://github.com/rootzoll/raspiblitz/blob/dev/Makefile) * Preparation: ``` # change to a mountpoint with sufficient space (check with 'df -h') - cd /var/log + cd $HOME/ # switch to root sudo su # install git and make @@ -50,94 +54,121 @@ with the [Makefile](https://github.com/rootzoll/raspiblitz/blob/dev/Makefile) ``` make arm-rpi-lean-image ``` -* find the image and sh256 hashes in the `ci/arm64-rpi/packer-builder-arm` directory +* find the image and sha256 hashes in the `ci/arm64-rpi/packer-builder-arm` directory * the .img.gz file can be written to an SDcard directly with Balena Etcher ### Generate an amd64 image -The workflow locally and in github actions generates a .qcow2 format amd64 image. +* The workflow locally and in github actions generates a .qcow2 format amd64 image. +* When finished find the compressed .qcow2 image and sha256 hashes in the `ci/amd64/builds` directory + +#### amd64-lean-desktop-uefi-image +* lean image, Gnome desktop, UEFI boot +* Tested with + * written to disk and booted with UEFI + ``` + make amd64-lean-desktop-uefi-image + ``` + +#### amd64-lean-server-legacyboot-image +* lean image, no desktop (cli only), legacy boot for old computers * Tested with * libvirt / virsh / virt-manager (https://virt-manager.org/) - * written to disk and booted with legacy boot (non-UEFI) + * written to disk and booted with legacy boot (non-UEFI / CSM mode) ``` - make amd64-lean-image + amd64-lean-server-legacyboot-image ``` -* find the compressed .qcow2 image and sh256 hashes in the `ci/amd64/builds` directory ## Images generated in github actions * To see the downloadable artifacts will need to log in to GitHub -* Find the latest successful builds for amd64 using the dev branch at: +* Find the latest successful build of the default amd64 image: https://github.com/rootzoll/raspiblitz/actions/workflows/amd64-lean-image.yml?query=workflow%3Aamd64-lean-image-build+branch%3Adev+is%3Asuccess++ ``` # unzip to the same directory - unzip raspiblitz-amd64-image-YEAR-MM-DD-COMMITHASH.zip + unzip ./raspiblitz-amd64-image-YEAR-MM-DD-COMMITHASH.zip ``` ## Write the image to a disk connected with USB -* identify the connected disk with `lsblk` eg `/dev/sdd` - ### Convert the qcow2 volume to a raw disk image -* the raw image is 33.5 GB +* the raw image is 30GB ``` # unzip - gzip -dkv raspiblitz-amd64-debian-11.5-lean.qcow2.gz + gzip -dkv raspiblitz-amd64-debian-lean.qcow2.gz # convert - qemu-img convert raspiblitz-amd64-debian-11.5-lean.qcow2 raspiblitz-amd64-debian-11.5-lean.img + qemu-img convert ./raspiblitz-amd64-debian-lean.qcow2 ./raspiblitz-amd64-debian-lean.img ``` ### Write to a disk connected with USB with Balena Etcher or `dd` +* identify the connected disk with `lsblk` eg,: `/dev/sdk` * [Balena Etcher](https://www.balena.io/etcher/) to write the .img to disk * dd to write the .img to disk ``` - # identify partitions - lsblk - # write to disk - sudo dd if=./raspiblitz-amd64-debian-11.5-lean.img of=/dev/sde bs=4M status=progress + disk="/dev/sdk" + sudo dd if=./raspiblitz-amd64-debian-lean.img of=${disk} bs=4M status=progress ``` - * qemu-image dd to write the .qcow2 directly to disk ``` sudo apt install -y qemu-utils - sudo qemu-img dd if=./raspiblitz-amd64-debian-11.5-lean.qcow2 of=/dev/sde bs=4M - ``` -### Extend the partition on the new disk (optional) -* Use Disks to resize the Extended Partition to the full size of the disk -* To extend the LVM: - ``` - # identify the USB connected disk - lsblk - df -h - # extend the lvm to the full free space and resize the filesystem - sudo lvextend -r -l +100%FREE /dev/mapper/raspiblitz--amd74--debian--11--vg-root - - # alternatively download the script - git clone https://git.scs.carleton.ca/git/extend-lvm.git - # run with the disk as the parameter (sde for example) - sudo bash extend-lvm/extend-lvm.sh /dev/sde + disk="/dev/sdk" + sudo qemu-img dd if=./raspiblitz-amd64-debian-lean.qcow2 of=${disk} bs=4M ``` ## The first boot -### fatpack image +### Lean image with Gnome desktop (default image) * log in on screen: * username: `admin` * password: `raspiblitz` - * start a terminal for guidance +* connect with ssh over the LAN + * username: `admin` + * password: `raspiblitz` -* alternatively open a browser and go to: +### Lean server image without Gnome desktop +* press any key to get to a login prompt after the splash screen + * username: `admin` + * password: `raspiblitz` + +#### Add Gnome desktop to the server image (optional) +* Connect to the internet (easiest to plug in a LAN cable - use a USB - LAN adapter if have no port) + ``` + apt install gnome + systemctl start gdm + ``` + +### Fatpack images +* can open a browser and go to: * http://localhost * can also open the WebUI on another computer * Find the the RaspiBlitz_IP in your router dashboard, in the terminal prompt or with `hostname -I` * open: http://RaspiBlitz_IP -### lean image -* press any key to get to a login prompt after the splash screen - * username: `admin` - * password: `raspiblitz` - -#### Add Gnome desktop (optional) -* Connect to the internet (easiest to plug in a LAN cable - use a USB - LAN adapter if have no port) +### Extend the root partition (optional - recommended) +* The default image is 30GB. The partition can be extended to the full size of the disk. +* The lvm partition can be extended while mounted so this step can be done later as well while the system is running. +* CLI (recommended) ``` - apt install gnome - systemctl start gdm + # identify the USB connected disk + lsblk + df -h + # select the disk carefully + disk="/dev/sde" + # resize the extended partition to the full size of the disk + sudo parted ${disk} -- resizepart 2 100% + # resize the lvm partition to the full size of the disk + sudo parted ${disk} -- resizepart 5 100% + # extend the physical volume to size of the lvm partition + sudo pvresize ${disk}5 + # extend the root lvm to the full free space and resize the filesystem + sudo lvextend -r -l +100%FREE /dev/mapper/raspiblitz--amd64--vg-root + ``` +* GUI with GParted + ``` + # install + sudo apt install gparted + # start the gparted GUI + sudo gparted + # resize the extended partition to the full size of the disk + # extend the lvm to the full free space and resize the filesystem (extends the swap space by default) + # in CLI: extend the root lvm + sudo lvextend -r -l +100%FREE /dev/mapper/raspiblitz--amd64--vg-root ``` ### Add wifi (optional) @@ -153,9 +184,13 @@ https://github.com/rootzoll/raspiblitz/actions/workflows/amd64-lean-image.yml?qu ``` sudo apt update && sudo apt install firmware-iwlwifi ``` +* alternatively download the deb package from: http://ftp.debian.org/debian/pool/non-free-firmware/f/firmware-nonfree/firmware-iwlwifi_20230210-5_all.deb +* install with: + ``` + sudo dpkg -i firmware-iwlwifi_20230210-5_all.deb + ``` ## Workflow notes - The github workflow files are the equivalent of the Makefile commands run locally. The local repo owner (`GITHUB_ACTOR`) and branch (`GITHUB_HEAD_REF`) is picked up. The build_sdcard.sh is downloaded from the source branch and built with the options pack=[lean|fatpack] to set fatpack=[0|1]. @@ -176,8 +211,11 @@ After the image is built (and there is no exit with errors) the next steps are: * compute checksum of the compressed image * (in github actions: upload the artifacts in one .zip file) -### Packer .json settings: -* `disk_size` - the size op the raw image. The .qcow2 file is compressed. +### VNC +* can follow the setup locally in VNC with the port stated in the first part of the logs eg: `Found available VNC port: 5900 on IP: 127.0.0.1` + +### Packer settings +* `disk_size` / `image_size` - the size op the raw image. The .qcow2 file is compressed. * `template` - image filename * `output_directory` - directory under builds where the image will be placed * the `pi` user is given passwordless sudo access and used for the image setup @@ -197,7 +235,5 @@ After the image is built (and there is no exit with errors) the next steps are: cat 2022-09-22-raspios-bullseye-arm64.img.xz.sha256 ``` -### VNC -* can follow the setup locally in VNC with the port stated in the first part of the logs eg: `Found available VNC port: 5952 on IP: 127.0.0.1` ### Flashing -* using `qemu-img dd bs=4M if=raspiblitz-amd64-debian-11.5-lean.qcow2 of=/dev/sdd` changed the UUID so it won't boot without editing GRUB +* using `qemu-img dd bs=4M if=raspiblitz-amd64-debian-lean.qcow2 of=/dev/sdd` changed the UUID so it won't boot without editing GRUB diff --git a/ci/amd64/_common/env.sh b/ci/amd64/_common/env.sh new file mode 100644 index 000000000..4b9fe8626 --- /dev/null +++ b/ci/amd64/_common/env.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +echo "# Display the environment variables" +env diff --git a/ci/amd64/debian/amd64-debian.json b/ci/amd64/debian/amd64-debian.json deleted file mode 100644 index 1e5a7a9af..000000000 --- a/ci/amd64/debian/amd64-debian.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "variables": { - "box_basename": "debian", - "build_directory": "../builds", - "build_timestamp": "{{isotime \"20060102150405\"}}", - "pack": "{{user `pack`}}", - "cpus": "4", - "disk_size": "30000", - "git_revision": "__unknown_git_revision__", - "guest_additions_url": "", - "headless": "false", - "http_directory": "{{template_dir}}/http", - "http_proxy": "{{env `http_proxy`}}", - "https_proxy": "{{env `https_proxy`}}", - "iso_checksum": "3b0e9718e3653435f20d8c2124de6d363a51a1fd7f911b9ca0c6db6b3d30d53e", - "iso_name": "debian-12.0.0-amd64-netinst.iso", - "memory": "4096", - "mirror": "http://cdimage.debian.org/cdimage/release", - "mirror_directory": "current/amd64/iso-cd", - "name": "debian", - "no_proxy": "{{env `no_proxy`}}", - "preseed_path": "debian-9/preseed.cfg", - "qemu_display": "none", - "qemu_bios": "bios-256k.bin", - "template": "raspiblitz-amd64-debian-{{user `pack`}}", - "boot_command": "install preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{user `preseed_path`}} debian-installer=en_US.UTF-8 auto locale=en_US.UTF-8 kbd-chooser/method=us keyboard-configuration/xkb-keymap=us netcfg/get_hostname={{ .Name }} netcfg/get_domain=vagrantup.com fb=false debconf/frontend=noninteractive console-setup/ask_detect=false console-keymaps-at/keymap=us grub-installer/bootdev=default ", - "version": "TIMESTAMP" -}, - "builders": [ - { - "boot_command": "{{user `boot_command`}}", - "boot_wait": "5s", - "cpus": "{{ user `cpus` }}", - "disk_size": "{{user `disk_size`}}", - "headless": "{{ user `headless` }}", - "http_directory": "{{user `http_directory`}}", - "iso_checksum": "{{user `iso_checksum`}}", - "iso_url": "{{user `mirror`}}/{{user `mirror_directory`}}/{{user `iso_name`}}", - "memory": "{{ user `memory` }}", - "output_directory": "{{ user `build_directory` }}/{{user `template`}}-qemu", - "shutdown_command": "echo 'raspiblitz' | sudo /sbin/shutdown -hP now", - "ssh_password": "raspiblitz", - "ssh_port": 22, - "ssh_timeout": "10000s", - "ssh_username": "pi", - "type": "qemu", - "format": "qcow2", - "vm_name": "{{ user `template` }}.qcow2", - "qemuargs": [ - [ "-m", "{{ user `memory` }}" ], - [ "-bios", "{{ user `qemu_bios` }}" ], - [ "-display", "{{ user `qemu_display` }}" ] - ] - } - ], - "provisioners": [ - { - "type": "shell", - "environment_vars": [ - "HOME_DIR=/home/pi", - "http_proxy={{user `http_proxy`}}", - "https_proxy={{user `https_proxy`}}", - "no_proxy={{user `no_proxy`}}", - "github_user={{user `github_user`}}", - "branch={{user `branch`}}", - "pack={{user `pack`}}" - ], - "execute_command": "echo 'raspiblitz' | {{.Vars}} sudo -S -E sh -eux '{{.Path}}'", - "expect_disconnect": true, - "scripts": [ - "{{template_dir}}/scripts/update.sh", - "{{template_dir}}/../_common/sshd.sh", - "{{template_dir}}/scripts/networking.sh", - "{{template_dir}}/scripts/sudoers.sh", - "{{template_dir}}/scripts/systemd.sh", - "{{template_dir}}/scripts/raspiblitz.sh", - "{{template_dir}}/scripts/cleanup.sh" - ] - } - ] -} diff --git a/ci/amd64/debian/build.amd64-debian.pkr.hcl b/ci/amd64/debian/build.amd64-debian.pkr.hcl new file mode 100644 index 000000000..0b051b583 --- /dev/null +++ b/ci/amd64/debian/build.amd64-debian.pkr.hcl @@ -0,0 +1,115 @@ +packer { + required_version = ">= 1.7.0, < 2.0.0" + + required_plugins { + qemu = { + source = "github.com/hashicorp/qemu" + version = ">= 1.0.0, < 2.0.0" + } + } +} + +variable "pack" { default = "lean" } +variable "github_user" { default = "raspiblitz" } +variable "branch" { default = "dev" } +variable "desktop" { default = "none" } + +variable "boot" { default = "uefi" } +variable "preseed_file" { default = "preseed.cfg" } +variable "hostname" { default = "raspiblitz-amd64" } + +variable "iso_name" { default = "debian-12.1.0-amd64-netinst.iso" } +variable "iso_checksum" { default = "9f181ae12b25840a508786b1756c6352a0e58484998669288c4eec2ab16b8559" } + +variable "disk_size" { default = "30000" } +variable "memory" { default = "4096" } +variable "cpus" { default = "4" } + +locals { + name_template = "${var.hostname}-debian-${var.pack}" + bios_file = var.boot == "uefi" ? "OVMF.fd" : "bios-256k.bin" + boot_command = var.boot == "uefi" ? [ + "c", + "linux /install.amd/vmlinuz ", + "auto=true ", + "url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/${var.preseed_file} ", + "hostname=${var.hostname} ", + "domain=${var.hostname}.local ", + "interface=auto ", + "vga=788 noprompt quiet --", + "initrd /install.amd/initrd.gz", + "boot" + ] : [ + "install ", + " preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/${var.preseed_file} ", + "debian-installer=en_US.UTF-8 ", + "auto ", + "locale=en_US.UTF-8 ", + "kbd-chooser/method=us ", + "keyboard-configuration/xkb-keymap=us ", + "netcfg/get_hostname=${var.hostname} ", + "netcfg/get_domain=${var.hostname}.local ", + "fb=false ", + "debconf/frontend=noninteractive ", + "console-setup/ask_detect=false ", + "console-keymaps-at/keymap=us ", + "grub-installer/bootdev=default ", + "" + ] +} + +source "qemu" "debian" { + boot_command = local.boot_command + boot_wait = "5s" + cpus = var.cpus + disk_size = var.disk_size + http_directory = "./http" + iso_checksum = var.iso_checksum + iso_url = "http://cdimage.debian.org/cdimage/release/current/amd64/iso-cd/${var.iso_name}" + memory = var.memory + output_directory = "../builds/${local.name_template}-qemu" + shutdown_command = "echo 'raspiblitz' | sudo /sbin/shutdown -hP now" + ssh_password = "raspiblitz" + ssh_port = 22 + ssh_timeout = "10000s" + ssh_username = "pi" + format = "qcow2" + vm_name = "${local.name_template}.qcow2" + headless = false + vnc_bind_address = "127.0.0.1" + vnc_port_max = 5900 + vnc_port_min = 5900 + qemuargs = [ + ["-m", var.memory], + ["-bios", local.bios_file], + ["-display", "none"] + ] +} + +build { + description = "Can't use variables here yet!" + sources = ["source.qemu.debian"] + + provisioner "shell" { + environment_vars = [ + "HOME_DIR=/home/pi", + "github_user=${var.github_user}", + "branch=${var.branch}", + "pack=${var.pack}", + "desktop=${var.desktop}" + ] + + execute_command = "echo 'raspiblitz' | {{.Vars}} sudo -S -E sh -eux '{{.Path}}'" + expect_disconnect = true + scripts = [ + "./../_common/env.sh", + "./scripts/update.sh", + "./../_common/sshd.sh", + "./scripts/networking.sh", + "./scripts/sudoers.sh", + "./scripts/systemd.sh", + "./scripts/build.raspiblitz.sh", + "./scripts/cleanup.sh" + ] + } +} diff --git a/ci/amd64/debian/http/debian-9/preseed.cfg b/ci/amd64/debian/http/debian-9/preseed.cfg deleted file mode 100644 index 7ab0c3414..000000000 --- a/ci/amd64/debian/http/debian-9/preseed.cfg +++ /dev/null @@ -1,47 +0,0 @@ -choose-mirror-bin mirror/http/proxy string -d-i apt-setup/use_mirror boolean true -d-i base-installer/kernel/override-image string linux-server -d-i clock-setup/utc boolean true -d-i clock-setup/utc-auto boolean true -d-i finish-install/reboot_in_progress note -d-i grub-installer/only_debian boolean true -d-i grub-installer/with_other_os boolean true -d-i keymap select us -d-i mirror/country string manual -d-i mirror/http/directory string /debian -d-i mirror/http/hostname string httpredir.debian.org -d-i mirror/http/proxy string -d-i partman-auto-lvm/guided_size string max -d-i partman-auto/choose_recipe select atomic -d-i partman-auto/method string lvm -d-i partman-lvm/confirm boolean true -d-i partman-lvm/confirm_nooverwrite boolean true -d-i partman-lvm/device_remove_lvm boolean true -d-i partman/choose_partition select finish -d-i partman/confirm boolean true -d-i partman/confirm_nooverwrite boolean true -d-i partman/confirm_write_new_label boolean true -d-i passwd/root-login boolean false -d-i passwd/root-password-again password raspiblitz -d-i passwd/root-password password raspiblitz -d-i passwd/user-fullname string pi -d-i passwd/user-uid string 1000 -d-i passwd/user-password password raspiblitz -d-i passwd/user-password-again password raspiblitz -d-i passwd/username string pi -d-i pkgsel/include string sudo bzip2 acpid cryptsetup zlib1g-dev wget curl dkms fuse make nfs-common net-tools cifs-utils rsync -d-i pkgsel/install-language-support boolean false -d-i pkgsel/update-policy select none -d-i pkgsel/upgrade select full-upgrade -# Prevent packaged version of VirtualBox Guest Additions being installed: -d-i preseed/early_command string sed -i \ - '/in-target/idiscover(){/sbin/discover|grep -v VirtualBox;}' \ - /usr/lib/pre-pkgsel.d/20install-hwpackages -d-i time/zone string UTC -d-i user-setup/allow-password-weak boolean true -d-i user-setup/encrypt-home boolean false -d-i preseed/late_command string sed -i '/^deb cdrom:/s/^/#/' /target/etc/apt/sources.list -apt-cdrom-setup apt-setup/cdrom/set-first boolean false -apt-mirror-setup apt-setup/use_mirror boolean true -popularity-contest popularity-contest/participate boolean false -tasksel tasksel/first multiselect standard, ssh-server diff --git a/ci/amd64/debian/http/preseed.cfg b/ci/amd64/debian/http/preseed.cfg new file mode 100644 index 000000000..843680b74 --- /dev/null +++ b/ci/amd64/debian/http/preseed.cfg @@ -0,0 +1,72 @@ +# https://github.com/chef/bento/blob/main/packer_templates/http/debian/preseed.cfg +# https://www.debian.org/releases/stable/example-preseed.txt +# https://github.com/tylert/packer-build/blob/master/source/debian/12_bookworm/base-uefi.preseed +# variables: https://github.com/tylert/packer-build/blob/master/source/debian/12_bookworm/base-uefi.pkr.hcl + +# Locale Setup +d-i debian-installer/language string en +d-i debian-installer/country string US +d-i debian-installer/locale string en_US.UTF-8 +# d-i localechooser/supported-locales multiselect en_CA.UTF-8 fr_CA.UTF-8 zh_CN.UTF-8 +# d-i pkgsel/install-language-support boolean true + +# Keyboard Setup +d-i keyboard-configuration/xkb-keymap select us + +# Clock Setup +# d-i time/zone string Canada/Eastern +d-i time/zone string UTC +d-i clock-setup/utc boolean true +# set above to false if making a bootable USB to run on same system as Windows + +# Network Setup +d-i netcfg/get_hostname string raspiblitz-amd64 +d-i netcfg/get_domain string +# https://bugs.launchpad.net/ubuntu/+source/netcfg/+bug/713385 +d-i netcfg/choose_interface select auto +# make sure you also add "interface=auto" to your boot command too +# https://bugs.launchpad.net/ubuntu/+source/netcfg/+bug/713385 + +# User Setup +d-i passwd/root-login boolean false +d-i passwd/root-password-again password raspiblitz +d-i passwd/root-password password raspiblitz +d-i passwd/user-fullname string pi +d-i passwd/user-uid string 1000 +d-i passwd/user-password password raspiblitz +d-i passwd/user-password-again password raspiblitz +d-i passwd/username string pi + +# Package Setup +d-i hw-detect/load_firmware boolean false +d-i hw-detect/load_media boolean false +apt-cdrom-setup apt-setup/cdrom/set-first boolean false +d-i mirror/country string manual +d-i mirror/http/hostname string httpredir.debian.org +d-i mirror/http/directory string /debian +d-i mirror/http/proxy string +d-i apt-setup/contrib boolean true +d-i apt-setup/non-free boolean true + +tasksel tasksel/first multiselect ssh-server, standard +d-i pkgsel/include string sudo bzip2 acpid cryptsetup zlib1g-dev wget curl dkms fuse make nfs-common net-tools cifs-utils rsync +d-i pkgsel/install-language-support boolean false +d-i pkgsel/update-policy select none +d-i pkgsel/upgrade select full-upgrade + +popularity-contest popularity-contest/participate boolean false + +# Drive setup +d-i partman-auto-lvm/guided_size string max +d-i partman-auto/choose_recipe select atomic +d-i partman-auto/method string lvm +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true +d-i partman-lvm/device_remove_lvm boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true +d-i partman/confirm_write_new_label boolean true + +# Final Setup +d-i finish-install/reboot_in_progress note diff --git a/ci/amd64/debian/scripts/raspiblitz.sh b/ci/amd64/debian/scripts/build.raspiblitz.sh similarity index 92% rename from ci/amd64/debian/scripts/raspiblitz.sh rename to ci/amd64/debian/scripts/build.raspiblitz.sh index 4d6cc31e6..62a9993d2 100644 --- a/ci/amd64/debian/scripts/raspiblitz.sh +++ b/ci/amd64/debian/scripts/build.raspiblitz.sh @@ -9,7 +9,7 @@ else fatpack="0" fi -if [ "${fatpack}" = "1" ]; then +if [ "${desktop}" = "gnome" ]; then echo 'Add Gnome desktop' export DEBIAN_FRONTEND=none sudo apt install gnome -y diff --git a/ci/amd64/packer.build.amd64-debian.sh b/ci/amd64/packer.build.amd64-debian.sh index 6118ed5e3..163f1bb89 100644 --- a/ci/amd64/packer.build.amd64-debian.sh +++ b/ci/amd64/packer.build.amd64-debian.sh @@ -1,13 +1,17 @@ #!/bin/bash -e -# Install packer -curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - -sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" -sudo apt-get update -echo -e "\nInstalling packer..." -sudo apt-get install -y packer +# install packer +if ! packer version 2>/dev/null; then + curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - + sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" + sudo apt-get update + echo -e "\nInstalling packer..." + sudo apt-get install -y packer +else + echo "# Packer is installed" +fi -# Install qemu +# install qemu echo -e "\nInstalling qemu..." sudo apt-get install -y qemu-system @@ -16,6 +20,10 @@ source ../set_variables.sh set_variables "$@" # Build the image -echo -e "\nBuilding image..." +echo -e "\nBuilding the image..." cd debian -PACKER_LOG=1 packer build ${vars} -only=qemu amd64-debian.json +packer init -upgrade . +command="PACKER_LOG=1 packer build ${vars} -only=qemu packer.build.amd64-debian.hcl" +echo "# Running: $command" +if [ ${#vars} -eq 0 ];then exit 1;fi +PACKER_LOG=1 packer build ${vars} -only=qemu.debian build.amd64-debian.pkr.hcl || exit 1 diff --git a/ci/arm64-rpi/arm64-rpi.pkr.hcl b/ci/arm64-rpi/build.arm64-rpi.pkr.hcl similarity index 98% rename from ci/arm64-rpi/arm64-rpi.pkr.hcl rename to ci/arm64-rpi/build.arm64-rpi.pkr.hcl index 0b5c1e366..142647ebf 100644 --- a/ci/arm64-rpi/arm64-rpi.pkr.hcl +++ b/ci/arm64-rpi/build.arm64-rpi.pkr.hcl @@ -56,7 +56,7 @@ build { "branch=${var.branch}", "pack=${var.pack}" ] - script = "./raspiblitz.sh" + script = "./build.raspiblitz.sh" } provisioner "shell" { diff --git a/ci/arm64-rpi/raspiblitz.sh b/ci/arm64-rpi/build.raspiblitz.sh similarity index 100% rename from ci/arm64-rpi/raspiblitz.sh rename to ci/arm64-rpi/build.raspiblitz.sh diff --git a/ci/arm64-rpi/packer.build.arm64-rpi.local.sh b/ci/arm64-rpi/packer.build.arm64-rpi.local.sh index 20c2477a8..8cea7b821 100644 --- a/ci/arm64-rpi/packer.build.arm64-rpi.local.sh +++ b/ci/arm64-rpi/packer.build.arm64-rpi.local.sh @@ -58,11 +58,12 @@ go mod download go build || exit 1 # set vars -source ../set_variables.sh -set_variables "$@" +source <(../set_variables.sh "$@") -cp ../arm64-rpi.pkr.hcl ./ -cp ../raspiblitz.sh ./ +cp ../build.arm64-rpi.pkr.hcl ./ +cp ../build.raspiblitz.sh ./ echo -e "\n# Build the image" -packer build ${vars} arm64-rpi.pkr.hcl +command="packer build ${vars} build.arm64-rpi.pkr.hcl" +echo "# Running: $command" +$command || exit 1 diff --git a/ci/arm64-rpi/packer.build.arm64-rpi.sh b/ci/arm64-rpi/packer.build.arm64-rpi.sh index 8e13bc148..5d4a6b857 100644 --- a/ci/arm64-rpi/packer.build.arm64-rpi.sh +++ b/ci/arm64-rpi/packer.build.arm64-rpi.sh @@ -1,12 +1,13 @@ #!/bin/bash -e # set vars -source ../set_variables.sh -set_variables "$@" +source <(../set_variables.sh "$@") -# Build the image in docker -echo -e "\nBuild Packer image..." +# build the image in docker +echo -e "\nBuild the image..." # from https://hub.docker.com/r/mkaczanowski/packer-builder-arm/tags -docker run --rm --privileged -v /dev:/dev -v ${PWD}:/build \ +command="docker run --rm --privileged -v /dev:/dev -v ${PWD}:/build \ mkaczanowski/packer-builder-arm@sha256:0ff8ce0cf33e37be6c351c8bcb2643835c7f3525b7f591808b91c04238d45695 \ - build ${vars} arm64-rpi.pkr.hcl + build ${vars} build.arm64-rpi.pkr.hcl" +echo "# Running: $command" +$command || exit 1 diff --git a/ci/set_variables.sh b/ci/set_variables.sh old mode 100644 new mode 100755 index 3e9e42372..c02a49fa2 --- a/ci/set_variables.sh +++ b/ci/set_variables.sh @@ -1,46 +1,71 @@ +#!/bin/bash + function set_variables() { - if [ $# -gt 0 ]; then - pack=$1 - fi - if [ $# -gt 1 ]; then - github_user=$2 - fi + declare -A params + while (("$#")); do + case "$1" in + --pack) + params[pack]="$2" + shift 2 + ;; + --github_user) + params[github_user]="$2" + shift 2 + ;; + --branch) + params[branch]="$2" + shift 2 + ;; + # arm64-rpi + --image_link) + params[image_link]="$2" + shift 2 + ;; + # arm64-rpi + --image_checksum) + params[image_checksum]="$2" + shift 2 + ;; + # amd64 + # preseed.cfg + --preseed_file) + params[preseed_file]="$2" + shift 2 + ;; + # amd64 + # uefi | bios + --boot) + params[boot]="$2" + shift 2 + ;; + # amd64 + # none | gnome + --desktop) + params[desktop]="$2" + shift 2 + ;; + --) + shift + break + ;; + *) + echo "Error: Invalid argument" + exit 1 + ;; + esac + done - if [ $# -gt 2 ]; then - branch=$3 - fi - - if [ $# -gt 4 ]; then - image_link="$4" - image_checksum="$5" - fi - - # Initialize the variables string + # Reset the global vars string vars="" + # Iterate over all keys in the params array + for key in "${!params[@]}"; do + # If the value for this key is not empty, add it to vars + if [ -n "${params[$key]}" ]; then + vars="$vars -var $key=${params[$key]}" + fi + done - # Add the pack variable if it is defined - if [ -n "${pack}" ]; then - vars="$vars -var pack=${pack}" - fi + export vars - # Add the github_user variable if it is defined - if [ -n "${github_user}" ]; then - vars="$vars -var github_user=${github_user}" - fi - - # Add the branch variable if it is defined - if [ -n "${branch}" ]; then - vars="$vars -var branch=${branch}" - fi - - # Add the image_link variable if it is defined - if [ -n "${image_link}" ]; then - vars="$vars -var image_link=${image_link}" - fi - - # Add the image_checksum variable if it is defined - if [ -n "${image_checksum}" ]; then - vars="$vars -var image_checksum=${image_checksum}" - fi }