---
###########
# 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'
    submodule-disable: false
    submodule-timeout: 10

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

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

- 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

    publishers:
      - lf-infra-publish