Revert "Revert "Add multiplatform jobs for policy docker images""
[ci-management.git] / jjb / global-templates-docker.yaml
index 8650086..eecedd4 100644 (file)
@@ -24,6 +24,8 @@
     # Default to LF standard 'snapshots' docker registry
     docker_registry: '$DOCKER_REGISTRY:10003'
     docker_tag: 'latest'
+    submodule-disable: false
+    submodule-timeout: 10
 
     #####################
     # Job Configuration #
@@ -65,6 +67,7 @@
           server: '{server-name}'
           project: '{project}'
           branch: '{branch}'
+          files: '{files}'
 
 - docker_merge_boiler_plate: &docker_merge_boiler_plate
     name: docker_merge_boiler_plate
@@ -80,7 +83,7 @@
           server: '{server-name}'
           project: '{project}'
           branch: '{branch}'
-          files: '**'
+          files: '{files}'
       - pollscm:
           cron: ''
 
     <<: *docker_merge_boiler_plate
 
     builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_NAME={docker_name}
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
+            BUILD_MODE=SNAPSHOT
             DOCKERREGISTRY={docker_registry}
       # Do the docker build
       - shell: !include-raw: ../shell/docker-build.sh
       # Provided all steps have already passed, push the docker image
       - shell: !include-raw: ../shell/docker-push.sh
 
+- job-template:
+    name: '{project-name}-{stream}-merge-docker-cascade-trigger'
+    # Job template for Docker merge jobs
+    #
+    # The purpose of this job template is to run a docker build, and potentially
+    # test validation of the docker image. This job is triggered by the it's corresponding
+    # job that builds the artifacts from which the docker image is built from. Projects
+    # using the {project-name}-{stream}-merge-docker job should move to this job. Because
+    # the {project-name}-{stream}-merge-docker has no garanties that the docker image is built
+    # from merged artifact.
+
+    <<: *docker_job_boiler_plate
+    # yamllint disable-line rule:key-duplicates
+    <<: *docker_merge_boiler_plate
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            BUILD_MODE=SNAPSHOT
+            DOCKERREGISTRY={docker_registry}
+      # Do the docker build
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
+
 - job-template:
     name: '{project-name}-{stream}-verify-docker'
     # Job template for Docker verify jobs
     <<: *docker_verify_boiler_plate
 
     builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_NAME={docker_name}
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
+            BUILD_MODE=SNAPSHOT
             DOCKERREGISTRY={docker_registry}
       # Do the docker build
       - shell: !include-raw: ../shell/docker-build.sh
       # Execute any post build clean-up or testing
       - shell: '{post_build_script}'
 
+- job-template:
+    name: '{project-name}-{stream}-verify-docker-cascade-trigger'
+    # Job template for Docker verify jobs
+    #
+    # The purpose of this job template is to run a docker build, and potentially
+    # test validation of the docker image. This job is triggered by the it's corresponding
+    # job that builds the artifacts from which the docker image is built from. Projects
+    # using the {project-name}-{stream}-verify-docker job should move to this job. Because
+    # the {project-name}-{stream}-verify-docker has no garanties that the docker image is built
+    # from merged artifact.
+
+    ######################
+    # Default parameters #
+    ######################
+
+    <<: *docker_job_boiler_plate
+    # yamllint disable-line rule:key-duplicates
+    <<: *docker_verify_boiler_plate
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            BUILD_MODE=SNAPSHOT
+            DOCKERREGISTRY={docker_registry}
+      # Do the docker build
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
+
 - job-template:
     name: '{project-name}-{stream}-release-version-docker-daily-no-sonar'
     # Job template for Docker daily release jobs
     #     branch:    git branch (eg. stable/lithium or master)
     <<: *docker_job_boiler_plate
 
-    docker_registry: '$DOCKER_REGISTRY:10004'
+    docker_registry: '$DOCKER_REGISTRY:10003'
 
     scm:
       - lf-infra-gerrit-scm:
           refspec: '$GERRIT_REFSPEC'
           branch: '$GERRIT_BRANCH'
           submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
           choosing-strategy: default
 
     builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
             DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
 
       # Do the docker build
       - shell: !include-raw: ../shell/snapshot-strip.sh
 
     triggers:
       # 11 AM UTC
-      - timed: 'H 11 * * *'
+      - timed: '@daily'
       - gerrit-trigger-release-manually:
           server: '{server-name}'
           project: '{project}'
           branch: '{branch}'
 
+- job-template:
+    name: '{project-name}-{stream}-release-version-docker-daily-no-sonar-cascade-trigger'
+    # Job template for Docker daily release job.
+    #
+    # The purpose of this job template is to run "docker build and docker push"
+    # for projects using this template. This job is triggered by the daily build
+    # that builds the artifacts required for building the Docker image.
+    #
+    # Required Variables:
+    #     branch:    git branch (eg. stable/lithium or master)
+    <<: *docker_job_boiler_plate
+
+    docker_registry: '$DOCKER_REGISTRY:10003'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
+          choosing-strategy: default
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
+
+      # Do the docker build
+      - shell: !include-raw: ../shell/snapshot-strip.sh
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
+
 - job-template:
     name: '{project-name}-{subproject}-{stream}-merge-docker'
     # Job template for Docker merge jobs
     <<: *docker_merge_boiler_plate
 
     builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=SNAPSHOT
