#!/bin/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
