# Based on
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Maven.gitlab-ci.yml
# and
# https://gitlab.stud.idi.ntnu.no/tdt4140-staff/examples/-/blob/master/.gitlab-ci.yml

image: maven:3-openjdk-15-slim

variables:

  # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: " \
    -Dhttps.protocols=TLSv1.2 \
    -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository \
    -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN \
    -Dorg.slf4j.simpleLogger.showDateTime=true \
    -Djava.awt.headless=true"

  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  MAVEN_CLI_OPTS: " \
  --batch-mode \
  --errors \
  --fail-at-end \
  --show-version \
  -Dprism.verbose=true \
  -Dtestfx.robot=glass \
  -Dtestfx.headless=true \
  -Dglass.platform=Monocle \
  -Dprism.order=sw \
  -Dprism.text=t2k \
  -Dtestfx.setup.timeout=60000"

# Cache downloaded dependencies and plugins between builds.
# To keep cache across branches add 'key: "$CI_JOB_NAME"'
cache:
  paths:
    - .m2/repository

stages:
  - build
  - test
  - docs
  - postprocessing
  - deploy

build:
  stage: build
  script:
    - "mvn clean compile $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

unittest:
  stage: test
  needs: [build]
  script:
    - "apt update"
    - "apt install -y openjfx"
    - "mvn package $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/
    when: always
    reports:
      junit:
        - target/surefire-reports/TEST-*.xml
        # TODO: Separate unit tests and integration tests
        # - target/failsafe-reports/TEST-*.xml

generate-coverage:
  stage: docs
  script:
    - "apt update"
    - "apt install -y openjfx"
    - 'mvn clean jacoco:prepare-agent test $MAVEN_CLI_OPTS jacoco:report'
    - 'cat target/site/jacoco/index.html'
  coverage: '/Total.*?([0-9]{1,3})%/'
  artifacts:
    paths:
      - target/site/jacoco

process-coverage:
  stage: postprocessing
  image: haynes/jacoco2cobertura:1.0.4
  needs: [generate-coverage]
  script:
    # convert report from jacoco to cobertura
    - 'python /opt/cover2cover.py target/site/jacoco/jacoco.xml src/main/java > target/site/cobertura.xml'
    # read the <source></source> tag and prepend the path to every filename attribute
    - 'python /opt/source2filename.py target/site/cobertura.xml'
  artifacts:
    reports:
      cobertura: target/site/cobertura.xml

generate-apidocs:
  stage: docs
  script:
    - 'mvn clean javadoc:javadoc'
  artifacts:
    paths:
      - target/site/apidocs

pages:
  stage: deploy
  needs: [generate-coverage, generate-apidocs]
  script:
    - mv target/site/jacoco public/
    - mv target/site/apidocs public/
  artifacts:
    paths:
      - public
    expire_in: 30 days
  only:
    - master