---
# Global macros

# vim: sw=2 ts=2 sts=2 et :

# BUILDERS
- builder:
    name: ci-management-check-unicode
    builders:
      - shell: |
          $WORKSPACE/scripts/check-unicode.sh jjb/

- builder:
    name: provide-maven-settings
    builders:
      - config-file-provider:
          files:
            - file-id: '{global-settings-file}'
              variable: 'GLOBAL_SETTINGS_FILE'
            - file-id: '{settings-file}'
              variable: 'SETTINGS_FILE'

# call maven-target builder with a goal of --version to force Jenkins to
# install the needed maven version
- builder:
    name: maven-install
    builders:
      - maven-target:
          maven-version: '{maven-version}'
          goals: '--version'

- builder:
    name: maven-docker-push-release
    builders:
      - maven-target:
          maven-version: '{maven-version}'
          pom: '{pom}'
          goals: 'clean deploy -B -P {mvn-profile}'
          settings: '{mvn-settings}'
          settings-type: cfp
          global-settings: 'global-settings'
          global-settings-type: cfp
          properties:
            - maven.test.skip=true
            - docker.pull.registry=nexus3.onap.org:10001
            - docker.push.registry=nexus3.onap.org:10002

- builder:
    name: maven-docker-push-daily
    builders:
      - maven-target:
          maven-version: '{maven-version}'
          pom: '{pom}'
          goals: 'clean deploy -B -P {mvn-profile}'
          settings: '{mvn-settings}'
          settings-type: cfp
          global-settings: 'global-settings'
          global-settings-type: cfp
          properties:
            - maven.test.skip=true
            - docker.pull.registry=nexus3.onap.org:10001
            - docker.push.registry=nexus3.onap.org:10003

- builder:
    name: docker-login
    builders:
      - shell: !include-raw: include-docker-login.sh

# PARAMETERS
- parameter:
    name: infra-parameters
    parameters:
      - string:
          name: PROJECT
          default: '{project}'
          # yamllint disable rule:line-length
          description: 'JJB configured PROJECT parameter to identify a Gerrit project'
          # yamllint enable
      - string:
          name: ARCHIVE_ARTIFACTS
          default: '{artifacts} **/target/surefire-reports/*-output.txt'
          # yamllint disable rule:line-length
          description: 'Space separated glob patterns for artifacts to archive to logs hosting'
          # yamllint enable
      - string:
          name: GERRIT_BRANCH
          default: '{branch}'
          description: 'JJB configured GERRIT_BRANCH parameter'
      - string:
          name: GERRIT_PROJECT
          default: '{project}'
          description: 'GERRIT_PROJECT parameter if not given by trigger'
      - string:
          name: GERRIT_REFSPEC
          default: '{refspec}'
          description: 'GERRIT_REFSPEC parameter if not given by trigger'
      - string:
          name: STACK_NAME
          default: '$JOB_NAME-$BUILD_NUMBER'
          description: 'Used by Heat to generate a unique stack & vm name'

- parameter:
    name: maven-exec
    parameters:
      - string:
          name: MVN
          # yamllint disable rule:line-length
          default: '/w/tools/hudson.tasks.Maven_MavenInstallation/{maven-version}/bin/mvn'
          # yamllint enable
          description: 'Maven selector to be used by shell scripts'

- parameter:
    name: docker-image-name
    parameters:
      - string:
          name: DOCKER_IMAGE_NAME
          # yamllint disable rule:line-length
          default: '{docker-image-name}'
          # yamllint enable
          description: 'Docker image name, e.g. onap/appc'

# PROPERTIES
- property:
    name: infra-properties
    properties:
      - build-discarder:
          days-to-keep: '{build-days-to-keep}'
          num-to-keep: 40
          artifact-days-to-keep: -1
          artifact-num-to-keep: 5

# PUBLISHERS
- publisher:
    name: archive-artifacts
    publishers:
      - archive:
          artifacts: '{artifacts}'
          allow-empty: true
          fingerprint: true
          latest-only: true

- publisher:
    name: email-notification
    publishers:
      - email-ext:
          recipients: 'nobody@open-o.org'
          reply-to:
          content-type: default
          # yamllint disable rule:line-length
          subject: '{email-prefix} $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!'
          # yamllint enable
          body: |
            $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:

            Check console output at $BUILD_URL to view the results.
          unstable: true
          fixed: true
          send-to:
            - developers
            - recipients

- publisher:
    name: jacoco-report
    publishers:
      - jacoco:
          exec-pattern: '**/**.exec'
          class-pattern: '**/classes'
          source-pattern: '**/src/main/java'
          # yamllint disable rule:line-length
          exclusion-pattern: '**/gen**,**/generated-sources/**,**/yang-gen**,**/pax/**'
          # yamllint enable
          status-update: true
          targets:
            - branch:
                healthy: 10
                unhealthy: 20
            - method:
                healthy: 50
                unhealthy: 40

- publisher:
    name: checkstyle-result
    publishers:
      - checkstyle:
          pattern: '**/checkstyle-result.xml'
          healthy: 0
          unhealthy: 100
          health-threshold: 'high'
          thresholds:
            unstable:
              total-all: 30
              total-high: 15
              total-normal: 20
              total-low: 25
              new-all: 5
              new-high: 0
              new-normal: 2
              new-low: 5