+      # Do the docker build
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+
+- job-template:
+    name: '{project-name}-{subproject}-{stream}-merge-docker-cascade-trigger'
+    # Job template for Docker merge jobs
+    #
+    # The purpose of this job template is to run a docker build, and potentially
+    # test validation of the docker image. This job is triggered by the merge job
+    # that builds the artifacts required for building the Docker image.
+
+    <<: *docker_job_boiler_plate
+    # yamllint disable-line rule:key-duplicates
+    <<: *docker_merge_boiler_plate
+
+    builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
             DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=SNAPSHOT
       # Do the docker build
       - shell: !include-raw: ../shell/docker-build.sh
       - inject:
       - shell: '{post_build_script}'
       # Provided all steps have already passed, push the docker image
       - shell: !include-raw: ../shell/docker-push.sh
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
 
 - job-template:
     name: '{project-name}-{subproject}-{stream}-verify-docker'
     <<: *docker_verify_boiler_plate
 
     builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=SNAPSHOT
+      # Do the docker build
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+
+- job-template:
+    name: '{project-name}-{subproject}-{stream}-verify-docker-cascade-trigger'
+    # Job template for Docker verify jobs
+    #
+    # The purpose of this job template is to run a docker build, and potentially
+    # test validation of the docker image
+
+    ######################
+    # Default parameters #
+    ######################
+
+    <<: *docker_job_boiler_plate
+    # yamllint disable-line rule:key-duplicates
+    <<: *docker_verify_boiler_plate
+
+    builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
             DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=SNAPSHOT
       # Do the docker build
       - shell: !include-raw: ../shell/docker-build.sh
       - inject:
           properties-file: 'env_inject.txt'
       # Execute any post build clean-up or testing
       - shell: '{post_build_script}'
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
 
 - job-template:
     name: '{project-name}-{subproject}-{stream}-release-version-docker-daily-no-sonar'
     #     branch:    git branch (eg. stable/lithium or master)
     <<: *docker_job_boiler_plate
 
-    docker_registry: '$DOCKER_REGISTRY:10004'
+    docker_registry: '$DOCKER_REGISTRY:10003'
 
     scm:
       - lf-infra-gerrit-scm:
           refspec: '$GERRIT_REFSPEC'
           branch: '$GERRIT_BRANCH'
           submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
           choosing-strategy: default
 
     builders:
+      - lf-infra-pre-build
       - lf-infra-docker-login:
           global-settings-file: 'global-settings'
           settings-file: '{mvn-settings}'
             DOCKER_ROOT={docker_root}
             DOCKER_TAG={docker_tag}
             DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
 
       # Do the docker build
       - shell: !include-raw: ../shell/snapshot-strip.sh
 
     triggers:
       # 11 AM UTC
-      - timed: 'H 11 * * *'
+      - timed: '@daily'
       - gerrit-trigger-release-manually:
           server: '{server-name}'
           project: '{project}'
           branch: '{branch}'
