---
# Releng macros
#
# NOTE: make sure macros are listed in execution ordered.
#
# 1. parameters/properties
# 2. scm
# 3. triggers
# 4. wrappers
# 5. prebuilders (maven only, configured like Builders)
# 6. builders (maven, freestyle, matrix, etc..)
# 7. postbuilders (maven only, configured like Builders)
# 8. publishers/reporters/notifications

- parameter:
    name: project-parameter
    parameters:
      - string:
          name: PROJECT
          default: '{project}'
          description: "JJB configured PROJECT parameter to identify an opnfv Gerrit project"
      - string:
          name: GS_BASE
          default: artifacts.opnfv.org/$PROJECT
          description: "URL to Google Storage."
      - string:
          name: GS_BASE_PROXY
          default: build.opnfv.org/artifacts.opnfv.org/$PROJECT
          description: "URL to Google Storage proxy"
      - string:
          name: BRANCH
          default: '{branch}'
          description: "JJB configured BRANCH parameter (e.g. master, stable/danube)"
      - string:
          name: GERRIT_BRANCH
          default: '{branch}'
          description: "JJB configured GERRIT_BRANCH parameter (deprecated)"

- property:
    name: logrotate-default
    properties:
      - build-discarder:
          days-to-keep: 60
          num-to-keep: 200
          artifact-days-to-keep: 60
          artifact-num-to-keep: 200

- scm:
    name: git-scm
    scm:
      - git: &git-scm-defaults
          credentials-id: '$SSH_CREDENTIAL_ID'
          url: '$GIT_BASE'
          branches:
            - 'origin/$BRANCH'
          timeout: 15

- scm:
    name: git-scm-gerrit
    scm:
      - git:
          choosing-strategy: 'gerrit'
          refspec: '$GERRIT_REFSPEC'
          <<: *git-scm-defaults
- scm:
    name: git-scm-with-submodules
    scm:
      - git:
          credentials-id: '$SSH_CREDENTIAL_ID'
          url: '$GIT_BASE'
          refspec: ''
          branches:
            - 'refs/heads/{branch}'
          skip-tag: true
          wipe-workspace: true
          submodule:
            recursive: true
            timeout: 20
- trigger:
    name: 'daily-trigger-disabled'
    triggers:
      - timed: ''

- trigger:
    name: 'weekly-trigger-disabled'
    triggers:
      - timed: ''

- trigger:
    name: gerrit-trigger-patchset-created
    triggers:
      - gerrit:
          server-name: 'gerrit.opnfv.org'
          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'
            - comment-added-contains-event:
                comment-contains-value: 'reverify'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
              file-paths:
                - compare-type: 'ANT'
                  pattern: '{files}'
          skip-vote:
            successful: false
            failed: false
            unstable: false
            notbuilt: false

- trigger:
    name: gerrit-trigger-change-merged
    triggers:
      - gerrit:
          server-name: 'gerrit.opnfv.org'
          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: 'experimental'
    triggers:
      - gerrit:
          server-name: 'gerrit.opnfv.org'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'check-experimental'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
              file-paths:
                - compare-type: 'ANT'
                  pattern: '{files}'
          skip-vote:
            successful: true
            failed: true
            unstable: true
            notbuilt: true

- wrapper:
    name: ssh-agent-wrapper
    wrappers:
      - ssh-agent-credentials:
          users:
            - 'd42411ac011ad6f3dd2e1fa34eaa5d87f910eb2e'

- wrapper:
    name: build-timeout
    wrappers:
      - timeout:
          timeout: '{timeout}'
          timeout-var: 'BUILD_TIMEOUT'
          fail: true

- wrapper:
    name: fix-workspace-permissions
    wrappers:
      - pre-scm-buildstep:
          - shell: |
             #!/bin/bash
             sudo chown -R $USER:$USER $WORKSPACE || exit 1

- builder:
    name: build-html-and-pdf-docs-output
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/
          git clone ssh://gerrit.opnfv.org:29418/opnfvdocs docs_build/_opnfvdocs
          GERRIT_COMMENT=gerrit_comment.txt ./docs_build/_opnfvdocs/scripts/docs-build.sh

