Use remote Bazel cache on https://gerrit-ci.gerritforge.com/cache

Use Bazel cache across different worker nodes: by using the same
global Bazel cache allow reusing artifacts from the previous builds
and avoid running tests if the dependent code hasn't changed.

Using remote Bazel cache also avoids re-building if nothing changed,
as the build artifacts would be fetched from the remote Bazel cache
thanks to cache hits.

In fact, the 'bazel build :release :api' would be a no-op if only
some files were changed that do not contribute to the final artifact
(say contrib directory).

How to test the Bazel cache locally:

$ bazelisk build \
  --remote_cache=https://gerrit-ci.gerritforge.com/cache \
  --noremote_upload_local_results \
  gerrit

Change-Id: I261d086bb5082969f422ff8a79ce6ec3fed7eb9a
diff --git a/jenkins-docker/Makefile b/jenkins-docker/Makefile
index c34859e..5cfc193 100644
--- a/jenkins-docker/Makefile
+++ b/jenkins-docker/Makefile
@@ -1,5 +1,5 @@
-SLAVE_DIRS ?= slave-debian slave-chrome slave-node-wct slave-bazel-nocache slave-bazel slave-bazel-docker slave-sbt slave-mvn slave-release slave-python3 slave-jekyll
-ALL_DIRS ?= master $(SLAVE_DIRS)
+SLAVE_DIRS ?= slave-debian slave-chrome slave-node-wct slave-bazel-nocache slave-bazel-docker slave-sbt slave-mvn slave-release slave-python3 slave-jekyll
+ALL_DIRS ?= master bazel-cache $(SLAVE_DIRS)
 NO_CACHE ?= true
 
 default: build
diff --git a/jenkins-docker/bazel-cache/Dockerfile b/jenkins-docker/bazel-cache/Dockerfile
new file mode 100644
index 0000000..d156129
--- /dev/null
+++ b/jenkins-docker/bazel-cache/Dockerfile
@@ -0,0 +1,17 @@
+FROM nginx:1.17.9-alpine
+
+ENV NGINX_WEBDAV_ALLOW 0.0.0.0/0
+
+COPY default.conf /etc/nginx/conf.d/default.conf.template
+
+COPY entrypoint.sh /
+
+RUN mkdir -p /data/www && \
+    mkdir -p /data/client_temp && \
+    chown -R nginx:nginx /data
+
+RUN apk add gettext
+
+VOLUME [ "/data" ]
+
+ENTRYPOINT /entrypoint.sh
diff --git a/jenkins-docker/bazel-cache/Makefile b/jenkins-docker/bazel-cache/Makefile
new file mode 100644
index 0000000..2623506
--- /dev/null
+++ b/jenkins-docker/bazel-cache/Makefile
@@ -0,0 +1,22 @@
+NO_CACHE=false
+IMAGE=gerritforge/bazel-cache
+CACHE_ALLOW=0.0.0.0/0
+
+# Targets
+
+build:
+	docker build --no-cache=$(NO_CACHE) -t ${IMAGE} .
+
+publish:
+	docker push ${IMAGE}
+
+clean:
+	docker rmi -f ${IMAGE}
+
+start:
+	docker run --rm -d -e NGINX_WEBDAV_ALLOW=${CACHE_ALLOW} --net=host --name bazel_cache ${IMAGE}
+
+stop:
+	docker kill bazel_cache
+
+.PHONY: clean image publish start stop
diff --git a/jenkins-docker/bazel-cache/default.conf b/jenkins-docker/bazel-cache/default.conf
new file mode 100644
index 0000000..180d7c5
--- /dev/null
+++ b/jenkins-docker/bazel-cache/default.conf
@@ -0,0 +1,18 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    location /cache/ {
+        root /data/www;
+        client_body_temp_path /data/client_temp;
+        dav_methods PUT;
+        create_full_put_path on;
+        client_max_body_size 1G;
+        dav_access group:rw all:r;
+
+        limit_except GET {
+            allow $NGINX_WEBDAV_ALLOW;
+            deny  all;
+        }
+    }
+}
diff --git a/jenkins-docker/bazel-cache/entrypoint.sh b/jenkins-docker/bazel-cache/entrypoint.sh
new file mode 100755
index 0000000..ae6d217
--- /dev/null
+++ b/jenkins-docker/bazel-cache/entrypoint.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cat /etc/nginx/conf.d/default.conf.template | envsubst > /etc/nginx/conf.d/default.conf
+nginx -g "daemon off;"
diff --git a/jenkins/gerrit-bazel-verifier-test.sh b/jenkins/gerrit-bazel-verifier-test.sh
index 32e318b..cb89104 100755
--- a/jenkins/gerrit-bazel-verifier-test.sh
+++ b/jenkins/gerrit-bazel-verifier-test.sh
@@ -7,7 +7,7 @@
 echo "Test with mode=$MODE"
 echo '----------------------------------------------'
 
-export BAZEL_OPTS="--spawn_strategy=standalone --genrule_strategy=standalone \
+export BAZEL_OPTS="$BAZEL_OPTS --spawn_strategy=standalone --genrule_strategy=standalone \
                  --test_output errors \
                  --test_summary detailed --flaky_test_attempts 3 \
                  --test_verbose_timeout_warnings --build_tests_only \
diff --git a/jenkins/gerrit-verifier.yaml b/jenkins/gerrit-verifier.yaml
index a1b2494..2858a8e 100644
--- a/jenkins/gerrit-verifier.yaml
+++ b/jenkins/gerrit-verifier.yaml
@@ -110,8 +110,8 @@
     node: bazel-debian
     properties:
       - inject:
-          properties-content: >
-            BAZEL_OPTS=--ram_utilization_factor=30
+          properties-content: "BAZEL_OPTS=--ram_utilization_factor=30 \
+                       --remote_cache=https://gerrit-ci.gerritforge.com/cache"
     builders:
       - merge-target-branch
       - fetch-all-submodules