.github: Revived remote cache testing

This patch does the following things:

  * ci.remote-execution-cluster.yml -> ci.remote-execution.yml

  * .github/workflows/ci.yml: Refactored to add a second test matrix

    The 'test-services' matrix runs tests which require adjacent services
    run in parallel with the test defined in ci.docker-compose.yml

  * .github/compose/ci.buildstream-remote-cache.yml: Added composition
    file to run the buildstream artifact cache `bst-artifact-server`

  * .github/compose/ci.buildbarn-remote-cache.yml: Added composition
    file to run the buildbarn index and storage services.

  * .github/compose/ci.docker-compose.yml: Add the test declarations
    to run tests with `--remote-cache` to test against the artifact
    cache servers.
diff --git a/.github/compose/buildbarn-config/asset.jsonnet b/.github/compose/buildbarn-config/asset.jsonnet
new file mode 100644
index 0000000..aad06a2
--- /dev/null
+++ b/.github/compose/buildbarn-config/asset.jsonnet
@@ -0,0 +1,32 @@
+{
+  fetcher: {
+    caching: {
+      fetcher: {
+        // We should never be fetching anything which is not already returned by the caching fetcher.
+        'error': {
+          code: 5,
+          message: "Asset Not Found",
+        }
+      }
+    }
+  },
+
+  assetStore: {
+    circular: {
+      directory: '/storage',
+      offsetFileSizeBytes: 1024 * 1024,
+      offsetCacheSize: 1000,
+      dataFileSizeBytes: 100 * 1024 * 1024,
+      dataAllocationChunkSizeBytes: 1048576,
+      instances: [''],
+    },
+  },
+  httpListenAddress: ':1111',
+  grpcServers: [{
+    listenAddresses: [':7981'],
+    authenticationPolicy: { allow: {} },
+  }],
+  allowUpdatesForInstances: [''],
+  maximumMessageSizeBytes: 16 * 1024 * 1024,
+}
+
diff --git a/.github/compose/buildbarn-config/storage.jsonnet b/.github/compose/buildbarn-config/storage.jsonnet
new file mode 100644
index 0000000..11fbdbe
--- /dev/null
+++ b/.github/compose/buildbarn-config/storage.jsonnet
@@ -0,0 +1,26 @@
+{
+  blobstore: {
+    contentAddressableStorage: {
+      circular: {
+        directory: '/cas',
+        offsetFileSizeBytes: 16 * 1024 * 1024,
+        offsetCacheSize: 10000,
+        dataFileSizeBytes: 10 * 1024 * 1024 * 1024,
+        dataAllocationChunkSizeBytes: 16 * 1024 * 1024,
+      },
+    },
+    actionCache: {
+      'error': {
+          code: 12, # UNIMPLEMENTED
+          message: "AC requests are not supported for this endpoint.",
+        }
+    },
+  },
+  httpListenAddress: ':6981',
+  grpcServers: [{
+    listenAddresses: [':7982'],
+    authenticationPolicy: { allow: {} },
+  }],
+  allowAcUpdatesForInstanceNamePrefixes: [''],
+  maximumMessageSizeBytes: 16 * 1024 * 1024,
+}
diff --git a/.github/compose/ci.buildbarn-remote-cache.yml b/.github/compose/ci.buildbarn-remote-cache.yml
new file mode 100644
index 0000000..349a289
--- /dev/null
+++ b/.github/compose/ci.buildbarn-remote-cache.yml
@@ -0,0 +1,55 @@
+##
+# Buildbarn Compose manifest for BuildStream.
+#
+# Spins-up a unnamed and unauthenticated cache server:
+#  - STORAGE at http://localhost:7982
+#  - INDEX at: http://localhost:7981
+#
+# BuildStream configuration snippet:
+#
+# artifacts:
+#   - url: https://localhost:7981
+#     type: index
+#     push: true
+#   - url: https://localhost:7982
+#     type: storage
+#     push: true
+#
+# Basic usage:
+#  - docker-compose -f ci.buildbarn-remote-cache.yml up
+#  - docker-compose -f ci.buildbarn-remote-cache.yml down
+
+version: '3.4'
+
+services:
+  bb-asset:
+    image: buildbarn/bb-remote-asset:20200903T103837Z-90136c4
+    command: /config/asset.jsonnet
+    restart: unless-stopped
+    ports:
+    - "7981:7981"
+    volumes:
+    - type: volume
+      source: assets
+      target: /storage
+    - type: bind
+      source: ./buildbarn-config/
+      target: /config
+
+  bb-storage:
+    image: buildbarn/bb-storage:20200816T115912Z-d83e1f0
+    command: /config/storage.jsonnet
+    restart: unless-stopped
+    ports:
+    - "7982:7982"
+    volumes:
+    - type: volume
+      source: cas
+      target: /cas
+    - type: bind
+      source: ./buildbarn-config/
+      target: /config
+
+volumes:
+  assets:
+  cas:
diff --git a/.github/compose/ci.buildstream-remote-cache.yml b/.github/compose/ci.buildstream-remote-cache.yml
new file mode 100644
index 0000000..9f853fa
--- /dev/null
+++ b/.github/compose/ci.buildstream-remote-cache.yml
@@ -0,0 +1,36 @@
+##
+# A Builstream Artifact Server
+#
+# Spins-up a unnamed and unauthenticated grid:
+#  - artifacts server at: http://localhost:50052
+#
+# BuildStream configuration snippet:
+#
+#    artifacts:
+#      url: http://localhost:50052
+#      push: true
+#
+# Basic usage:
+#  - docker-compose -f ci.buildstream-remote-cache.yml up
+#  - docker-compose -f ci.buildstream-remote-cache.yml down
+#
+version: "3.2"
+
+services:
+  controller:
+    image: buildstream/buildstream:dev
+    command: ["bst-artifact-server","--port",
+      "50052",
+      "--enable-push",
+      "/artifacts"
+    ]
+    ports:
+      - 50052:50052
+    networks:
+      - grid
+networks:
+  grid:
+    driver: bridge
+
+volumes:
+  cache:
diff --git a/.github/compose/ci.docker-compose.yml b/.github/compose/ci.docker-compose.yml
index 88ab894..614a79c 100644
--- a/.github/compose/ci.docker-compose.yml
+++ b/.github/compose/ci.docker-compose.yml
@@ -67,12 +67,33 @@
       REMOTE_EXECUTION_SERVICE: http://localhost:50051
       SOURCE_CACHE_SERVICE: http://localhost:50052
 