- builder:
    name: upload-under-review-docs-to-opnfv-artifacts
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          [[ $GERRIT_CHANGE_NUMBER =~ .+ ]]
          [[ -d docs_output ]] || exit 0

          echo
          echo "###########################"
          echo "UPLOADING DOCS UNDER REVIEW"
          echo "###########################"
          echo

          gs_base="artifacts.opnfv.org/$PROJECT/review"
          gs_path="$gs_base/$GERRIT_CHANGE_NUMBER"
          local_path="upload/$GERRIT_CHANGE_NUMBER"

          mkdir -p upload
          mv docs_output "$local_path"
          gsutil -m cp -r "$local_path" "gs://$gs_base"

          gsutil -m setmeta \
              -h "Content-Type:text/html" \
              -h "Cache-Control:private, max-age=0, no-transform" \
              "gs://$gs_path"/**.html > /dev/null 2>&1

          echo "Document link(s):" >> gerrit_comment.txt
          find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
              sed -e "s|^$local_path|    http://$gs_path|" >> gerrit_comment.txt

- builder:
    name: upload-generated-docs-to-opnfv-artifacts
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          [[ -d docs_output ]] || exit 0

          echo
          echo "########################"
          echo "UPLOADING GENERATED DOCS"
          echo "########################"
          echo

          echo "gs_path="$GS_URL/docs""
          echo "local_path="upload/docs""

          gs_path="$GS_URL/docs"
          local_path="upload/docs"

          mkdir -p upload
          mv docs_output "$local_path"
          ls "$local_path"

          echo "gsutil -m cp -r "$local_path"/* "gs://$gs_path""
          gsutil -m cp -r "$local_path"/* "gs://$gs_path"

          gsutil -m setmeta \
              -h "Content-Type:text/html" \
              -h "Cache-Control:private, max-age=0, no-transform" \
              "gs://$gs_path"/**.html > /dev/null 2>&1

          echo "Document link(s):" >> gerrit_comment.txt
          find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
              sed -e "s|^$local_path|    http://$gs_path|" >> gerrit_comment.txt

# To take advantage of this macro, have your build write
# out the file 'gerrit_comment.txt' with information to post
# back to gerrit and include this macro in the list of builders.
- builder:
    name: report-build-result-to-gerrit
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/
          if [[ -e gerrit_comment.txt ]] ; then
              echo
              echo "posting review comment to gerrit..."
              echo
              cat gerrit_comment.txt
              echo
              ssh -p 29418 gerrit.opnfv.org \
                  "gerrit review -p $GERRIT_PROJECT \
                   -m '$(cat gerrit_comment.txt)' \
                   $GERRIT_PATCHSET_REVISION \
                   --notify NONE"
          fi

- builder:
    name: remove-old-docs-from-opnfv-artifacts
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          [[ $GERRIT_CHANGE_NUMBER =~ .+ ]]

          gs_path="artifacts.opnfv.org/$PROJECT/review/$GERRIT_CHANGE_NUMBER"

          if gsutil ls "gs://$gs_path" > /dev/null 2>&1 ; then
              echo
              echo "Deleting Out-of-dated Documents..."
              gsutil -m rm -r "gs://$gs_path"
          fi
          gs_path="artifacts.opnfv.org/review/$GERRIT_CHANGE_NUMBER"

          if gsutil ls "gs://$gs_path" > /dev/null 2>&1 ; then
              echo
              echo "Deleting Out-of-dated Documents..."
              gsutil -m rm -r "gs://$gs_path"
          fi

- builder:
    name: build-and-upload-artifacts-json-api
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          export PATH=$PATH:/usr/local/bin/

          virtualenv -p python2.7 $WORKSPACE/releng_artifacts
          source $WORKSPACE/releng_artifacts/bin/activate

          # install python packages
          pip install google-api-python-client

          # generate and upload index file
          echo "Generating Artifacts API ..."
          python $WORKSPACE/utils/opnfv-artifacts.py > index.json
          gsutil cp index.json gs://artifacts.opnfv.org/index.json

          deactivate

- builder:
    name: lint-python-code
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          virtualenv -p python2.7 $WORKSPACE/releng_flake8
          source $WORKSPACE/releng_flake8/bin/activate

          # install python packages
          pip install "flake8==2.6.2"

          # generate and upload lint log
          echo "Running flake8 code on $PROJECT ..."

          # Get number of flake8 violations. If none, this will be an
          # empty string: ""
          FLAKE_COUNT="$(find . \
              -path './releng_flake8' -prune -o \
              -path './.tox' -prune -o \
              -type f -name "*.py" -print | \
              xargs flake8 --exit-zero -qq --count 2>&1)"

          # Ensure we start with a clean environment
          rm -f lint.log

          if [ ! -z $FLAKE_COUNT ]; then
            echo "Flake8 Violations: $FLAKE_COUNT" > lint.log
            find . \
                -path './releng_flake8' -prune -o \
                -path './.tox' -prune -o \
                -type f -name "*.py" -print | \
                xargs flake8 --exit-zero --first >> violation.log
            SHOWN=$(wc -l violation.log | cut -d' ' -f1)
            echo -e "First $SHOWN shown\n---" >> lint.log
            cat violation.log >> lint.log
            sed -r -i '4,$s/^/ /g' lint.log
            rm violation.log
          fi

          deactivate

- builder:
    name: report-lint-result-to-gerrit
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          # If no violations were found, no lint log will exist.
          if [[ -e lint.log ]] ; then
              echo -e "\nposting linting report to gerrit...\n"

              cat lint.log
              echo

              ssh -p 29418 gerrit.opnfv.org \
                  "gerrit review -p $GERRIT_PROJECT \
                   -m \"$(cat lint.log)\" \
                   $GERRIT_PATCHSET_REVISION \
                   --notify NONE"

              exit 1
          fi

- builder:
    name: upload-review-docs
    builders:
      - build-html-and-pdf-docs-output
      - upload-under-review-docs-to-opnfv-artifacts
      - report-build-result-to-gerrit

- builder:
    name: upload-merged-docs
    builders:
      - build-html-and-pdf-docs-output
      - upload-generated-docs-to-opnfv-artifacts
      - report-build-result-to-gerrit
      - remove-old-docs-from-opnfv-artifacts

- builder:
    name: check-bash-syntax
    builders:
      - shell: "find . -name '*.sh' | xargs bash -n"

- builder:
    name: lint-yaml-code
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o pipefail
          set -o xtrace
          export PATH=$PATH:/usr/local/bin/

          # install python packages
          pip install "yamllint==1.6.0"

          # generate and upload lint log
          echo "Running yaml code on $PROJECT ..."

          # Ensure we start with a clean environment
          rm -f yaml-violation.log lint.log

          # Get number of yaml violations. If none, this will be an
          # empty string: ""
          find . \
              -type f -name "*.yml" -print \
              -o -name "*.yaml" -print | \
              xargs yamllint > yaml-violation.log || true

          if [ -s "yaml-violation.log" ]; then
            SHOWN=$(cat yaml-violation.log| grep -v "^$" |wc -l)
            echo -e "First $SHOWN shown\n---" > lint.log
            cat yaml-violation.log >> lint.log
            sed -r -i '4,$s/^/ /g' lint.log
          fi

- builder:
    name: clean-workspace
    builders:
      - shell: |
          #!/bin/bash
          set -o errexit
          set -o nounset
          set -o pipefail
          sudo /bin/rm -rf "$WORKSPACE"

- builder:
    name: clean-workspace-log
    builders:
      - shell: |
          find $WORKSPACE -type f -name '*.log' | xargs rm -f

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

- publisher:
    name: publish-coverage
    publishers:
      - cobertura:
          report-file: "coverage.xml"
          only-stable: "true"
          health-auto-update: "false"
          stability-auto-update: "false"
          zoom-coverage-chart: "true"
          targets:
            - files:
                healthy: 10
                unhealthy: 20
                failing: 30
            - method:
                healthy: 50
                unhealthy: 40
                failing: 30

# The majority of the email-ext plugin options are set to the default
# for this macro so they can be managed through Jenkins' global
# settings.
- publisher:
    name: email-jenkins-admins-on-failure
    publishers:
      - email-ext:
          content-type: text
          attach-build-log: true
          compress-log: true
          always: false
          failure: true
          send-to:
            - recipients