summary refs log tree commit diff
path: root/kokoro
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2018-09-20 14:39:59 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-09-22 01:43:12 -0700
commitf55812ac200cc7bf75592eefeec10404dcb5ed3b (patch)
tree7248e02205c0e19dac0a68bc6835f0a41b0f2d6d /kokoro
parenta1422e6bcab81492d20ae312c92cdc2491705876 (diff)
downloadcrosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar.gz
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar.bz2
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar.lz
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar.xz
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.tar.zst
crosvm-f55812ac200cc7bf75592eefeec10404dcb5ed3b.zip
kokoro: build and run all crosvm unit tests in docker
TEST=run kokoro presubmit
BUG=b:73822503

Change-Id: Ica341fd8a064f4deb64fecbd4277ed6cc285ef2d
Reviewed-on: https://chromium-review.googlesource.com/1236888
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'kokoro')
-rw-r--r--kokoro/Dockerfile96
-rw-r--r--kokoro/README.md72
-rwxr-xr-xkokoro/build.sh24
-rwxr-xr-xkokoro/kokoro_simulator.sh35
-rw-r--r--kokoro/presubmit.cfg2
5 files changed, 223 insertions, 6 deletions
diff --git a/kokoro/Dockerfile b/kokoro/Dockerfile
new file mode 100644
index 0000000..2a744b4
--- /dev/null
+++ b/kokoro/Dockerfile
@@ -0,0 +1,96 @@
+FROM debian:stretch
+LABEL description="Test crosvm using a command like the following: \
+docker run --privileged -v /dev/log:/dev/log -v <path to crosvm>:/src:ro <crosvm base image>"
+
+RUN apt-get update && apt-get install -y \
+    autoconf \
+    automake \
+    curl \
+    gcc \
+    git \
+    libcap-dev \
+    libdrm-dev \
+    libegl1-mesa-dev \
+    libgl1-mesa-dev \
+    libgles1-mesa-dev \
+    libgles2-mesa-dev \
+    libtool \
+    libwayland-dev \
+    make \
+    nasm \
+    ninja-build \
+    pkg-config \
+    protobuf-compiler \
+    python3
+
+ENV RUSTUP_HOME=/usr/local/rustup \
+    CARGO_HOME=/usr/local/cargo \
+    PATH=/usr/local/cargo/bin:$PATH \
+    RUST_VERSION=1.29.0
+
+# Debian usually has an old rust version in the repository. Instead of using that, we use rustup to
+# pull in a toolchain versions of our choosing.
+RUN curl -LO "https://static.rust-lang.org/rustup/archive/1.13.0/x86_64-unknown-linux-gnu/rustup-init" \
+    && echo "f69dafcca62fe70d7882113e21bb96a2cbdf4fc4636d25337d6de9191bdec8da *rustup-init" | sha256sum -c - \
+    && chmod +x rustup-init \
+    && ./rustup-init -y --no-modify-path --default-toolchain $RUST_VERSION \
+    && rm rustup-init \
+    && chmod -R a+w $RUSTUP_HOME $CARGO_HOME \
+    && rustup --version \
+    && cargo --version \
+    && rustc --version
+
+# Warms up the cargo registry cache for future cargo runs. Cargo will still update the cache using a
+# git pull, but it only needs to download files that were changed since this image was built.
+RUN cargo install thisiznotarealpackage -q || true
+
+# Used /scratch for building dependencies which are too new or don't exist on Debian stretch.
+WORKDIR /scratch
+
+# minijail does not exist in upstream linux distros.
+RUN git clone https://android.googlesource.com/platform/external/minijail \
+    && cd minijail \
+    && make -j24 \
+    && cp libminijail.so /usr/lib/x86_64-linux-gnu/
+
+# The gbm used by upstream linux distros is not compatible with crosvm, which must use Chrome OS's
+# minigbm.
+RUN dpkg --force-depends -r libgbm1
+RUN git clone https://chromium.googlesource.com/chromiumos/platform/minigbm \
+    && cd minigbm \
+    && sed 's/-Wall/-Wno-maybe-uninitialized/g' -i Makefile \
+    && make install -j24
+
+# New libepoxy requires newer meson than is in Debian stretch.
+RUN git clone https://github.com/mesonbuild/meson \
+    && cd meson \
+    && git checkout 0a5ff338012a00f32c3aa9d8773835accc3e4e5b \
+    && ln -s $PWD/meson.py /usr/bin/meson
+
+# New libepoxy has EGL_KHR_DEBUG entry points needed by crosvm.
+RUN git clone https://github.com/anholt/libepoxy.git \
+    && cd libepoxy \
+    && git checkout 707f50e680ab4f1861b1e54ca6e2907aaca56c12 \
+    && mkdir build \
+    && cd build \
+    && meson \
+    && ninja install
+
+# virglrenderer is under heavy development on master and we want the very latest.
+RUN git clone https://gitlab.freedesktop.org/virgl/virglrenderer.git \
+    && cd virglrenderer \
+    && ./autogen.sh \
+    && make install -j24
+
+# Reduces image size and prevents accidentally using /scratch files
+RUN rm -r /scratch /usr/bin/meson
+
+# The manual installation of shared objects requires an ld.so.cache refresh.
+RUN ldconfig
+
+# The /build directory is used so that the bind mounted /src volume does not get scribbled on.
+ENV CARGO_TARGET_DIR=/build
+RUN mkdir -p $CARGO_TARGET_DIR
+WORKDIR /src
+CMD cargo test --no-fail-fast --all-features --all --exclude aarch64 $TEST_FLAGS -- \
+    --test-threads=1 $TEST_RUNNER_FLAGS
diff --git a/kokoro/README.md b/kokoro/README.md
new file mode 100644
index 0000000..300c00a
--- /dev/null
+++ b/kokoro/README.md
@@ -0,0 +1,72 @@
+# Kokoro CI for crosvm
+
+For presubmit testing, each change posted for Gerrit on the master branch of crosvm will be tried by
+Kokoro. The configuration is found in [`presubmit.cfg`](presubmit.cfg) and the build script is at
+[`build.sh`](build.sh). A Docker image called `crosvm-base` is used as the testing environment which
+is built with a [`Dockerfile`](Dockerfile).
+
+[TOC]
+
+## How to use Docker to test crosvm
+
+Assuming a Docker daemon is already running, build the `crosvm-base` image:
+
+```shell
+cd crosvm/kokoro
+docker build -t crosvm-base - < Dockerfile
+```
+
+Here is how to use the image to test a crosvm repository located at `$CROSVM_SRC`:
+
+```shell
+docker run --privileged -v /dev/log:/dev/log -v "${CROSVM_SRC}":/src:ro crosvm-base
+```
+
+> **WARNING**:
+> The `--privileged` is so that the container will have `/dev/kvm` access.
+
+## How to update `crosvm-base`
+
+The `crosvm-base` `Dockerfile` downloads, builds, and install specific library versions needed to
+test crosvm. It also defines a run time environment and default command line for performing a test.
+If an update or new library is needed or any other adjustment is required, a new image can be
+generated as follows:
+
+```shell
+cd crosvm/kokoro
+docker build -t crosvm-base - < Dockerfile
+docker save crosvm-base | xz -T 0 -z >crosvm-base.tar.xz
+```
+
+If you have x20 access, move `crosvm-base.tar.xz` to `/teams/chromeos-vm/docker/` and ensure the
+owner is `chromeos-vm-ci-read-write`. This owner is used to allow Kokoro to read the base image in
+during the test run. The updated image will be used for future Kokoro runs until it is replaced.
+
+> **WARNING**:
+> If the image tarball uploaded to x20 is defective in any way, Kokoro will fail to verify every
+> crosvm change as if the change itself were defective. Please verify the image is good before
+> uploading to x20.
+
+## How to simulate Kokoro before uploading
+
+If you want to test a change before uploading it in a similar environment to Kokoro, use the
+[`kokoro_simulator.sh`](kokoro_simulator.sh) script. It will invoke the `build.sh` script after
+exporting environment variables and a volume that are expected to be present. The crosvm source code
+is symlinked in, and is tested exactly as in the working directory. Any changes to `build.sh` will
+also be tested, but any changes to `presubmit.cfg` will have no effect. If there are any changes to
+`Dockerfile`, they will have no effect unless the `crosvm-base` image is removed (or never existed)
+from the local Docker daemon. To test `Dockerfile` changes use the following formula to purge
+`crosvm-base`.
+
+```shell
+# So that kokoro_simulator.sh doesn't skip `docker save`.
+rm /tmp/kokoro_simulator/crosvm-base.tar.xz
+
+# Stopped containers prevent the removal of images below.
+docker container prune
+
+# So that kokoro_simulator.sh doesn't skip `docker build`.
+docker rmi crosvm-base
+```
+
+心
\ No newline at end of file
diff --git a/kokoro/build.sh b/kokoro/build.sh
index 1d0acb9..f41fa64 100755
--- a/kokoro/build.sh
+++ b/kokoro/build.sh
@@ -6,14 +6,26 @@
 set -ex
 
 main() {
-    if [ -z "${KOKORO_ARTIFACTS_DIR}" ]; then
-        echo "This script must be run in kokoro"
-        exit 1
-    fi
+  if [ -z "${KOKORO_ARTIFACTS_DIR}" ]; then
+    echo "This script must be run in kokoro"
+    exit 1
+  fi
 
-    local src_root="${KOKORO_ARTIFACTS_DIR}"/git/crosvm
+  local src_root="${KOKORO_ARTIFACTS_DIR}"/git/crosvm
+  local base_image_tarball="${KOKORO_GFILE_DIR}"/crosvm-base.tar.xz
+  local base_image="crosvm-base"
 
-    return 0
+  if [[ "$(docker images -q ${base_image} 2> /dev/null)" == "" ]]; then
+    docker load -i "${base_image_tarball}"
+  fi
+  docker run \
+    --privileged \
+    -e TEST_RUNNER_FLAGS='--format terse' \
+    -v /dev/log:/dev/log \
+    -v "${src_root}":/src:ro \
+    ${base_image}
+
+  return 0
 }
 
 main "$@"