-    # The ci.remote-execution-cluster.yml takes care of bringing up
-    # a remote execution cluster, exposing the ports 50052 and 50051
-    # on the localhost network.
-    #
     # We need to use host networking mode in order to be able to
-    # properly resolve these services.
+    # properly resolve services exposed by adjacent containers.
+    #
+    network_mode: host
+
+  buildstream-remote-cache:
+    <<: *tests-template
+    command: tox -vvvvv -- --color=yes --remote-cache
+    environment:
+      TOXENV: ${CI_TOXENV_MAIN}
+      ARTIFACT_CACHE_SERVICE: http://localhost:50052
+
+    # We need to use host networking mode in order to be able to
+    # properly resolve services exposed by adjacent containers.
+    #
+    network_mode: host
+
+  buildbarn-remote-cache:
+    <<: *tests-template
+    command: tox -vvvvv -- --color=yes --remote-cache
+    environment:
+      TOXENV: ${CI_TOXENV_MAIN}
+      ARTIFACT_INDEX_SERVICE: http://localhost:7981
+      ARTIFACT_STORAGE_SERVICE: http://localhost:7982
+
+    # We need to use host networking mode in order to be able to
+    # properly resolve services exposed by adjacent containers.
     #
     network_mode: host
 
diff --git a/.github/compose/ci.remote-execution-cluster.yml b/.github/compose/ci.remote-execution.yml
similarity index 94%
rename from .github/compose/ci.remote-execution-cluster.yml
rename to .github/compose/ci.remote-execution.yml
index 75d0ec7..a663362 100644
--- a/.github/compose/ci.remote-execution-cluster.yml
+++ b/.github/compose/ci.remote-execution.yml
@@ -19,8 +19,8 @@
 #        url: http://localhost:50051
 #
 # Basic usage:
-#  - docker-compose -f buildgrid-compose.yml up
-#  - docker-compose -f buildgrid-compose.yml down
+#  - docker-compose -f ci.remote-execution.yml up
+#  - docker-compose -f ci.remote-execution.yml down
 #
 version: "3.2"
 
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 292e497..5dc2bba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -76,8 +76,21 @@
             run \
             ${{ matrix.test-name }}
 
-  remote-execution:
+  # Matrix of tests which run against remote services which we bring up adjacently
+  service-tests:
     runs-on: ubuntu-20.04
+
+    strategy:
+      matrix:
+
+        # The names here map to valid services defined in "../compose/ci.docker-compose.yml",
+        # and they also map to corresponding filenames of services which are expected
+        # to be run in the background
+        test-name:
+          - remote-execution
+          - buildstream-remote-cache
+          - buildbarn-remote-cache
+
     steps:
       - name: Check out repository
         uses: actions/checkout@v2
@@ -92,26 +105,26 @@
         run: |
           docker-compose \
             --env-file ${GITHUB_WORKSPACE}/.github/common.env \
-            --file ${GITHUB_WORKSPACE}/.github/compose/ci.remote-execution-cluster.yml \
+            --file ${GITHUB_WORKSPACE}/.github/compose/ci.${{ matrix.test-name }}.yml \
             up --detach --renew-anon-volumes --remove-orphans
 
       - name: Run the remote execution tests
         run: |
           docker-compose \
             --env-file ${GITHUB_WORKSPACE}/.github/common.env \
-            --file ${GITHUB_WORKSPACE}/.github/compose/ci.docker-compose.yml run remote-execution
+            --file ${GITHUB_WORKSPACE}/.github/compose/ci.docker-compose.yml run ${{ matrix.test-name }}
 
       - name: Bring down the RE cluster
         run: |
           docker-compose \
             --env-file ${GITHUB_WORKSPACE}/.github/common.env \
-            --file ${GITHUB_WORKSPACE}/.github/compose/ci.remote-execution-cluster.yml stop
+            --file ${GITHUB_WORKSPACE}/.github/compose/ci.${{ matrix.test-name }}.yml stop
           docker-compose \
             --env-file ${GITHUB_WORKSPACE}/.github/common.env \
-            --file ${GITHUB_WORKSPACE}/.github/compose/ci.remote-execution-cluster.yml logs
+            --file ${GITHUB_WORKSPACE}/.github/compose/ci.${{ matrix.test-name }}.yml logs
           docker-compose \
             --env-file ${GITHUB_WORKSPACE}/.github/common.env \
-            --file ${GITHUB_WORKSPACE}/.github/compose/ci.remote-execution-cluster.yml down
+            --file ${GITHUB_WORKSPACE}/.github/compose/ci.${{ matrix.test-name }}.yml down
 
   docs:
     runs-on: ubuntu-20.04