Switch the opam packages to Unikraft 0.20.0 #174
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| ocver: 5.4.0 | |
| - ocukver: dev | |
| ukver: dev | |
| ocver: 5.3.0 | |
| - ocukver: dev | |
| ukver: 0.18.0 | |
| ocver: 5.4.0 | |
| - ocukver: dev | |
| ukver: 0.18.0 | |
| ocver: 5.3.0 | |
| - ocukver: 1.0.0 | |
| ukver: dev | |
| ocver: 5.3.0 | |
| 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: ${{ matrix.ocver }} | |
| # 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: Work around a bug in released OCaml/Unikraft | |
| run: | | |
| mkdir -p "$HOME/.local/bin" | |
| echo "$HOME/.local/bin" >> "$GITHUB_PATH" | |
| git="$HOME/.local/bin/git" | |
| printf '#!/bin/sh\ngit=%s\n' "$(which git)" > "$git" | |
| printf 'case "$1" in\n' >> "$git" | |
| printf ' apply) exec "$git" --work-tree=. "$@" ;;\n' >> "$git" | |
| printf ' *) exec "$git" "$@" ;;\nesac' >> "$git" | |
| chmod +x "$git" | |
| set -x | |
| cat "$git" | |
| if: ${{ matrix.ocukver == '1.0.0' }} | |
| - 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 MirageOS unikernels | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| ocaml: [5.3.0, 5.4.0] | |
| 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: ${{ matrix.ocaml }} | |
| 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 network 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 network 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)" | |
| - name: Patch block skeleton for Unikraft | |
| run: | | |
| cat > skeleton/fix.patch << EOF | |
| diff --git a/device-usage/block/config.ml b/device-usage/block/config.ml | |
| index 2c3ca47..27c751a 100644 | |
| --- a/device-usage/block/config.ml | |
| +++ b/device-usage/block/config.ml | |
| @@ -4,6 +4,7 @@ open Mirage | |
| let main = main "Unikernel.Main" (block @-> job) | |
| let img = | |
| - if_impl Key.is_solo5 (block_of_file "storage") (block_of_file "disk.img") | |
| + if_impl Key.is_solo5 (block_of_file "storage") | |
| + (if_impl Key.is_unikraft (block_of_file "0") (block_of_file "disk.img")) | |
| let () = register "block_test" [ main $ img ] | |
| EOF | |
| set -x | |
| cd skeleton | |
| git apply -v fix.patch | |
| - name: Build block skeleton | |
| run: | | |
| set -x | |
| cd skeleton/device-usage/block/ | |
| opam exec -- mirage configure -t unikraft-qemu | |
| opam exec -- make | |
| - name: Log `.opam.locked` | |
| run: | | |
| cd skeleton/device-usage/block/ | |
| cat mirage/block_test-unikraft-qemu.opam.locked | |
| - name: Test block skeleton | |
| run: | | |
| set -x | |
| cd skeleton/device-usage/block/ | |
| head -c 100000 /dev/zero > disk.img | |
| qemu-system-x86_64 -nographic -nodefaults -serial stdio -machine q35 \ | |
| -cpu "qemu64,-vmx,-svm,+x2apic,+pdpe1gb,+rdrand,+rdseed" -m 1G \ | |
| -drive file=disk.img,if=virtio,id=hvirtio0,format=raw \ | |
| -device isa-debug-exit -kernel dist/block_test.qemu \ | |
| || [ $? = 83 ] |