+
+- job-template:
+    name: '{project-name}-{subproject}-{stream}-release-version-docker-daily-no-sonar-cascade-trigger'
+    # Job template for Docker daily release jobs
+    #
+    # The purpose of this job template is to run "docker build and docker push"
+    # for projects using this template. This job is triggered by the daily job
+    # that builds the artifacts required for building the Docker image.
+    #
+    # Required Variables:
+    #     branch:    git branch (eg. stable/lithium or master)
+    <<: *docker_job_boiler_plate
+
+    docker_registry: '$DOCKER_REGISTRY:10003'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
+          choosing-strategy: default
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
+
+      # Do the docker build
+      - shell: !include-raw: ../shell/snapshot-strip.sh
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
+
+- job-template:
+    name: '{project-name}-{subproject}-{stream}-release-version-docker-no-sonar'
+    # Job template for Docker final release job
+    #
+    # The purpose of this job template is to run "docker build and docker push"
+    # for projects using this template.
+    #
+    # Required Variables:
+    #     branch:    git branch (eg. stable/lithium or master)
+    <<: *docker_job_boiler_plate
+
+    docker_registry: '$DOCKER_REGISTRY:10003'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
+          choosing-strategy: default
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
+
+      # Do the docker build
+      - shell: !include-raw: ../shell/snapshot-strip.sh
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+
+- job-template:
+    name: '{project-name}-{subproject}-{stream}-release-version-docker-cascade-trigger-no-sonar'
+    # Job template for Docker final release job
+    #
+    # The purpose of this job template is to run "docker build and docker push"
+    # for projects using this template. This job has no cascading counterpart, because the
+    # final release is moved manually to the release repo.
+    #
+    # Required Variables:
+    #     branch:    git branch (eg. stable/lithium or master)
+    <<: *docker_job_boiler_plate
+
+    docker_registry: '$DOCKER_REGISTRY:10003'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-timeout: '{submodule-timeout}'
+          submodule-disable: '{submodule-disable}'
+          choosing-strategy: default
+
+    builders:
+      - lf-infra-pre-build
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: '{pre_build_script}'
+      - inject:
+          # Docker registry is purposely not using an '_' so as to not conflict
+          # with the Jenkins global env var
+          properties-content: |
+            DOCKER_ARGS={docker_build_args}
+            DOCKER_NAME={docker_name}
+            DOCKER_ROOT={docker_root}
+            DOCKER_TAG={docker_tag}
+            DOCKERREGISTRY={docker_registry}
+            BUILD_MODE=STAGING
+
+      # Do the docker build
+      - shell: !include-raw: ../shell/snapshot-strip.sh
+      - shell: !include-raw: ../shell/docker-build.sh
+      - inject:
+          # Import the docker image information from the build step
+          properties-file: 'env_inject.txt'
+      # Execute any post build clean-up or testing
+      - shell: '{post_build_script}'
+      # Provided all steps have already passed, push the docker image
+      - shell: !include-raw: ../shell/docker-push.sh
+    triggers:
+      - reverse:
+          jobs:
+            - '{parent_job}'
+          result: 'success'
+
+- job-template:
+    # Job template for creating a docker manifest list
+    #
+    # The purpose of this job template is to run:
+    # 1. docker_push_manifest.sh script (which needs to exist in the
+    #    project implementation repo)
+
+    name: '{project-name}-docker-manifest-{stream}'
+    <<: *docker_job_boiler_plate
+    node: '{build-node}'
+    build-timeout: 15
+
+    parameters:
+      - lf-infra-parameters:
+          project: '{project}'
+          stream: '{stream}'
+          branch: '{branch}'
+      - string:
+          name: PARENT_JOB_NAME
+          default: 'none'
+
+    disabled: '{obj:disabled}'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-disable: '{submodule-disable}'
+          submodule-timeout: '{submodule-timeout}'
+          choosing-strategy: default
+
+
+    builders:
+      - lf-infra-docker-login:
+          global-settings-file: 'global-settings'
+          settings-file: '{mvn-settings}'
+      - shell: |
+          #!/bin/bash -ex
+          export PARENT_JOB_NAME
+          ./docker_push_manifest.sh
+
+- job-template:
+    # Job template for staging jobs on multiple architectures
+    #
+    # The purpose of this job template is to:
+    # 1. Run parallel maven-docker-stage jobs for each supported architecure
+    # 2. Build and push a docker manifest list for the images created by
+    #    the previous jobs
+
+    name: '{project-name}-multiarch-docker-stage-{stream}'
+    node: '{build-node}'
+    project-type: multijob
+    disabled: '{obj:disabled}'
+    build-timeout: 15
+    pattern: '**'
+
+    parameters:
+      - lf-infra-parameters:
+          project: '{project}'
+          stream: '{stream}'
+          branch: '{branch}'
+      - string:
+          name: DOCKER_REGISTRY
+          default: 'none'
+      - string:
+          name: DOCKERHUB_REGISTRY
+          default: 'registry-1.docker.io'
+
+    disabled: '{obj:disabled}'
+
+    properties:
+      - throttle:
+          max-per-node: 1
+          option: 'project'
+      - build-blocker:
+          use-build-blocker: true
+          blocking-jobs:
+            - '{project-name}-.*-docker-.*'
+          blocking-level: 'NODE'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          git-url: '$GIT_URL/$PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: true
+          submodule-timeout: 10
+          submodule-disable: false
+          choosing-strategy: default
+
+    triggers:
+      - timed: '@daily'
+      - gerrit:
+          server-name: '{gerrit-server-name}'
+          trigger-on:
+             - comment-added-contains-event:
+                 comment-contains-value: '^Patch Set\s+\d+:\s+stage-(docker-)?release\s*$'
+
+          projects:
+            - project-compare-type: ANT
+              project-pattern: '{project}'
+              branches:
+                - branch-compare-type: ANT
+                  branch-pattern: '**/{branch}'
+              file-paths:
+                 - compare-type: ANT
+                   pattern: "**"
+
+    builders:
+      - multijob:
+          name: 'build docker images'
+          condition: ALWAYS
+          execution-type: PARALLEL
+          projects:
+            - name: '{project-name}-amd64-maven-docker-stage-{stream}'
+              kill-phase-on: FAILURE
+              current-parameters: true
+            - name: '{project-name}-arm64-maven-docker-stage-{stream}'
+              kill-phase-on: NEVER
+              current-parameters: true
+      - multijob:
+          name: 'publish docker manifest'
+          condition: SUCCESSFUL
+          execution-type: PARALLEL
+          projects:
+            - name: '{project-name}-docker-manifest-{stream}'
+              current-parameters: true
+              predefined-parameters: |
+                PARENT_JOB_NAME=$JOB_NAME
+                DOCKERHUB_REGISTRY=docker.io