Files
scripts/.github/workflows/build-test-image-docker.yml
2022-12-06 22:26:34 +01:00

298 lines
11 KiB
YAML

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