Skip to content

Use opatch instead of git apply to patch compiler sources #176

Use opatch instead of git apply to patch compiler sources

Use opatch instead of git apply to patch compiler sources #176

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
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 ]