| #!/usr/bin/env bash | 
 | # This helper scripts executes all Bazel tests in our CI environment. | 
 | # https://phab.monogon.dev/harbormaster/plan/2/ | 
 | set -euo pipefail | 
 |  | 
 | DOCKERFILE_HASH=$(sha1sum build/Dockerfile | cut -c -8) | 
 |  | 
 | BUILD_ID=$1; | 
 | BUILD_PHID=$2; | 
 | shift; shift; | 
 |  | 
 | TAG=monogon-version-${DOCKERFILE_HASH} | 
 | CONTAINER=monogon-build-${BUILD_ID} | 
 |  | 
 | # We keep one set of Bazel build caches per working copy to avoid concurrency | 
 | # issues (we cannot run multiple Bazel servers on a given _bazel_root). | 
 | function getWorkingCopyID { | 
 |   local pattern='/var/drydock/workingcopy-([0-9]+)/' | 
 |   [[ "$(pwd)" =~ $pattern ]] | 
 |   echo ${BASH_REMATCH[1]} | 
 | } | 
 |  | 
 | # Main Bazel cache, used as Bazel outputRoot/outputBase. | 
 | CACHE_VOLUME=bazel-cache-$(getWorkingCopyID) | 
 | # Secondary disk cache for Bazel, used to keep build data between configuration | 
 | # switches (saving from spurious rebuilds when switchint from debug to | 
 | # non-debug builds). | 
 | SECONDARY_CACHE_VOLUME=bazel-secondary-cache-$(getWorkingCopyID) | 
 | SECONDARY_CACHE_LOCATION="/user/.cache/bazel-secondary" | 
 | # TODO(q3k): Neither the main nor secondary caches are garbage collected and | 
 | # they will slowly fill up the disk of the CI builder. | 
 |  | 
 | # The Go pkg cache is safe to use concurrently. | 
 | GOPKG_VOLUME=gopkg-cache | 
 |  | 
 | cat > ci.bazelrc <<EOF | 
 | build --disk_cache=${SECONDARY_CACHE_LOCATION} | 
 | EOF | 
 |  | 
 | # We do our own image caching since the podman build step cache does | 
 | # not work across different repository checkouts and is also easily | 
 | # invalidated by multiple in-flight revisions with different Dockerfiles. | 
 | if ! podman image inspect "$TAG" >/dev/null; then | 
 |   echo "Could not find $TAG, building..." | 
 |   podman build -t ${TAG} build | 
 | fi | 
 |  | 
 | function cleanup { | 
 |   rc=$? | 
 |   ! podman kill $CONTAINER | 
 |   ! podman rm $CONTAINER --force | 
 |   exit $rc | 
 | } | 
 |  | 
 | trap cleanup EXIT | 
 |  | 
 | ! podman kill $CONTAINER | 
 | ! podman rm $CONTAINER --force | 
 |  | 
 | ! podman volume create --opt o=nodev,exec ${CACHE_VOLUME} | 
 | ! podman volume create --opt o=nodev ${SECONDARY_CACHE_VOLUME} | 
 | ! podman volume create --opt o=nodev ${GOPKG_VOLUME} | 
 |  | 
 | function bazel() { | 
 |     podman run \ | 
 |         --rm \ | 
 |         --name $CONTAINER \ | 
 |         -v $(pwd):/work \ | 
 |         -v ${CACHE_VOLUME}:/user/.cache/bazel/_bazel_root \ | 
 |         -v ${SECONDARY_CACHE_VOLUME}:${SECONDARY_CACHE_LOCATION} \ | 
 |         -v ${GOPKG_VOLUME}:/user/go/pkg \ | 
 |         --privileged \ | 
 |         ${TAG} \ | 
 |         bazel "$@" | 
 | } | 
 |  | 
 | bazel run //:fietsje | 
 | bazel run //:gazelle -- update | 
 |  | 
 | if [[ ! -z "$(git status --porcelain)" ]]; then | 
 |   echo "Unclean working directory after running gazelle and fietsje:" | 
 |   git diff HEAD | 
 |   cat <<EOF | 
 | Please run: | 
 |  | 
 |   $ bazel run //:fietsje | 
 |   $ bazel run //:gazelle -- update | 
 |  | 
 | in your local branch and add the resulting changes to this diff. | 
 | EOF | 
 |   exit 1 | 
 | fi | 
 |  | 
 | bazel test //... | 
 | bazel test //... -c dbg | 
 |  | 
 | function conduit() { | 
 |   # Get Phabricator host from Git origin | 
 |   local pattern='ssh://(.+?):([0-9]+)' | 
 |   [[ "$(git remote get-url origin)" =~ $pattern ]]; | 
 |   local host=${BASH_REMATCH[1]} | 
 |   local port=${BASH_REMATCH[2]} | 
 |  | 
 |   ssh "$host" -p "$port" conduit $@ | 
 | } | 
 |  | 
 | # Report build results if we made it here successfully | 
 | conduit harbormaster.sendmessage <<EOF | 
 | {"params": "{\"buildTargetPHID\": \"${BUILD_PHID}\", \"type\": \"pass\"}"} | 
 | EOF |