This CL adds the foundation for running tests consistently in Kokoro and locally, for both x86 and aarch64. The crosvm_builder is similar to the original image from docker/crosvm.Dockerfile. The main difference is that ChromeOS dependencies are not compiled into the container, but built at runtime. The crosvm_aarch64_builder installs the build enviornment to cross-compile crosvm for aarch64. The tests are run with user-space emulation using qemu-aarch64-static. See ci/README.md for instructions on how to use these builders. Tests on aarch64 cannot all be run using user-space emulation. We will need a VM to pass all smoke tests, this work is tracked in b/177228167. BUG=b:177133814 TEST=Tested by running ./ci/builder bin/smoke_test ./ci/builder cargo test ./ci/aarch64_builder cargo build ./ci/aarch64_builder cargo test -p tempfile Change-Id: Iffffcf48894787dd72fff894af351fdaced0b429 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2621994 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org> Tested-by: Dennis Kempin <denniskempin@google.com> Commit-Queue: Dennis Kempin <denniskempin@google.com> |
||
---|---|---|
.. | ||
pkgconfig | ||
build_crosvm.sh | ||
build_crosvm_base.sh | ||
checkout_commits.env | ||
crosvm_wrapper.sh | ||
Dockerfile | ||
Dockerfile.crosvm | ||
README.md | ||
upgrade_checkout_commits.sh | ||
wrapped_smoke_test.sh |
Docker for Building/Running crosvm
This module contains various pieces of Docker infrastructure for supporting crosvm outside of Chrome OS environments. This includes the kokoro build environment.
[TOC]
Introduction
Ordinarily, crosvm is built using the standard cargo build
command inside of a Chrome OS chroot.
The chroot requirement is there because of various path dependencies in the crosvm Cargo.toml
are
targeted to paths outside of the crosvm repo itself. If one were to checkout crosvm in isolation,
cargo build
would be inadequate, failing with an error related to these missing paths.
Additionally, crosvm depends on native packages that are not ordinarily available from an OS package
manager (e.g. minijail) or have been forked in the Chrome OS project in an incompatible fashion
(libusb).
crosvm-base
Docker Image
To support building crosvm outside of a Chrome OS chroot, this modules contains a Dockerfile
that
is used to build the crosvm-base
docker image. Part of that image build process is downloading
various repos, checking out pinned commits (specified in checkout_commits.env
), and installing
them. For the path dependencies in the Cargo.toml
, the Dockerfile
downloads and places the
source code in the correct spot relative to the crosvm source repository. The crosvm-base
build
step stops short of actually building crosvm. It doesn't even have the source code for crosvm. The
intent here is to use crosvm-base
for building and running any version of crosvm.
To build the crosvm-base
image, run build_crosvm_base.sh
. The script will automatically use the
checkouts from checkout_commits.env
which can be reconfigured to point to any commit desired. To
upgrade checkout_commits.sh
to the HEAD of each remote master branch, run the
upgrade_checkout_commits.sh
script.
crosvm
Docker Image
After generating a crosvm-base
, the system is ready to build crosvm into its own crosvm
docker
image. The resulting docker image will be capable of running VMs without fear of missing native
dependencies. Run the build_crosvm.sh
script to build crosvm into a docker image. Once that
completes, use the crosvm_wrapper.sh
script to run crosvm within the docker image. That script
will pass the arguments given to it verbatim to crosvm. In addition, the current working directory
is bind mounted into the container so that file paths passed to crosvm_wrapper.sh
should work as
long as they are relative paths to files contained in the working directory.
smoke_test
There is a convenience wrapper for smoke_test
that uses the crosvm
docker image to execute
all the tests. Run wrapped_smoke_test.sh
after building crosvm-base
docker image to run the
smoke_test
within docker.