image: jhipster/jhipster:v7.6.0

cache:
  - key: '$CI_COMMIT_REF_NAME'
    paths:
      - .maven/

stages:
  - setup
  - lint
  - build
  - test
  - analyze
  - package
  - release
  - deploy

before_script:
  - export NG_CLI_ANALYTICS="false"
  - export MAVEN_USER_HOME=`pwd`/.maven

npm-install:
  stage: setup
  script:
    - npm install
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull-push

checkstyle:
  stage: lint
  script:
    - ./mvnw -ntp checkstyle:check -Dmaven.repo.local=$MAVEN_USER_HOME
  needs: []

prettier:
  stage: lint
  script:
    - npm run prettier:check
  allow_failure: true
  needs: [npm-install]
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull

eslint:
  stage: lint
  script:
    # eslint exits 0 on warnings, this is a workaround to exit 1 when warnings are present.
    - 'npm run lint | tee lint.log'
    - "! grep -qE '✖ [0-9]+ problem' lint.log"
  allow_failure: true
  needs: [npm-install]
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull

maven-compile:
  stage: build
  script:
    - ./mvnw -ntp compile -P-webapp -Dmaven.repo.local=$MAVEN_USER_HOME
  artifacts:
    paths:
      - target/classes/
      - target/generated-sources/
    expire_in: 1 day
  needs: []

maven-test:
  # DinD service is required for Testcontainers
  services:
    - docker:20-dind
  variables:
    # Instruct Testcontainers to use the daemon of DinD.
    DOCKER_HOST: 'tcp://docker:2375'
    DOCKER_TLS_CERTDIR: ''
  stage: test
  script:
    - ./mvnw -ntp test -P-webapp -Dmaven.repo.local=$MAVEN_USER_HOME -Dspring.profiles.active=testcontainers || FAILED=true
    - ./mvnw -ntp integration-test -P-webapp -Dmaven.repo.local=$MAVEN_USER_HOME -Dspring.profiles.active=testcontainers || FAILED=true
  artifacts:
    reports:
      junit:
        - target/surefire-reports/TEST-*.xml
        - target/failsafe-reports/TEST-*.xml
    paths:
      - target/surefire-reports
      - target/failsafe-reports
      - target/site
    when: always
    expire_in: 30 day
  allow_failure: true
  needs: []

frontend-test:
  stage: test
  script:
    - npm test
  artifacts:
    reports:
      junit: target/test-results/TESTS-results-jest.xml
    paths:
      - target/test-results
      - target/jacoco
    when: always
    expire_in: 1 day
  allow_failure: true
  needs: [npm-install]
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull

sonar-analyze:
  stage: analyze
  dependencies:
    - maven-test
    - frontend-test
  script:
    - ./mvnw -ntp org.jacoco:jacoco-maven-plugin:prepare-agent initialize sonar:sonar -Dsonar.organization=codeAbility -Dsonar.host.url=https://qe-sonarqube.uibk.ac.at/ -Dsonar.login=${SONAR_TOKEN_QE} -Dmaven.repo.local=$MAVEN_USER_HOME
    - ./mvnw -ntp org.jacoco:jacoco-maven-plugin:prepare-agent initialize sonar:sonar -Dsonar.organization=codeAbility -Dsonar.host.url=https://server.arctis.at/sonar/ -Dsonar.login=${SONAR_TOKEN} -Dmaven.repo.local=$MAVEN_USER_HOME
  allow_failure: true

maven-package:
  stage: package
  script:
    - ./mvnw -ntp verify -Pprod -DskipTests -Dmaven.repo.local=$MAVEN_USER_HOME
  artifacts:
    paths:
      - target/*.jar
      - target/classes
    expire_in: 1 day
  # Uncomment the following line to use gitlabs container registry. You need to adapt the REGISTRY_URL in case you are not using gitlab.com
  #docker-push:
  #    stage: release
  #    variables:
  #        REGISTRY_URL: registry.gitlab.com
  #        IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHA
  #    dependencies:
  #        - maven-package
  #    script:
  #        - ./mvnw -ntp jib:build -Pprod -Djib.to.image=$IMAGE_TAG -Djib.to.auth.username=gitlab-ci-token  -Djib.to.auth.password=$CI_BUILD_TOKEN -Dmaven.repo.local=$MAVEN_USER_HOME
  when: manual