You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by pi...@apache.org on 2018/04/25 16:34:42 UTC

[geode] branch develop updated: introducing spruce and deploy script for branch-agnostic pipeline (#1854)

This is an automated email from the ASF dual-hosted git repository.

pivotalsarge pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new e3e0e7c  introducing spruce and deploy script for branch-agnostic pipeline (#1854)
e3e0e7c is described below

commit e3e0e7cb23030569ad2b29e2b46c3497935b12d2
Author: Sean Goller <se...@goller.net>
AuthorDate: Wed Apr 25 09:34:38 2018 -0700

    introducing spruce and deploy script for branch-agnostic pipeline (#1854)
    
    [#157005563] [GEODE-5130]
    meta can create pipelines for geode branches
    fix behavior of PARALLEL_DUNIT=false in script
    fix seeding of semver for new branches
---
 ci/pipelines/deploy_meta.sh                        |  22 +
 ci/pipelines/develop.yml                           | 521 ---------------------
 ci/pipelines/geode-build/base.yml                  | 195 ++++++++
 ci/pipelines/geode-build/deploy_pipeline.sh        |  84 ++++
 ci/pipelines/geode-build/test-stubs/acceptance.yml |  27 ++
 .../geode-build/test-stubs/distributed.yml         |  27 ++
 ci/pipelines/geode-build/test-stubs/flaky.yml      |  27 ++
 .../geode-build/test-stubs/integration.yml         |  27 ++
 ci/pipelines/geode-build/test-stubs/ui.yml         |  27 ++
 ci/pipelines/geode-build/test-template.yml         |  84 ++++
 ci/pipelines/meta.yml                              |  37 +-
 ci/scripts/test-run.sh                             |  12 +-
 12 files changed, 554 insertions(+), 536 deletions(-)

diff --git a/ci/pipelines/deploy_meta.sh b/ci/pipelines/deploy_meta.sh
new file mode 100755
index 0000000..11126f8
--- /dev/null
+++ b/ci/pipelines/deploy_meta.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+GEODE_BRANCH=$(git rev-parse --abbrev-ref HEAD)
+TARGET=geode
+
+set -x
+fly -t ${TARGET} set-pipeline -p meta-${GEODE_BRANCH} -c meta.yml --var geode-build-branch=${GEODE_BRANCH}
diff --git a/ci/pipelines/develop.yml b/ci/pipelines/develop.yml
deleted file mode 100644
index 78761c1..0000000
--- a/ci/pipelines/develop.yml
+++ /dev/null
@@ -1,521 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
----
-image_resource: &docker-geode-build-image
-  type: docker-image
-  source:
-    username: ((!docker-username))
-    password: ((!docker-password))
-    repository: gcr.io/apachegeode-ci/((!docker-image-name))
-    tag: latest
-
-resource_types:
-  - name: gcs-resource
-    type: docker-image
-    source:
-      repository: frodenas/gcs-resource
-  - name: email
-    type: docker-image
-    source:
-      repository: pcfseceng/email-resource
-
-resources:
-- name: docker-test-image
-  type: docker-image
-  source:
-    username: ((!docker-username))
-    password: ((!docker-password))
-    repository: gcr.io/apachegeode-ci/((!docker-image-name))
-- name: geode
-  type: git
-  source:
-    uri: https://github.com/apache/geode.git
-    branch: develop
-    ignore_paths:
-    - ci/*
-- name: geode-ci
-  type: git
-  source:
-    depth: 1
-    uri: https://github.com/apache/geode.git
-    branch: develop
-    paths:
-    - ci/*
-- name: geode-examples
-  type: git
-  source:
-    uri: https://github.com/apache/geode-examples.git
-    branch: develop
-    depth: 10
-- name: geode-build-version
-  type: semver
-  source:
-    driver: gcs
-    bucket: ((!concourse-bucket))
-    key: ((!version-key))
-    json_key: ((!concourse-gcp-key))
-    initial_version: 1.3.0
-- name: geode-build-artifact
-  type: gcs-resource
-  source:
-    bucket: ((!public-bucket))
-    json_key: ((!concourse-gcp-key))
-    regexp: artifacts/develop/geodefiles-(.*).tgz
-- name: send-notification-email
-  type: email
-  source:
-    smtp:
-      host: ((!source-email-server))
-      port: "587"
-      username: ((!source-email-username))
-      password: ((!source-email-password))
-    from: ((!source-email-address))
-    to: [ ((!notification-email-address)) ]
-
-groups:
-- name: main
-  jobs:
-  - Build
-  - DistributedTest
-  - AcceptanceTest
-  - IntegrationTest
-  - FlakyTest
-  - TestExamples
-  - UpdatePassingRef
-- name: UITests
-  jobs:
-  - Build
-  - UITests
-
-jobs:
-- name: Build
-  serial: true
-  public: true
-  plan:
-    - get: geode
-      trigger: true
-    - get: geode-ci
-    - get: geode-build-version
-      params: {pre: build}
-    - task: build
-      config:
-        platform: linux
-        inputs:
-        - name: geode
-        - name: geode-ci
-        - name: geode-build-version
-        outputs:
-        - name: built-geode
-        - name: results
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-        run:
-          path: geode-ci/ci/scripts/build.sh
-      on_failure:
-        aggregate:
-          - put: send-notification-email
-            params:
-              subject: results/subject
-              body: results/body
-      ensure:
-        aggregate:
-          - put: geode-build-artifact
-            params:
-              file: built-geode/geodefiles-*.tgz
-          - put: geode-build-version
-            params:
-              file: results/number
-- name: DistributedTest
-  serial: true
-  public: true
-  plan:
-    - aggregate:
-      - get: geode
-        passed: [Build]
-        trigger: true
-      - get: geode-ci
-      - get: geode-build-version
-        passed: [Build]
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: runtests
-      tags: [large]
-      privileged: true
-      timeout: 8h
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-          - name: docker-test-image
-          - name: geode-build-version
-        platform: linux
-        outputs:
-          - name: built-geode
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-          PARALLEL_DUNIT: true
-          DUNIT_PARALLEL_FORKS: 7
-          CALL_STACK_TIMEOUT: 25200
-        run:
-          args:
-          - distributedTest
-          - distributedtestfiles
-          path: geode-ci/ci/scripts/test-run.sh
-      on_failure:
-        aggregate:
-          - put: send-notification-email
-            params:
-              subject: built-geode/subject
-              body: built-geode/body
-      ensure:
-         aggregate:
-         - task: archive-results
-           config:
-             inputs:
-               - name: geode
-               - name: geode-ci
-               - name: geode-build-version
-               - name: built-geode
-             platform: linux
-             image_resource: *docker-geode-build-image
-             params:
-               MAINTENANCE_VERSION: ((!maintenance-version))
-               SERVICE_ACCOUNT: ((!concourse-gcp-account))
-               PUBLIC_BUCKET: ((!public-bucket))
-             run:
-               args:
-               - distributedTest
-               - distributedtestfiles
-               path: geode-ci/ci/scripts/test-archive.sh
-
-- name: AcceptanceTest
-  serial: true
-  public: true
-  plan:
-    - aggregate:
-      - get: geode
-        passed: [Build]
-        trigger: true
-      - get: geode-ci
-      - get: geode-build-version
-        passed: [Build]
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: runtests
-      privileged: true
-      timeout: 8h
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-          - name: docker-test-image
-          - name: geode-build-version
-        platform: linux
-        outputs:
-          - name: built-geode
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-          CALL_STACK_TIMEOUT: 25200
-        run:
-          args:
-          - :geode-assembly:acceptanceTest geode-connectors:acceptanceTest
-          - acceptancetestfiles
-          path: geode-ci/ci/scripts/test-run.sh
-      on_failure:
-        aggregate:
-          - put: send-notification-email
-            params:
-              subject: built-geode/subject
-              body: built-geode/body
-      ensure:
-         aggregate:
-         - task: archive-results
-           config:
-             inputs:
-               - name: geode
-               - name: geode-ci
-               - name: geode-build-version
-               - name: built-geode
-             platform: linux
-             image_resource: *docker-geode-build-image
-             params:
-               MAINTENANCE_VERSION: ((!maintenance-version))
-               SERVICE_ACCOUNT: ((!concourse-gcp-account))
-               PUBLIC_BUCKET: ((!public-bucket))
-             run:
-               args:
-               - :geode-assembly:acceptanceTest
-               - acceptancetestfiles
-               path: geode-ci/ci/scripts/test-archive.sh
-
-- name: IntegrationTest
-  serial: true
-  public: true
-  plan:
-    - aggregate:
-      - get: geode
-        passed: [Build]
-        trigger: true
-      - get: geode-ci
-      - get: geode-build-version
-        passed: [Build]
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: runtests
-      privileged: true
-      timeout: 8h
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-          - name: docker-test-image
-          - name: geode-build-version
-        platform: linux
-        outputs:
-          - name: built-geode
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-          PARALLEL_DUNIT: true
-          DUNIT_PARALLEL_FORKS: 1
-          CALL_STACK_TIMEOUT: 25200
-        run:
-          args:
-          - integrationTest
-          - integrationtestfiles
-          path: geode-ci/ci/scripts/test-run.sh
-      on_failure:
-        aggregate:
-          - put: send-notification-email
-            params:
-              subject: built-geode/subject
-              body: built-geode/body
-      ensure:
-         aggregate:
-         - task: archive-results
-           config:
-             inputs:
-               - name: geode
-               - name: geode-ci
-               - name: geode-build-version
-               - name: built-geode
-             platform: linux
-             image_resource: *docker-geode-build-image
-             params:
-               MAINTENANCE_VERSION: ((!maintenance-version))
-               SERVICE_ACCOUNT: ((!concourse-gcp-account))
-               PUBLIC_BUCKET: ((!public-bucket))
-             run:
-               args:
-               - integrationTest
-               - integrationtestfiles
-               path: geode-ci/ci/scripts/test-archive.sh
-
-- name: FlakyTest
-  serial: true
-  public: true
-  plan:
-    - aggregate:
-      - get: geode
-        passed: [Build]
-        trigger: true
-      - get: geode-ci
-      - get: geode-build-version
-        passed: [Build]
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: runtests
-      privileged: true
-      timeout: 8h
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-          - name: docker-test-image
-          - name: geode-build-version
-        platform: linux
-        outputs:
-          - name: built-geode
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-          CALL_STACK_TIMEOUT: 25200
-        run:
-          args:
-          - flakyTest
-          - flakytestfiles
-          path: geode-ci/ci/scripts/test-run.sh
-      on_failure:
-        aggregate:
-          - put: send-notification-email
-            params:
-              subject: built-geode/subject
-              body: built-geode/body
-      ensure:
-         aggregate:
-         - task: archive-results
-           config:
-             inputs:
-               - name: geode
-               - name: geode-ci
-               - name: geode-build-version
-               - name: built-geode
-             platform: linux
-             image_resource: *docker-geode-build-image
-             params:
-               MAINTENANCE_VERSION: ((!maintenance-version))
-               SERVICE_ACCOUNT: ((!concourse-gcp-account))
-               PUBLIC_BUCKET: ((!public-bucket))
-             run:
-               args:
-               - flakyTest
-               - flakytestfiles
-               path: geode-ci/ci/scripts/test-archive.sh
-
-- name: UITests
-  serial: true
-  public: true
-  plan:
-    - aggregate:
-      - get: geode
-        passed: [Build]
-        trigger: true
-      - get: geode-ci
-      - get: geode-build-version
-        passed: [Build]
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: runtests
-      privileged: true
-      timeout: 2h
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-          - name: docker-test-image
-          - name: geode-build-version
-        platform: linux
-        outputs:
-          - name: built-geode
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-          PARALLEL_DUNIT: true
-          DUNIT_PARALLEL_FORKS: 1
-          CALL_STACK_TIMEOUT: 25200
-        run:
-          args:
-          - uiTest
-          - uitestfiles
-          path: geode-ci/ci/scripts/test-run.sh
-      ensure:
-         aggregate:
-         - task: archive-results
-           config:
-             inputs:
-               - name: geode
-               - name: geode-ci
-               - name: geode-build-version
-               - name: built-geode
-             platform: linux
-             image_resource: *docker-geode-build-image
-             params:
-               MAINTENANCE_VERSION: ((!maintenance-version))
-               SERVICE_ACCOUNT: ((!concourse-gcp-account))
-               PUBLIC_BUCKET: ((!public-bucket))
-             run:
-               args:
-               - uiTest
-               - uitestfiles
-               path: geode-ci/ci/scripts/test-archive.sh
-
-- name: TestExamples
-  serial: true
-  public: true
-  plan:
-    - get: geode
-      passed: [AcceptanceTest, DistributedTest, IntegrationTest]
-      trigger: true
-    - aggregate:
-      - get: geode-ci
-      - get: geode-examples
-        trigger: true
-      - get: docker-test-image
-        params:
-          rootfs: true
-    - task: testexamples
-      privileged: true
-      timeout: 7h
-      config:
-        inputs:
-          - name: geode-ci
-          - name: geode-examples
-          - name: docker-test-image
-        platform: linux
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-        run:
-          args:
-          path: geode-ci/ci/scripts/build-examples.sh
-
-- name: UpdatePassingRef
-  serial: true
-  public: true
-  plan:
-    - get: geode
-      passed: [AcceptanceTest, DistributedTest, IntegrationTest]
-      trigger: true
-    - get: geode-ci
-    - task: updatepassingref
-      config:
-        inputs:
-          - name: geode
-          - name: geode-ci
-        platform: linux
-        outputs:
-          - name: results
-        image_resource: *docker-geode-build-image
-        params:
-          MAINTENANCE_VERSION: ((!maintenance-version))
-          SERVICE_ACCOUNT: ((!concourse-gcp-account))
-          PUBLIC_BUCKET: ((!public-bucket))
-        run:
-          path: geode-ci/ci/scripts/update-passing-ref.sh
diff --git a/ci/pipelines/geode-build/base.yml b/ci/pipelines/geode-build/base.yml
new file mode 100644
index 0000000..b84988f
--- /dev/null
+++ b/ci/pipelines/geode-build/base.yml
@@ -0,0 +1,195 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+---
+
+resource_types:
+  - name: gcs-resource
+    type: docker-image
+    source:
+      repository: frodenas/gcs-resource
+  - name: email
+    type: docker-image
+    source:
+      repository: pcfseceng/email-resource
+
+resources:
+- name: docker-geode-build-image
+  type: docker-image
+  source:
+    username: ((!docker-username))
+    password: ((!docker-password))
+    repository: gcr.io/apachegeode-ci/((!docker-image-name))
+    tag: latest
+- name: geode
+  type: git
+  source:
+    uri: https://github.com/apache/geode.git
+    branch: (( grab metadata.geode-build-branch ))
+    ignore_paths:
+    - ci/*
+- name: geode-ci
+  type: git
+  source:
+    depth: 1
+    uri: https://github.com/apache/geode.git
+    branch: (( grab metadata.geode-build-branch ))
+    paths:
+    - ci/*
+- name: geode-examples
+  type: git
+  source:
+    uri: https://github.com/apache/geode-examples.git
+    branch: develop
+    depth: 10
+- name: geode-build-version
+  type: semver
+  source:
+    driver: gcs
+    bucket: ((!concourse-bucket))
+    key: (( concat metadata.geode-build-branch "/version" ))
+    json_key: ((!concourse-gcp-key))
+    initial_version: 1.3.0
+- name: geode-build-artifact
+  type: gcs-resource
+  source:
+    bucket: ((!public-bucket))
+    json_key: ((!concourse-gcp-key))
+    regexp: (( concat "artifacts/" metadata.geode-build-branch "/geodefiles-(.*).tgz" ))
+- name: send-notification-email
+  type: email
+  source:
+    smtp:
+      host: ((!source-email-server))
+      port: "587"
+      username: ((!source-email-username))
+      password: ((!source-email-password))
+    from: ((!source-email-address))
+    to: [ ((!notification-email-address)) ]
+
+groups:
+- name: main
+  jobs:
+  - Build
+  - DistributedTest
+  - AcceptanceTest
+  - IntegrationTest
+  - FlakyTest
+  - TestExamples
+  - UpdatePassingRef
+- name: UITests
+  jobs:
+  - Build
+  - UITests
+
+jobs:
+- name: Build
+  serial: true
+  public: true
+  plan:
+    - get: geode
+      trigger: true
+    - get: geode-ci
+    - get: geode-build-version
+      params: {pre: build}
+    - get: docker-geode-build-image
+    - task: build
+      image: docker-geode-build-image
+      config:
+        platform: linux
+        inputs:
+        - name: geode
+        - name: geode-ci
+        - name: geode-build-version
+        outputs:
+        - name: built-geode
+        - name: results
+        params:
+          MAINTENANCE_VERSION: (( grab metadata.geode-build-branch ))
+          SERVICE_ACCOUNT: ((!concourse-gcp-account))
+          PUBLIC_BUCKET: ((!public-bucket))
+        run:
+          path: geode-ci/ci/scripts/build.sh
+      on_failure:
+        aggregate:
+          - put: send-notification-email
+            params:
+              subject: results/subject
+              body: results/body
+      ensure:
+        aggregate:
+          - put: geode-build-artifact
+            params:
+              file: built-geode/geodefiles-*.tgz
+          - put: geode-build-version
+            params:
+              file: results/number
+- name: TestExamples
+  serial: true
+  public: true
+  plan:
+    - get: geode
+      passed: [AcceptanceTest, DistributedTest, IntegrationTest]
+      trigger: true
+    - aggregate:
+      - get: geode-ci
+      - get: geode-examples
+        trigger: true
+      - get: docker-geode-build-image
+        params:
+          rootfs: true
+    - task: testexamples
+      image: docker-geode-build-image
+      privileged: true
+      timeout: 7h
+      config:
+        inputs:
+          - name: geode-ci
+          - name: geode-examples
+          - name: docker-geode-build-image
+        platform: linux
+        params:
+          MAINTENANCE_VERSION: (( grab metadata.geode-build-branch ))
+          SERVICE_ACCOUNT: ((!concourse-gcp-account))
+          PUBLIC_BUCKET: ((!public-bucket))
+        run:
+          args:
+          path: geode-ci/ci/scripts/build-examples.sh
+
+- name: UpdatePassingRef
+  serial: true
+  public: true
+  plan:
+    - get: geode
+      passed: [AcceptanceTest, DistributedTest, IntegrationTest]
+      trigger: true
+    - get: geode-ci
+    - task: updatepassingref
+      image: docker-geode-build-image
+      config:
+        inputs:
+          - name: geode
+          - name: geode-ci
+        platform: linux
+        outputs:
+          - name: results
+        params:
+          MAINTENANCE_VERSION: (( grab metadata.geode-build-branch ))
+          SERVICE_ACCOUNT: ((!concourse-gcp-account))
+          PUBLIC_BUCKET: ((!public-bucket))
+        run:
+          path: geode-ci/ci/scripts/update-passing-ref.sh
diff --git a/ci/pipelines/geode-build/deploy_pipeline.sh b/ci/pipelines/geode-build/deploy_pipeline.sh
new file mode 100755
index 0000000..7e33cf9
--- /dev/null
+++ b/ci/pipelines/geode-build/deploy_pipeline.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+SOURCE="${BASH_SOURCE[0]}"
+while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
+  SCRIPTDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+  SOURCE="$(readlink "$SOURCE")"
+  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
+done
+SCRIPTDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+
+if ! [ -x "$(command -v spruce)" ]; then
+    echo "Spruce must be installed for pipeline deployment to work."
+    echo "For macos: 'brew tap starkandwayne/cf; brew install spruce'"
+    echo "For Ubuntu: follow the instructions at https://github.com/geofffranks/spruce"
+    echo ""
+    exit 1
+else
+    SPRUCE=$(which spruce || true)
+fi
+
+set -e
+
+if [ -z "${GEODE_BRANCH}" ]; then
+  GEODE_BRANCH=$(git rev-parse --abbrev-ref HEAD)
+fi
+
+if [ "${GEODE_BRANCH}" = "HEAD" ]; then
+  echo "Unable to determine branch for deployment. Quitting..."
+  exit 1
+fi
+
+BIN_DIR=${OUTPUT_DIRECTORY}/bin
+TMP_DIR=${OUTPUT_DIRECTORY}/tmp
+mkdir -p ${BIN_DIR} ${TMP_DIR}
+curl -o ${BIN_DIR}/fly "https://concourse.apachegeode-ci.info/api/v1/cli?arch=amd64&platform=linux"
+chmod +x ${BIN_DIR}/fly
+
+PATH=${PATH}:${BIN_DIR}
+
+for i in ${SCRIPTDIR}/test-stubs/*.yml; do
+  X=$(basename $i)
+  echo "Merging ${i} into ${TMP_DIR}/${X}"
+  ${SPRUCE} merge --prune metadata \
+    <(echo "metadata:"; \
+      echo "  geode-build-branch: ${GEODE_BRANCH}") \
+    ${SCRIPTDIR}/test-template.yml \
+    ${i} > ${TMP_DIR}/${X}
+done
+
+echo "Spruce branch-name into resources"
+${SPRUCE} merge --prune metadata \
+  ${SCRIPTDIR}/base.yml \
+  <(echo "metadata:"; \
+    echo "  geode-build-branch: ${GEODE_BRANCH}"; \
+    echo "  ") \
+  ${TMP_DIR}/*.yml > ${TMP_DIR}/final.yml
+
+
+TARGET="geode"
+
+TEAM="staging"
+if [[ "${GEMFIRE_BUILD_BRANCH}" == develop ]] || [[ ${GEMFIRE_BUILD_BRANCH} =~ ^support/* ]]; then
+  TEAM="main"
+fi
+
+fly login -t ${TARGET} -n ${TEAM} -c https://concourse.apachegeode-ci.info -u ${CONCOURSE_USERNAME} -p ${CONCOURSE_PASSWORD}
+fly -t ${TARGET} set-pipeline --non-interactive --pipeline ${GEODE_BRANCH} --config ${TMP_DIR}/final.yml
+
diff --git a/ci/pipelines/geode-build/test-stubs/acceptance.yml b/ci/pipelines/geode-build/test-stubs/acceptance.yml
new file mode 100644
index 0000000..45da578
--- /dev/null
+++ b/ci/pipelines/geode-build/test-stubs/acceptance.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+metadata:
+  job:
+    name: AcceptanceTest
+    gradle_task: :geode-assembly:acceptanceTest geode-connectors:acceptanceTest
+    artifact_slug: acceptancetestfiles
+    dunit:
+      parallel: false
+      forks: 0
+    call_stack_timeout: 25200
+    timeout: 8h
+    size: []
diff --git a/ci/pipelines/geode-build/test-stubs/distributed.yml b/ci/pipelines/geode-build/test-stubs/distributed.yml
new file mode 100644
index 0000000..93a8c6a
--- /dev/null
+++ b/ci/pipelines/geode-build/test-stubs/distributed.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+metadata:
+  job:
+    name: DistributedTest
+    gradle_task: distributedTest
+    artifact_slug: distributedtestfiles
+    dunit:
+      parallel: true
+      forks: 7
+    call_stack_timeout: 25200
+    timeout: 8h
+    size: [large]
diff --git a/ci/pipelines/geode-build/test-stubs/flaky.yml b/ci/pipelines/geode-build/test-stubs/flaky.yml
new file mode 100644
index 0000000..b5d7afb
--- /dev/null
+++ b/ci/pipelines/geode-build/test-stubs/flaky.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+metadata:
+  job:
+    name: FlakyTest
+    gradle_task: flakyTest
+    artifact_slug: flakytestfiles
+    dunit:
+      parallel: false
+      forks: 0
+    call_stack_timeout: 25200
+    timeout: 8h
+    size: []
diff --git a/ci/pipelines/geode-build/test-stubs/integration.yml b/ci/pipelines/geode-build/test-stubs/integration.yml
new file mode 100644
index 0000000..e672f64
--- /dev/null
+++ b/ci/pipelines/geode-build/test-stubs/integration.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+metadata:
+  job:
+    name: IntegrationTest
+    gradle_task: integrationTest
+    artifact_slug: integrationtestfiles
+    dunit:
+      parallel: true
+      forks: 1
+    call_stack_timeout: 25200
+    timeout: 8h
+    size: []
diff --git a/ci/pipelines/geode-build/test-stubs/ui.yml b/ci/pipelines/geode-build/test-stubs/ui.yml
new file mode 100644
index 0000000..60404c6
--- /dev/null
+++ b/ci/pipelines/geode-build/test-stubs/ui.yml
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+metadata:
+  job:
+    name: UITests
+    gradle_task: uiTest
+    artifact_slug: uitestfiles
+    dunit:
+      parallel: true
+      forks: 1
+    call_stack_timeout: 25200
+    timeout: 2h
+    size: []
diff --git a/ci/pipelines/geode-build/test-template.yml b/ci/pipelines/geode-build/test-template.yml
new file mode 100644
index 0000000..a29e762
--- /dev/null
+++ b/ci/pipelines/geode-build/test-template.yml
@@ -0,0 +1,84 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+jobs:
+- name: (( grab metadata.job.name ))
+  serial: true
+  public: true
+  plan:
+    - aggregate:
+      - get: geode
+        passed: [Build]
+        trigger: true
+      - get: geode-ci
+      - get: geode-build-version
+        passed: [Build]
+      - get: docker-geode-build-image
+        params:
+          rootfs: true
+    - task: runtests
+      image: docker-geode-build-image
+      tags: (( grab metadata.job.size ))
+      privileged: true
+      timeout: (( grab metadata.job.timeout ))
+      config:
+        inputs:
+          - name: geode
+          - name: geode-ci
+          - name: docker-geode-build-image
+          - name: geode-build-version
+        platform: linux
+        outputs:
+          - name: built-geode
+        params:
+          MAINTENANCE_VERSION: (( grab metadata.geode-build-branch ))
+          SERVICE_ACCOUNT: ((!concourse-gcp-account))
+          PUBLIC_BUCKET: ((!public-bucket))
+          PARALLEL_DUNIT: (( grab metadata.job.dunit.parallel ))
+          DUNIT_PARALLEL_FORKS: (( grab metadata.job.dunit.forks ))
+          CALL_STACK_TIMEOUT: (( grab metadata.job.call_stack_timeout ))
+        run:
+          args:
+          - (( grab metadata.job.gradle_task ))
+          - (( grab metadata.job.artifact_slug ))
+          path: geode-ci/ci/scripts/test-run.sh
+      on_failure:
+        aggregate:
+          - put: send-notification-email
+            params:
+              subject: built-geode/subject
+              body: built-geode/body
+      ensure:
+        aggregate:
+        - task: archive-results
+          image: docker-geode-build-image
+          config:
+            inputs:
+              - name: geode
+              - name: geode-ci
+              - name: geode-build-version
+              - name: built-geode
+            platform: linux
+            params:
+              MAINTENANCE_VERSION: (( grab metadata.geode-build-branch ))
+              SERVICE_ACCOUNT: ((!concourse-gcp-account))
+              PUBLIC_BUCKET: ((!public-bucket))
+            run:
+              args:
+              - (( grab metadata.job.gradle_task ))
+              - (( grab metadata.job.artifact_slug ))
+              path: geode-ci/ci/scripts/test-archive.sh
diff --git a/ci/pipelines/meta.yml b/ci/pipelines/meta.yml
index 63d6b68..7bb4f27 100644
--- a/ci/pipelines/meta.yml
+++ b/ci/pipelines/meta.yml
@@ -36,23 +36,29 @@ resources:
   type: git
   source:
     uri: https://github.com/apache/geode.git
-    branch: develop
+    branch: ((!geode-build-branch))
     paths:
-    - ci/pipelines/develop.yml
+    - ci/*
 - name: geode-docker-images-pipeline
   type: git
   source:
     uri: https://github.com/apache/geode.git
-    branch: develop
+    branch: ((!geode-build-branch))
     paths:
     - ci/pipelines/docker-images.yml
 - name: geode-metrics-pipeline
   type: git
   source:
     uri: https://github.com/apache/geode.git
-    branch: develop
+    branch: ((!geode-build-branch))
     paths:
     - ci/pipelines/metrics.yml
+- name: apachegeode-build-concourse-docker-image
+  type: docker-image
+  source:
+    username: ((!docker-username))
+    password: ((!docker-password))
+    repository: gcr.io/apachegeode-ci/apachegeode-build-concourse
 
 jobs:
 - name: set-develop-pipeline
@@ -61,12 +67,23 @@ jobs:
   plan:
   - get: geode-develop-pipeline
     trigger: true
-  - put: apachegeode-concourse
-    params:
-      pipelines:
-      - name: develop
-        team: main
-        config_file: geode-develop-pipeline/ci/pipelines/develop.yml
+  - get: apachegeode-build-concourse-docker-image
+  - task: deploy-build
+    image: apachegeode-build-concourse-docker-image
+    config:
+      inputs:
+      - name: geode-develop-pipeline
+      outputs:
+      - name: results
+      platform: linux
+      params:
+        OUTPUT_DIRECTORY: results
+        GEODE_BRANCH: ((!geode-build-branch))
+        CONCOURSE_USERNAME: ((!concourse-username))
+        CONCOURSE_PASSWORD: ((!concourse-password))
+      run:
+        path: geode-develop-pipeline/ci/pipelines/geode-build/deploy_pipeline.sh
+
 - name: set-docker-images-pipeline
   serial: true
   public: true
diff --git a/ci/scripts/test-run.sh b/ci/scripts/test-run.sh
index 774ed6c..d211493 100755
--- a/ci/scripts/test-run.sh
+++ b/ci/scripts/test-run.sh
@@ -114,12 +114,14 @@ popd
 
 export FILENAME=${BASE_FILENAME}-${FULL_PRODUCT_VERSION}.tgz
 
-if [ -n "${PARALLEL_DUNIT}" ]; then
+if [[ -n "${PARALLEL_DUNIT}" && "${PARALLEL_DUNIT}" == "true" ]]; then
   PARALLEL_DUNIT="-PparallelDunit"
-fi
-
-if [ -n "${DUNIT_PARALLEL_FORKS}" ]; then
-  DUNIT_PARALLEL_FORKS="-PdunitParallelForks=${DUNIT_PARALLEL_FORKS}"
+  if [ -n "${DUNIT_PARALLEL_FORKS}" ]; then
+    DUNIT_PARALLEL_FORKS="-PdunitParallelForks=${DUNIT_PARALLEL_FORKS}"
+  fi
+else
+  PARALLEL_DUNIT=""
+  DUNIT_PARALLEL_FORKS=""
 fi
 
 pushd ${GEODE_BUILD}

-- 
To stop receiving notification emails like this one, please contact
pivotalsarge@apache.org.