name: Build test images with Docker on: workflow_dispatch: workflow_call: inputs: reference: required: true type: string runner: required: true type: string jobs: gradle: strategy: fail-fast: false max-parallel: 8 matrix: board: [uefi-x86] release: ["bullseye","sid","jammy","kinetic"] name: Make runs-on: ${{ inputs.runner }} outputs: desktop: ${{steps.list_dirs.outputs.desktop}} steps: - name: Runner prepare uses: armbian/actions/runner-prepare@main - name: Read values run: | DISTRO=$(echo ${{ matrix.target }} | cut -d":" -f1) RELEASE=$(echo ${{ matrix.target }} | cut -d":" -f2) COMPILER=$(echo ${{ matrix.target }} | cut -d":" -f3) DOCKER_DISTRO=$DISTRO DOCKER_RELEASE=$RELEASE DOCKER_COMPILER=$COMPILER BOARD=${{ matrix.board }} # Bullseye can't build even itself if [[ "$RELEASE" == "bullseye" ]]; then DOCKER_DISTRO="ubuntu" DOCKER_RELEASE="jammy" DOCKER_COMPILER="12" fi if [[ "$DISTRO" == "debian" ]] && [[ "$BOARD" == "rpi4b" ]]; then echo "SKIP=yes" >> $GITHUB_ENV fi # export to environment echo "RELEASE=$RELEASE" >> $GITHUB_ENV echo "BOARD=$BOARD" >> $GITHUB_ENV echo "COMPILER=$COMPILER" >> $GITHUB_ENV echo "DESKTOP=${{ matrix.desktop }}" >> $GITHUB_ENV echo "DOCKER_DISTRO=$DOCKER_DISTRO" >> $GITHUB_ENV echo "DOCKER_RELEASE=$DOCKER_RELEASE" >> $GITHUB_ENV echo "DOCKER_COMPILER=$DOCKER_COMPILER" >> $GITHUB_ENV - name: Checkout repository uses: actions/checkout@v3.1.0 with: fetch-depth: 1 repository: armbian/build path: build - name: Checkout support scripts uses: actions/checkout@v3.1.0 with: fetch-depth: 1 repository: armbian/scripts path: scripts - name: Sync run: | mkdir -p build/userpatches sudo cp scripts/configs/lib.config build/userpatches/ sudo cp scripts/configs/config-default.conf build/userpatches/ - name: Pull Docker image run: | sudo docker pull ghcr.io/armbian/build:latest"-jammy-$(dpkg --print-architecture)" - name: Build test image if: ${{ env.SKIP != 'yes' }} run: | cd build # framework init ./compile.sh \ JUST_INIT="yes" \ OFFLINE_WORK="yes" \ BRANCH=current \ RELEASE=focal \ BUILD_MINIMAL=yes \ BUILD_DESKTOP=no \ KERNEL_ONLY=no \ KERNEL_CONFIGURE=no \ BOARD="zeropi" \ NO_HOST_RELEASE_CHECK="yes" # change template sudo sed -i "s/^#DOCKER_FLAGS+=(--privileged)/DOCKER_FLAGS+=(--privileged)/" userpatches/config-docker.conf #sudo sed -i "s/^ARM_GCC_COMPILER=.*/ARM_GCC_COMPILER=g++-${{ env.DOCKER_COMPILER }}-arm-linux-gnueabihf/" userpatches/config-docker.conf sudo sed -i "s/^BASE_IMAGE=.*/BASE_IMAGE=ubuntu:jammy/" userpatches/config-docker.conf sudo sed -i "s/^VERSION=.*/VERSION=latest\"-\$(echo \${BASE_IMAGE} \| cut -d\":\" -f2)-\$(dpkg --print-architecture)\"/" userpatches/config-docker.conf sudo sed -i 's/armbian:/ghcr.io\/armbian\/build:/g' userpatches/config-docker.conf sudo sed -i "s/ -it/ -i/" userpatches/config-docker.conf export TERM=dumb touch .ignore_changes ./compile.sh docker \ JUST_INIT="no" \ OFFLINE_WORK="no" \ BETA=yes \ EXPERT=yes \ BOARD=${{ matrix.board }} \ BRANCH=current \ RELEASE=${{ matrix.release }} \ BUILD_MINIMAL=no \ BUILD_DESKTOP=no \ KERNEL_CONFIGURE=prebuilt \ IGNORE_UPDATES=yes \ REPOSITORY_INSTALL="u-boot,kernel" \ COMPRESS_OUTPUTIMAGE="yes" \ SKIP_EXTERNAL_TOOLCHAINS=yes \ - name: Upload artefacts uses: actions/upload-artifact@v3 with: name: "${{ matrix.board }}-${{ matrix.release }}" path: build/output/images/* if-no-files-found: error retention-days: 7 - name: Read id: list_dirs run: | RELEASE=$(echo ${{ matrix.target }} | cut -d":" -f2) echo ${{ matrix.target }} echo ${RELEASE} echo "RELEASE=$RELEASE" >> $GITHUB_ENV MATRIX=$( set +e releases=($(find build/config/distributions -mindepth 1 -maxdepth 1 -type d | sed 's/.*\///' | grep -v "focal\|buster" )) # # releases=("jammy") for i in ${releases[@]} do environments=($([[ -d build/config/desktop/${i}/environments ]] && ls -1 build/config/desktop/${i}/environments)) # #environments=("xfce" "gnome") #environmants=("xfce" "gnome" "mate" "cinnamon" "budgie" "kde-plasma" "i3-wm" "xmonad") for j in ${environments[@]} do echo "$i:$j" done done) echo "desktop=$(for x in $(echo "${MATRIX}"); do echo $x; done|jq -cnR '[inputs | select(length>0)]' | jq -c)" >> $GITHUB_OUTPUT Upgrade: needs: [ gradle ] name: "Install" runs-on: [qemu,igor] timeout-minutes: 480 strategy: max-parallel: 32 fail-fast: false matrix: node: ${{fromJson(needs.gradle.outputs.desktop)}} steps: - name: Prepare run: | #sudo apt-get -y install qemu-kvm libvirt-daemon-system libvirt-clients virtinst cpu-checker libguestfs-tools libosinfo-bin gir1.2-spiceclientgtk-3.0 virt-viewer sshpass nmap - name: Read run: | RELEASE=$(echo ${{ matrix.node }} | cut -d":" -f1) DESKTOP=$(echo ${{ matrix.node }} | cut -d":" -f2) echo "RELEASE=$RELEASE" >> $GITHUB_ENV echo "DESKTOP=$DESKTOP" >> $GITHUB_ENV # remove old rm -rf "uefi-x86-${RELEASE}" - name: Download artifacts uses: actions/download-artifact@v3 with: name: "uefi-x86-${{ env.RELEASE }}" path: "uefi-x86-${{ env.RELEASE }}" - name: Remove previous if any run: | sudo virsh destroy "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" || true sudo virsh undefine "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" || true - name: Convert to QEMU and resize run: | xz -fd "uefi-x86-${{ env.RELEASE }}"/*.xz IMAGE=$(ls -1 "uefi-x86-${{ env.RELEASE }}"/*.img) sudo qemu-img convert -f raw -O qcow2 ${IMAGE} /var/lib/libvirt/images/"uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}".qcow2 sudo qemu-img resize /var/lib/libvirt/images/"uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}".qcow2 +10G - name: Run image in QEMU run: | sudo virt-install --name "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" --memory 2048 --vcpus 4 --disk /var/lib/libvirt/images/"uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}".qcow2,bus=sata --import --os-variant ubuntu22.04 --network bridge=br0 --noautoconsole sleep 2m sudo virsh domiflist "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" | tail -2 | head -1 | awk '{print $NF}' - name: Get IP address run: | # repeat several times #for i in 1 2 3 4 5 while true do MAC=$(sudo virsh domiflist "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" | tail -2 | head -1 | awk '{print $NF}') USER_HOST=$(sudo nmap --max-parallelism 10 -sn 10.0.40.0/24 | grep -i "$MAC" -B 2 | head -1 | awk '{print $NF}') if [[ "$USER_HOST" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then break fi sleep 1 done [[ -f "$HOME/.ssh/known_hosts" ]] && ssh-keygen -f "$HOME/.ssh/known_hosts" -R "$USER_HOST" || true echo "USER_HOST=$USER_HOST" >> $GITHUB_ENV - name: Login run: | USER_HOST=${{ env.USER_HOST }} USER_ROOT=root PASS_ROOT=testpassword USER_NORMAL=guest PASS_NORMAL=testpassword expect -c " spawn sshpass -p 1234 ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} set timeout 120 expect \"Create root password: \" send \"${PASS_ROOT}\r\" expect \"Repeat root password: \" send \"${PASS_ROOT}\r\" expect \"zsh\" send \"2\r\" expect \"*to abort\" send \"${USER_NORMAL}\r\" expect \"Create*password:\" send \"${PASS_NORMAL}\r\" expect \"Repeat*password:\" send \"${PASS_NORMAL}\r\" expect \"Please provide your real name: \" send \"${NAME_NORMAL}\r\" expect \"*language based on your location*\" send \"y\r\" expect eof" sshpass -p ${PASS_ROOT} ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} "apt-get -y update" sshpass -p ${PASS_ROOT} ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} "apt-get -y install maim" sshpass -p ${PASS_ROOT} ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} "apt-get -y upgrade" sshpass -p ${PASS_ROOT} ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} "git clone https://github.com/armbian/configng -b desktop" sshpass -p ${PASS_ROOT} ssh -o "StrictHostKeyChecking=accept-new" ${USER_ROOT}@${USER_HOST} "cd configng/test; ./desktop_test.sh ${{ env.DESKTOP }}" sleep 10 sshpass -p ${PASS_NORMAL} ssh -o "StrictHostKeyChecking=accept-new" ${USER_NORMAL}@${USER_HOST} "export DISPLAY=:0;maim" > screenshot.png - name: Upload artefacts uses: actions/upload-artifact@v3 with: name: "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}-screenshot" path: screenshot.png if-no-files-found: error retention-days: 7 - name: Remove VMs run: | sudo virsh destroy "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" || true sudo virsh undefine "uefi-x86-${{ env.RELEASE }}-${{ env.DESKTOP }}" || true