CI: Test the compatibility between the development and release versions #164
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 | |
| - ocukver: 1.0.0 | |
| ukver: dev | |
| - ocukver: dev | |
| ukver: 0.18.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: 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)" |