- publisher:
    name: checkstyle-result-daily
    publishers:
      - checkstyle:
          pattern: '**/checkstyle-result.xml'
          healthy: 0
          unhealthy: 100
          health-threshold: 'high'
          thresholds:
            unstable:
              total-all: 30
              total-high: 15
              total-normal: 20
              total-low: 25
              new-all: 1
              new-high: 0
              new-normal: 1
              new-low: 1

- publisher:
    name: infra-shiplogs
    # To archive things, the job will need to create an "archives" directory in
    # the workspace and this macro will handle copying the contents of the
    # archives directory.
    #
    # Uses the build parameter ARCHIVE_ARTIFACTS if not empty to find files to
    # archive. You can pass globstar patterns for example "**/*.xml **/*.log" as
    # the archive pattern. This is a space separated list of files to archive.
    #
    # Also ensure that the workspace is cleaned up at the end of the build.
    publishers:
      - postbuildscript:
          builders:
            - shell: !include-raw-escape: include-raw-deploy-archives.sh
            - maven-target:
                maven-version: '{maven-version}'
                pom: '.archives/deploy-archives.xml'
                goals: 'clean deploy -V -B -q -Dmaven.repo.local=/tmp/r'
                settings: 'jenkins-log-archives-settings'
                settings-type: cfp
                global-settings: 'global-settings'
                global-settings-type: cfp
            - description-setter:
                regexp: '^Build logs: .*'
          script-only-if-succeeded: false
          script-only-if-failed: false
          mark-unstable-if-failed: true
      - workspace-cleanup:
          fail-build: false`

# SCMS
- scm:
    name: git-scm
    scm:
      - git:
          credentials-id: 'onap-jenkins-ssh'
          url: '$GIT_BASE'
          refspec: ''
          branches:
            - 'origin/{branch}'
          skip-tag: true
          wipe-workspace: true
          timeout: 30

- scm:
    name: gerrit-trigger-scm
    scm:
      - git:
          credentials-id: 'onap-jenkins-ssh'
          url: '$GIT_BASE'
          refspec: '{refspec}'
          branches:
            - 'origin/$GERRIT_BRANCH'
          skip-tag: true
          timeout: 30
          choosing-strategy: '{choosing-strategy}'
          submodule:
            recursive: '{submodule-recursive}'

- scm:
    name: gerrit-trigger-scm-basedir
    scm:
      - git:
          credentials-id: 'onap-jenkins-ssh'
          url: '$GIT_BASE'
          refspec: '{refspec}'
          branches:
            - 'origin/$GERRIT_BRANCH'
          skip-tag: true
          timeout: 30
          choosing-strategy: '{choosing-strategy}'
          basedir: '{basedir}'

- scm:
    name: git-branch-scm
    scm:
      - git:
          credentials-id: 'onap-jenkins-ssh'
          url: '$GIT_BASE'
          refspec: ''
          branches:
            - 'origin/{branch}'
          skip-tag: true
          timeout: 30
          wipe-workspace: true

- scm:
    name: git-extra-project
    scm:
      - git:
          credentials-id: 'onap-jenkins-ssh'
          url: '$GIT_NO_PROJECT/{project}'
          refspec: '{refspec}'
          branches:
            - 'origin/{branch}'
          skip-tag: true
          timeoute: 30
          wipe-workspace: false
          basedir: '{checkout-dir}'

# TRIGGERS

# This is a single macro to use for all jobs who vote on every (relevant) patch
# set. Only 'recheck' trigger word is supported, it always triggers the full set
# of relevant jobs, in order to prevent Jenkins from starting only a subset and
# still voting Verified+1
# Arguments:
#     server: name of gerrit server to listen to
#     project: pattern to match triggering projects
#     branch: triggering branch name
#     files: pattern to match triggering filepaths
- trigger:
    name: gerrit-trigger-patch-submitted
    triggers:
      - gerrit:
          server-name: '{server}'
          trigger-on:
            - patchset-created-event:
                exclude-drafts: 'false'
                exclude-trivial-rebase: 'false'
                exclude-no-code-change: 'false'
            - draft-published-event
            - comment-added-contains-event:
                comment-contains-value: 'recheck'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
              file-paths:
                - compare-type: 'ANT'
                  pattern: '{files}'

- trigger:
    name: gerrit-trigger-patch-merged
    triggers:
      - gerrit:
          server-name: '{server}'
          trigger-on:
            - change-merged-event
            - comment-added-contains-event:
                comment-contains-value: 'remerge'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
              file-paths:
                - compare-type: 'ANT'
                  pattern: '{files}'

- trigger:
    name: gerrit-trigger-release-manually
    triggers:
      - gerrit:
          server-name: '{server}'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'please release'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
              file-paths:
                - compare-type: 'ANT'
                  pattern: '**'

- trigger:
    name: trigger-on-build-success
    triggers:
      - reverse:
          jobs: '{job-name}'
          result: 'success'


# WRAPPERS
- wrapper:
    name: build-timeout
    wrappers:
      - timeout:
          type: absolute
          timeout: 360
          fail: true

- wrapper:
    # This wrapper is required for all jobs as it configures the wrappers
    # needed by the eCOMP infra.
    name: infra-wrappers
    wrappers:
      - timestamps
      - timeout:
          type: absolute
          timeout: '{build-timeout}'
          timeout-var: 'BUILD_TIMEOUT'
          fail: true
      - ssh-agent-credentials:
          users:
            - 'onap-jenkins-ssh'
      - openstack:
          single-use: true