Skip to content

CI: Test the compatibility between the development and release versions #166

CI: Test the compatibility between the development and release versions

CI: Test the compatibility between the development and release versions #166

Workflow file for this run

name: Build and test
on:
push:
branches:
- '*'
pull_request:
env:
FCVER: "1.13.1"
# OPAMVERBOSE: 3
permissions: {}
jobs:
test:
name: Run examples on both architectures
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- ocukver: dev
ukver: dev
- ocukver: dev
ukver: 0.18.0
# The released OCaml/Unikraft packages sometimes fail to build because
# the patches fail to apply
# - ocukver: 1.0.0
# ukver: dev
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Read the version number from gen_opams.ml
env:
OCUKVER: ${{ matrix.ocukver }}
UKVER: ${{ matrix.ukver }}
run: |
# OCaml/Unikraft version number
V="$(awk '/^let version_o/ {gsub(/"/,"");print $4;}' gen_opams.ml)"
[[ "$OCUKVER" = dev ]] && OCUKVER="$V"
printf 'OCUKVER=%s\n' "$OCUKVER" >> "$GITHUB_ENV"
# Unikraft version number
U="$(awk '/^let version_u/ {gsub(/"/,"");print $4;}' gen_opams.ml)"
[[ "$UKVER" = dev ]] && UKVER="$U"
printf 'UKVER=%s\n' "$UKVER" >> "$GITHUB_ENV"
# Log
printf 'Dev versions:\n- OCaml/Unikraft: %s\n- Unikraft: %s\n' \
"$V" "$U"
- name: Install OCaml compiler
uses: ocaml/setup-ocaml@v3
with:
ocaml-compiler: 5.3.0
# We need to pin our packages with their real version numbers, to
# satisfy the dependency bounds of the other packages
opam-pin: false
- name: Pin Unikraft packages
run: |
opam pin add -yn "https://github.com/mirage/unikraft.git#$UKVER+mirage"
opam pin add -yn "https://github.com/mirage/unikraft-lib-musl.git#$UKVER+mirage"
opam pin add -yn ocaml-unikraft-backend-firecracker.$UKVER .
opam pin add -yn ocaml-unikraft-backend-firecracker-arm64.$UKVER .
opam pin add -yn ocaml-unikraft-backend-firecracker-x86_64.$UKVER .
opam pin add -yn ocaml-unikraft-backend-qemu.$UKVER .
opam pin add -yn ocaml-unikraft-backend-qemu-arm64.$UKVER .
opam pin add -yn ocaml-unikraft-backend-qemu-x86_64.$UKVER .
opam pin add -yn ocaml-unikraft-option-debug.$UKVER .
opam pin add -yn ocaml-unikraft-toolchain-arm64.$UKVER .
opam pin add -yn ocaml-unikraft-toolchain-x86_64.$UKVER .
if: ${{ matrix.ukver == 'dev' }}
- name: Pin OCaml/Unikraft packages
run: |
opam pin add -yn ocaml-unikraft.$OCUKVER .
opam pin add -yn ocaml-unikraft-arm64.$OCUKVER .
opam pin add -yn ocaml-unikraft-default-arm64.$OCUKVER .
opam pin add -yn ocaml-unikraft-default-x86_64.$OCUKVER .
opam pin add -yn ocaml-unikraft-x86_64.$OCUKVER .
if: ${{ matrix.ocukver == 'dev' }}
- name: Install extra packages
run: |
sudo apt-get update -y
sudo apt-get install -y qemu-system-x86 qemu-system-arm
opam install dune
- name: Install arch-specific packages
run: |
opam install \
ocaml-unikraft-x86_64.$OCUKVER \
ocaml-unikraft-backend-qemu-x86_64.$UKVER \
ocaml-unikraft-backend-firecracker-x86_64.$UKVER \
ocaml-unikraft-arm64.$OCUKVER \
ocaml-unikraft-backend-qemu-arm64.$UKVER \
ocaml-unikraft-backend-firecracker-arm64.$UKVER
- name: Show configuration
run: |
opam exec -- ocamlc -config
opam config list
opam list
- name: Install default packages
run: |
opam install \
ocaml-unikraft.$OCUKVER \
ocaml-unikraft-default-arm64.$OCUKVER \
ocaml-unikraft-backend-qemu.$UKVER \
ocaml-unikraft-backend-firecracker.$UKVER
- name: Show toolchain configuration
run: |
opam exec -- ocamlfind -toolchain unikraft ocamlc -config
- name: Test examples
run: |
cd examples/simple/
opam exec -- dune build
cd ../all/
opam exec -- dune runtest
- name: Install the other default packages
run: |
opam install ocaml-unikraft-default-x86_64.$OCUKVER
- name: Show configuration
run: |
opam exec -- ocamlfind -toolchain unikraft ocamlc -config
- name: Test examples with QEMU
run: |
cd examples/all/
opam exec -- dune runtest
- name: Install Firecracker
run: |
wget -q -O- "https://github.com/firecracker-microvm/firecracker/releases/download/v$FCVER/firecracker-v$FCVER-x86_64.tgz" | tar xvz
mkdir -p "$HOME/.local/bin"
mv "release-v$FCVER-x86_64/firecracker-v$FCVER-x86_64" "$HOME/.local/bin/firecracker"
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Test examples with Firecracker
run: |
cd examples/all/
export UNIKRAFTBACKEND=firecracker
sudo setfacl -m u:${USER}:rw /dev/kvm
opam exec -- dune build @test-args
sudo setfacl -m u:${USER}:rw /dev/kvm
opam exec -- dune build @test-fail
sudo setfacl -m u:${USER}:rw /dev/kvm
opam exec -- dune build @test-hello
sudo setfacl -m u:${USER}:rw /dev/kvm
opam exec -- dune build @test-sleeper
sudo setfacl -m u:${USER}:rw /dev/kvm
opam exec -- dune build @test-threader
mirage:
name: Build and test a MirageOS network unikernel
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Read the version number from gen_opams.ml
run: |
printf 'OCUKVER=%s\n' \
"$(awk '/^let version_ocaml_/ {gsub(/"/,"");print $4;}' gen_opams.ml)" \
>> "$GITHUB_ENV"
printf 'UKVER=%s\n' \
"$(awk '/^let version_unikraft/ {gsub(/"/,"");print $4;}' gen_opams.ml)" \
>> "$GITHUB_ENV"
- name: Checkout skeleton code
uses: actions/checkout@v4
with:
repository: mirage/mirage-skeleton
path: skeleton
- name: Install OCaml compiler
uses: ocaml/setup-ocaml@v3
with:
ocaml-compiler: 5.3.0
opam-repositories: |
default: https://github.com/ocaml/opam-repository.git
# We need to pin our packages with their real version numbers, to
# satisfy the dependency bounds of the other packages
opam-pin: false
- name: Pin necessary packages
run: |
opam pin add -yn "https://github.com/mirage/unikraft.git#$UKVER+mirage"
opam pin add -yn "https://github.com/mirage/unikraft-lib-musl.git#$UKVER+mirage"
opam pin add -yn ocaml-unikraft-backend-qemu-x86_64.$UKVER .
opam pin add -yn ocaml-unikraft-backend-qemu.$UKVER .
opam pin add -yn ocaml-unikraft-default-x86_64.$OCUKVER .
opam pin add -yn ocaml-unikraft-option-debug.$UKVER .
opam pin add -yn ocaml-unikraft-toolchain-x86_64.$UKVER .
opam pin add -yn ocaml-unikraft-x86_64.$OCUKVER .
opam pin add -yn ocaml-unikraft.$OCUKVER .
- name: Install packages
run: |
opam install \
ocaml-unikraft-default-x86_64 \
ocaml-unikraft-backend-qemu \
ocaml-unikraft \
mirage
- name: Show configuration
run: |
opam exec -- ocamlc -config
opam config list
opam list
- name: Show toolchain configuration
run: |
opam exec -- ocamlfind -toolchain unikraft ocamlc -config
- name: Build skeleton
run: |
set -x
cd skeleton/device-usage/network/
opam exec -- mirage configure -t unikraft-qemu
opam exec -- make
- name: Log `.opam.locked`
run: |
cd skeleton/device-usage/network/
cat mirage/network-unikraft-qemu.opam.locked
- name: Install QEMU
run: |
sudo apt-get update
sudo apt-get install -y qemu-system-x86
- name: Test skeleton
run: |
set -x
sudo ip link add br0 type bridge
sudo ip tuntap add dev tap0 mode tap
sudo ip link set dev tap0 master br0
sudo ip addr add 10.0.0.1/24 dev br0
sudo ip link set dev br0 up
sudo ip link set dev tap0 up
cd skeleton/device-usage/network/
(sleep 20s; pkill 'qemu-system.*') &
echo "echo Failure; false" > res
(set +e; \
sleep 8s; \
r1=0; r2=0; \
curl -fsS 10.0.0.2:8080 || r1=$?; \
sleep 1s; \
curl -fsS 10.0.0.2:8080 || r2=$?; \
set +x; \
case "$r1,$r2" in \
52,52) echo "echo Success; true" > res ;; \
esac ) &
qemu-system-x86_64 -nographic -nodefaults -serial stdio -machine q35 \
-cpu "qemu64,-vmx,-svm,+x2apic,+pdpe1gb,+rdrand,+rdseed" -m 1G \
-netdev tap,id=hnet0,ifname=tap0,vhost=off,script=no,downscript=no \
-device virtio-net-pci,netdev=hnet0,id=net0 \
-kernel dist/network.qemu -append "-l debug --ipv4-only=true"
set +x
eval "$(cat res)"