Skip to content

Integration

Integration #1772

Workflow file for this run

name: Integration
on:
workflow_dispatch:
inputs:
snap-channel:
description: Snap Store channel
mac-x86-package:
description: macOS x86 package URL
mac-arm-package:
description: macOS ARM package URL
win-package:
description: Windows package URL
jobs:
GetMatrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
bors-matrix: ${{ steps.set-matrix.outputs.bors-matrix }}
steps:
- name: Determine job matrix
id: set-matrix
run: |
set -euo pipefail
MATRIX=""
if [ -n '${{ github.event.inputs.snap-channel }}' ]; then
MATRIX+='{"os": "Linux", "vm": "linux", "driver": "qemu"}'
MATRIX+='{"os": "Linux", "vm": "linux", "driver": "lxd"}'
fi
if [ -n '${{ github.event.inputs.mac-x86-package }}' ]; then
MATRIX+='{"os": "macOS", "vm": "macos-11", "driver": "qemu", "arch": "x86_64" }'
MATRIX+='{"os": "macOS", "vm": "macos-12", "driver": "qemu", "arch": "x86_64" }'
fi
if [ -n '${{ github.event.inputs.mac-arm-package }}' ]; then
MATRIX+='{"os": "macOS", "driver": "qemu", "arch": "arm64" }'
fi
if [ -n '${{ github.event.inputs.win-package }}' ]; then
MATRIX+='{"os": "Windows", "vm": "windows-10", "driver": "hyperv"}'
MATRIX+='{"os": "Windows", "vm": "windows-11", "driver": "hyperv"}'
fi
echo "${MATRIX}" | jq -cs '{"include": . }' | awk '{ print "matrix=" $0 }' >> $GITHUB_OUTPUT
CI:
needs: GetMatrix
runs-on: testflinger
# Windows is pretty slow unfortunately.
timeout-minutes: 120
strategy:
matrix: ${{ fromJSON(needs.GetMatrix.outputs.matrix) }}
env:
TESTFLINGER_FILE: testflinger-${{ matrix.os }}-${{ matrix.driver }}.yaml
steps:
- name: Write the testflinger job
uses: DamianReeves/[email protected]
with:
path: ${{ env.TESTFLINGER_FILE }}
write-mode: overwrite
contents: |
job_queue: ${{ matrix.os == 'macOS' && matrix.arch == 'arm64' && 'macos-arm' || matrix.vm }}
output_timeout: 2400
provision_data:
${{ matrix.vm && format('vmx: /Users/cibot/Virtual Machines.localized/{0}.vmwarevm/{0}.vmx', matrix.vm) || '' }}
snapshot: Testflinger
${{ matrix.os == 'Linux' && 'image_url: https://cloud-images.ubuntu.com/releases/jammy/release/ubuntu-22.04-server-cloudimg-amd64.img' || '' }}
${{ matrix.vm == 'windows-10' && 'username: ieuser' || '' }}
${{ matrix.vm == 'windows-11' && 'username: user' || '' }}
vmx_config:
memsize: 4096
vhv.enable: true
vpmc.enable: true
test_data:
test_cmds: |
set -xeuo pipefail
MP=multipass
[ '${{ matrix.os }}' == 'macOS' ] && MP=/usr/local/bin/multipass
function _run() {{
ssh ${{ '${{SSH_OPTS}} "${{DEVICE_USER}}@${{DEVICE_IP}}" -- "${{@}}"' }}
}}
# Retry $1 times, with $2 seconds in between tries
function _retry() {{
tries=$1
interval=$2
shift 2
for try in $( seq $tries ); do
RC=0
${{ '"${{@}}"' }} || RC=$?
[ $RC -eq 0 -o $try -eq $tries ] && return $RC
sleep $interval;
done
}}
# Retry $1 times, with $2 seconds in between tries, until $3 greps
function _retry_grep() {{
tries=$1
interval=$2
pattern=$3
shift 3
for try in $( seq $tries ); do
RC=0
${{ '"${{@}}"' }} | grep --quiet -e "$pattern" || RC=$?
[ $RC -eq 0 -o $try -eq $tries ] && return $RC
sleep $interval;
done
}}
# Log journal entries on bad exit
function _exit() {{
RC=$?
if [ '${{ matrix.os }}' == 'Linux' ]; then
[ $RC -eq 0 ] || _run sudo journalctl -u snap.multipass*
elif [ '${{ matrix.os }}' == 'macOS' ]; then
[ $RC -eq 0 ] || _run sudo cat /Library/Logs/Multipass/multipassd.log
# Authenticate the root user
_run $MP set local.passphrase=foobar || true
# Sleep 20 seconds to allow daemon to restart
sleep 20
_run sudo $MP authenticate foobar || true
( echo y; echo y ) | _run sudo PATH=/bin:/usr/local/bin /bin/sh "/Library/Application\\ Support/com.canonical.multipass/uninstall.sh" || true
_run sudo rm -rf /Library/Logs/Multipass
fi
}}
trap _exit EXIT
function _ps() {{
_run powershell -noprofile -noninteractive -command ${{ '${{@}}' }}
}}
function _install() {{
PACKAGE="$1"
if [ '${{ matrix.os }}' == 'Linux' ]; then
# Give snapd time to settle
_retry 5 30 _run sudo sh -c "snap\ list\ multipass && sudo snap refresh multipass --channel ${PACKAGE} || sudo snap install multipass --channel ${PACKAGE}"
elif [ '${{ matrix.os }}' == 'macOS' ]; then
_run curl --location --output multipass.pkg "${PACKAGE}"
_run sudo installer -dumplog -target / -pkg multipass.pkg
elif [ '${{ matrix.os }}' == 'Windows' ]; then
_ps "(New-Object System.Net.WebClient).DownloadFile('${PACKAGE}', 'multipass-installer.exe')"
_run .\\multipass-installer.exe /S
fi
}}
if [ '${{ matrix.os }}' == 'Linux' ]; then
OVERRIDE_CONF="/etc/systemd/system/snap.multipass.multipassd.service.d/override.conf"
_run sudo mkdir -p $( dirname ${OVERRIDE_CONF} )
_run sudo tee ${OVERRIDE_CONF} <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/snap run multipass.multipassd --verbosity trace
EOF
_install ${{ github.event.inputs.snap-channel }}
elif [ '${{ matrix.os }}' == 'macOS' ]; then
( echo y; echo y ) | _run sudo PATH=/bin:/usr/local/bin /bin/sh "/Library/Application\\ Support/com.canonical.multipass/uninstall.sh" || true
_install ${{ matrix.arch == 'arm64' && github.event.inputs.mac-arm-package || github.event.inputs.mac-x86-package }}
elif [ '${{ matrix.os }}' == 'Windows' ]; then
_install ${{ github.event.inputs.win-package }}
if [ '${{ matrix.driver }}' == 'hyperv' ]; then
_ps "Set-Variable ProgressPreference SilentlyContinue; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart"
_ps "Restart-Computer -Force"
sleep 120
fi
fi
if [ '${{ matrix.driver }}' == 'lxd' ]; then
_run sudo snap connect multipass:lxd lxd
_run sudo lxd init --auto
fi
_retry_grep 12 5 "multipassd" _run $MP version
_run $MP set local.driver=${{ matrix.driver }}
# Wait for the daemon to restart
_retry_grep 12 5 '^${{ matrix.driver }}' _run $MP get local.driver
# and for the streams to flow down
_retry_grep 12 5 "\w,lts\W" _run $MP find
# Launch and test primary
_run $MP start --timeout 1200
_run $MP list
_run $MP exec primary -- uname -a
- name: Run the job
id: run
uses: nick-fields/retry@v2
with:
timeout_minutes: 60
max_attempts: 2
command: |
JOB_ID=$( testflinger-cli submit --quiet ${TESTFLINGER_FILE} )
echo "${JOB_ID}" > testflinger_job
testflinger-cli poll "${JOB_ID}"
[ "$( testflinger-cli results ${JOB_ID} | jq -r .test_status )" == "0" ]
on_retry_command: |
testflinger-cli cancel "$( cat testflinger_job )"
- name: Cancel the job
if: ${{ cancelled() }}
run: |
if [ -f testflinger_job ]; then testflinger-cli cancel "$( cat testflinger_job )"; fi