---
###########
# ANCHORS #
###########
- docker_job_boiler_plate: &docker_job_boiler_plate
    name: docker_job_boiler_plate

    project-type: freestyle
    node: '{build-node}'

    ######################
    # Default parameters #
    ######################

    branch: master
    submodule-recursive: true

    # default params for docker jobs
    pre_build_script: ''
    post_build_script: ''
    docker_root: '$WORKSPACE'
    docker_build_args: ''
    docker_name: 'unnamed'
    # Default to LF standard 'snapshots' docker registry
    docker_registry: '$DOCKER_REGISTRY:10003'
    docker_tag: 'latest'

    #####################
    # Job Configuration #
    #####################

    properties:
      - lf-infra-properties:
          build-days-to-keep: '{build-days-to-keep}'

    parameters:
      - lf-infra-parameters:
          branch: '{branch}'
          project: '{project}'
          stream: '{stream}'
          lftools-version: '{lftools-version}'

    wrappers:
      - lf-infra-wrappers:
          build-timeout: '{build-timeout}'
          jenkins-ssh-credential: '{jenkins-ssh-credential}'

    publishers:
      - lf-infra-publish

- docker_verify_boiler_plate: &docker_verify_boiler_plate
    name: docker_verify_boiler_plate

    concurrent: true

    scm:
      - gerrit-trigger-scm:
          refspec: '$GERRIT_REFSPEC'
          choosing-strategy: 'default'
          submodule-recursive: '{submodule-recursive}'

    triggers:
      - gerrit-trigger-patch-submitted:
          status-context: '{project}-Docker-Verify'
          server: '{server-name}'
          project: '{project}'
          branch: '{branch}'
          files: '{files}'

- docker_merge_boiler_plate: &docker_merge_boiler_plate
    name: docker_merge_boiler_plate

    scm:
      - gerrit-trigger-scm:
          refspec: '$GERRIT_REFSPEC'
          choosing-strategy: 'default'
          submodule-recursive: '{submodule-recursive}'

    triggers:
      - gerrit-trigger-patch-merged:
          server: '{server-name}'
          project: '{project}'
          branch: '{branch}'
          files: '{files}'
      - pollscm:
          cron: ''

#################
# JOB TEMPLATES #
#################
- job-template:
    name: '{project-name}-{stream}-merge-docker'
    # 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

    <<: *docker_job_boiler_plate
    # yamllint disable-line rule:key-duplicates
    <<: *docker_merge_boiler_plate

    builders:
      - 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

- 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-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
    #
    # 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-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}'

- 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-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
    #
    # 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
          choosing-strategy: default

    builders:
      - 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:
      # 11 AM UTC
      - timed: 'H 11 * * *'
      - 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
          choosing-strategy: default

    builders:
      - 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
    #
    # The purpose of this job template is to run a docker build, and potentially
    # test validation of the docker image

    <<: *docker_job_boiler_plate
    # yamllint disable-line rule:key-duplicates
    <<: *docker_merge_boiler_plate

    builders:
      - 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-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
    triggers:
      - reverse:
          jobs:
            - '{parent_job}'
          result: 'success'

- job-template:
    name: '{project-name}-{subproject}-{stream}-verify-docker'
    # 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-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-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}'
    triggers:
      - reverse:
          jobs:
            - '{parent_job}'
          result: 'success'

- job-template:
    name: '{project-name}-{subproject}-{stream}-release-version-docker-daily-no-sonar'
    # 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.
    #
    # 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
          choosing-strategy: default

    builders:
      - 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:
      # 11 AM UTC
      - timed: 'H 11 * * *'
      - 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
          choosing-strategy: default

    builders:
      - 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
          choosing-strategy: default

    builders:
      - 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
          choosing-strategy: default

    builders:
      - 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'