diff --git a/kokoro/kokoro_simulator.sh b/kokoro/kokoro_simulator.sh
new file mode 100755
index 0000000..681ce89
--- /dev/null
+++ b/kokoro/kokoro_simulator.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -ex
+
+main() {
+  cd "$(dirname "$0")"
+
+  local kokoro_simulator_root=/tmp/kokoro_simulator
+  local src_root="${kokoro_simulator_root}"/git/crosvm
+  local base_image_tarball="${kokoro_simulator_root}"/crosvm-base.tar.xz
+  local base_image="crosvm-base"
+
+  mkdir -p "${kokoro_simulator_root}"
+  if [[ ! -e "${base_image_tarball}" ]]; then
+    if [[ "$(docker images -q ${base_image} 2> /dev/null)" == "" ]]; then
+      docker build -t ${base_image} - < Dockerfile
+    fi
+    docker save ${base_image} | xz -T 0 -z >"${base_image_tarball}"
+  fi
+
+  if [[ ! -e "${src_root}" ]]; then
+    mkdir -p "${kokoro_simulator_root}"/git
+    ln -s "$(realpath ../)" "${src_root}"
+  fi
+
+  export KOKORO_ARTIFACTS_DIR="${kokoro_simulator_root}"
+  export KOKORO_GFILE_DIR="${kokoro_simulator_root}"
+
+  ./build.sh
+}
+
+main "$@"
diff --git a/kokoro/presubmit.cfg b/kokoro/presubmit.cfg
index 4f52557..3dc7682 100644
--- a/kokoro/presubmit.cfg
+++ b/kokoro/presubmit.cfg
@@ -1,3 +1,5 @@
 # Format: //devtools/kokoro/config/proto/build.proto
 
 build_file: "crosvm/kokoro/build.sh"
+
+gfile_resources: "/x20/teams/chromeos-vm/docker/crosvm-base.tar.xz"