image: registry.gitlab.com/openstapps/app

before_script:
  - npm ci

default:
  tags:
    - performance
  interruptible: true

stages:
  - setup
  - build
  - test
  - publish
  - deploy
  - ui test

setup:
  image: registry.gitlab.com/openstapps/projectmanagement/builder
  stage: setup
  only:
    - schedules
  variables:
    DOCKER_DRIVER: overlay2
  services:
    - docker:dind
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
    - docker build -t registry.gitlab.com/openstapps/app .
    - docker push registry.gitlab.com/openstapps/app
  cache: {} # disable irrelevant cache for this job
  before_script: [] # do not run irrelevant before script for this job
  tags:
    - dind
  interruptible: false

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - www
  except:
    - schedules

scheduled-build:
  stage: build
  script:
    - npm run build
  only:
    - schedules

lint:
  stage: build
  script:
    - npm run lint

format:
  stage: build
  script:
    - npm run format:check

unit:
  stage: test
  script:
    - npm run check-icons
    - npm run test -- --watch=false --no-progress --code-coverage
  coverage: '/Statements[^:]*\:[^:]*\s+([\d\.]+)%/'
  artifacts:
    paths:
      - coverage
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

.e2e-chrome:
  image: registry.gitlab.com/openstapps/projectmanagement/cypress
  stage: test
  script:
    - npm run e2e -- --watch=false --headless=true --browser=chrome
  artifacts:
    when: on_failure
    paths:
      - cypress/videos
      - cypress/screenshots

.e2e-firefox:
  image: registry.gitlab.com/openstapps/projectmanagement/cypress
  stage: test
  script:
    - npm run e2e -- --watch=false --headless=true --browser=firefox
  artifacts:
    when: on_failure
    paths:
      - cypress/videos
      - cypress/screenshots

ui-chrome:
  extends: .e2e-chrome
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      when: never
    - if: ($CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "main")
      when: always
      allow_failure: false
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main")
      when: never

ui-firefox:
  extends: .e2e-firefox
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      when: never
    - if: ($CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "main")
      when: always
      allow_failure: false
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main")
      when: never

e2e-chrome:
  extends: .e2e-chrome
  stage: ui test
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      when: never
    - if: ($CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "main")
      when: never
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main")
      when: manual
      allow_failure: false

e2e-firefox:
  extends: .e2e-firefox
  stage: ui test
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      when: never
    - if: ($CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "main")
      when: never
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main")
      when: manual
      allow_failure: false

audit:
  stage: test
  script:
    - npm audit
  allow_failure: true
  except:
    - schedules

scheduled-audit:
  stage: test
  script:
    - npm audit --production
  only:
    - schedules

pages:
  stage: publish
  script:
    - npm run documentation
    - mv docs public
  only:
    - main
  except:
    - schedules
  artifacts:
    paths:
      - public

review:
  stage: deploy
  script:
    - npm run build:prod
    - .gitlab/ci/enableGitlabReviewToolbar.sh www/index.html "$CI_PROJECT_ID" "$CI_OPEN_MERGE_REQUESTS"
    - cp www/index.html www/200.html
    - ./node_modules/.bin/surge -p ./www -d https://$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_SLUG.surge.sh/
  environment:
    name: review/$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_NAME
    url: https://$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_SLUG.surge.sh/
    on_stop: stop_review
  rules:
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main" && $CI_MERGE_REQUEST_EVENT_TYPE != "merge_train" && ($CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web"))

stop_review:
  stage: deploy
  script:
    - ./node_modules/.bin/surge teardown $CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_SLUG.surge.sh
  when: manual
  environment:
    name: review/$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_NAME
    action: stop
  rules:
    - if: ($CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_NAME != "main" && $CI_MERGE_REQUEST_EVENT_TYPE != "merge_train" && ($CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web"))

staging:
  stage: deploy
  script:
    - npm run build:prod
    - cp www/index.html www/200.html
    - ./node_modules/.bin/surge -p ./www -d https://$CI_PROJECT_PATH_SLUG-staging.surge.sh/
  environment:
    name: staging
    url: https://$CI_PROJECT_PATH_SLUG-staging.surge.sh/
  only:
    - develop
  except:
    - schedules

production_demo:
  stage: deploy
  script:
    - npm run build:prod
    - cp www/index.html www/200.html
    - ./node_modules/.bin/surge -p ./www -d https://$CI_PROJECT_PATH_SLUG.surge.sh/
  environment:
    name: production
    url: https://$CI_PROJECT_PATH_SLUG.surge.sh/
  only:
    - main
  except:
    - schedules
