stages:
  - prepare
  - linters
  - test
  - test-e2e
  - build
  - swagger
  - deploy

.cache-tpl: &cache-tpl
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - node_modules
    - frontend/components
  policy: pull

.curl-tpl: &curl-tpl
  variables:
    GIT_STRATEGY: none
  tags:
    - curl
  before_script:
      - apk add --no-cache curl jq

.build-pkg-tpl: &build-pkg-tpl
  <<: *curl-tpl
  only:
    - master@linagora/lgs/openpaas/esn
  except:
    variables:
      - $SKIP_BUILD_PKG

.test-template: &test-template
  image: node:8
  stage: test
  tags:
    - docker
  cache:
    <<: *cache-tpl
  variables:
      TZ: "America/New_York"
  before_script:
    - npm install -g grunt-cli
    - 'echo "INFO: NB node packages : $(ls node_modules | wc -l)"'
    - 'echo "INFO: NB bower packages : $(ls frontend/components | wc -l)"'
  except:
    variables:
      - $SKIP_TESTS
    refs:
      - tags@linagora/lgs/openpaas/esn

.test-template-svc: &test-template-svc
  <<: *test-template
  services:
    - name: elasticsearch:2.3.2
      alias: elasticsearch
    - name: mongo:3.2.0
      alias: mongo
    - name: redis:latest
      alias: redis
    - name: rabbitmq:3.6.5-management
      alias: rabbitmq
  variables:
    MONGO_HOST: mongo
    MONGO_PORT: 27017
    AMQP_HOST: rabbitmq
    AMQP_PORT: 5672
    ELASTICSEARCH_HOST : elasticsearch
    ELASTICSEARCH_PORT: 9200
    REDIS_HOST: redis
    REDIS_PORT: 6379

prepare:
  image: node:8
  stage: prepare
  tags:
    - docker
  cache:
    <<: *cache-tpl
    policy: pull-push
  script:
    - npm install
    # Weird behaviour: at the time, npm postinstall was not called.
    - ./node_modules/.bin/bower install --allow-root
    - 'echo "INFO: NB node packages : $(ls node_modules | wc -l)"'
    - 'echo "INFO: NB bower packages : $(ls frontend/components | wc -l)"'
  except:
    variables:
      - $SKIP_PREPARE

linters:
  <<: *test-template
  stage: linters
  script:
    - grunt -v linters
  except:
    variables:
      - $SKIP_LINTERS
    refs:
      - tags@linagora/lgs/openpaas/esn

check_author:
  image: docker-registry.linagora.com:5000/lgs-releases/gitlab-integrity-checks:latest
  stage: linters
  variables:
    GIT_DEPTH: "1"
  tags:
    - ultralight
  script:
    - check_author.py check "$GITLAB_USER_EMAIL" "$GITLAB_USER_NAME" --no-accents
  except:
    refs:
      - master@linagora/lgs/openpaas/esn
      - tags@linagora/lgs/openpaas/esn
      - /^release-.*/@linagora/lgs/openpaas/esn

####### tests without services requirements
frontend-test:
  <<: *test-template
  script:
    - grunt -v test-frontend

modules-frontend-test:
  <<: *test-template
  script:
    - npm install
    # Weird behaviour: at the time, npm postinstall was not called.
    - ./node_modules/.bin/bower install --allow-root
    - grunt -v test-modules-frontend
    - TZ="Pacific/Kiritimati" grunt -v test-modules-frontend
    - TZ="Pacific/Midway" grunt -v test-modules-frontend
    - TZ="Pacific/Chatham" grunt -v test-modules-frontend

unit-backend-test:
  <<: *test-template
  script:
    - grunt -v --chunk=1 test-unit-backend

modules-unit-backend-test:
  <<: *test-template
  script:
    - grunt -v --chunk=1 test-modules-unit-backend

####### tests with services requirements

unit-storage-test:
  <<: *test-template-svc
  script:
    - grunt -v --chunk=1 gitlab-test-unit-storage
    - grunt -v --chunk=1 gitlab-test-modules-unit-storage

modules-midway-test:
  <<: *test-template-svc
  script:
    - grunt -v --chunk=1 gitlab-test-modules-midway

midway-backend-test:
  <<: *test-template-svc
  script:
    - grunt --chunk=1 -v gitlab-test-midway-backend

# Why is it deactivated ?
# This job try to build and test everything !!!
.test-e2e:
  stage: test-e2e
  before_script:
    - export TZ=America/New_York
    - . ~/.nvm/nvm.sh && nvm use 8
    - npm install -g grunt-cli
  cache:
    <<: *cache-tpl
  script:
    - export VIDEO=true
    - export VIDEO_FIREFOX_NAME=firefox-$CI_JOB_ID
    - export VIDEO_CHROME_NAME=chrome-$CI_JOB_ID
    - export VIDEO_DIR="$PWD/e2e-videos"
    - npm install
    - grunt test-e2e-clean
    - grunt test-e2e-prepare $DOCKER_OPTIONS
    - BROWSER="firefox" VIDEO_FILE_NAME=$VIDEO_FIREFOX_NAME grunt test-e2e $DOCKER_OPTIONS
    - BROWSER="chrome" VIDEO_FILE_NAME=$VIDEO_CHROME_NAME grunt test-e2e $DOCKER_OPTIONS
  allow_failure: true

build_pkg_deb_openpaas_jessie:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas"
      -F "variables[DOCKERFILE]=debian/jessie/openpaas/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

build_pkg_deb_openpaas_stretch:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas"
      -F "variables[DOCKERFILE]=debian/stretch/openpaas/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

build_pkg_rpm_openpaas:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas"
      -F "variables[DOCKERFILE]=redhat/7/openpaas/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

build_pkg_deb_openpaas-james_jessie:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas-james"
      -F "variables[DOCKERFILE]=debian/jessie/openpaas-james/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

build_pkg_deb_openpaas-james_stretch:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas-james"
      -F "variables[DOCKERFILE]=debian/stretch/openpaas-james/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

build_pkg_rpm_openpaas-james:
  <<: *build-pkg-tpl
  stage: build
  script:
    - curl -s -X POST
      -F "token=${BUILD_PACKAGE_CI_TOKEN}"
      -F "ref=master"
      -F "variables[REPO]=https://ci.linagora.com/linagora/lgs/openpaas/esn.git"
      -F "variables[VERSION_FILE]=package.json"
      -F "variables[PACKAGE_NAME]=openpaas-james"
      -F "variables[DOCKERFILE]=redhat/7/openpaas-james/Dockerfile"
      https://ci.linagora.com/api/v4/projects/338/trigger/pipeline | jq .

# Maybe this stage should not use test-template,
# the job will not created for tag pipeline.
swagger:
  <<: *test-template
  stage: swagger
  script:
   - grunt swagger-generate
  artifacts:
    paths:
     - ./doc/REST_API/swagger/swagger.json

deploy-swagger:
  stage: deploy
  tags:
    - deployment
    - api.open-paas.org
    - shell
  environment:
    name: api
    url: https://api.open-paas.org
  only:
    - master@linagora/lgs/openpaas/esn
  script:
    - perl -i -pe's/"host":"localhost:8080"/"schemes":["https"],"host":"demo.open-paas.org"/' ./doc/REST_API/swagger/swagger.json
    - cp ./doc/REST_API/swagger/swagger.json /var/www/html

deploy-dev:
  stage: deploy
  tags:
    - dev.open-paas.org
    - deployment
  environment:
    name: dev
    url: https://dev.open-paas.org
  only:
    - master@linagora/lgs/openpaas/esn
  script:
    - cd /srv/rse.dev
    - git fetch --all
    - git checkout ${CI_COMMIT_SHA}
    - npm install --ignore-scripts --production
    - npm update --production
    - npm prune
    - bower install --production
    - bower prune
    - git checkout -- .
    - sudo /etc/init.d/rse.dev restart

.build-docker-tpl: &build-docker-tpl
  image: docker-registry.linagora.com:5000/linshare-snapshots/linshare-dind:latest
  tags:
    - docker
  services:
      - name: docker-registry.linagora.com:5000/linshare-snapshots/linshare-dind:latest
        alias: docker-dind

docker-snapshot:
  <<: *build-docker-tpl
  stage: build
  variables:
      DOCKER_HOST: "tcp://docker-dind"
      DOCKER_IMAGE_PRIVATE: "docker-registry.linagora.com:5000/openpaas-snapshots/openpaas-esn"
  script:
    - guess-version.sh guest
    - source version.env
    - docker-tag-computing.sh ${VERSION} docker-tag-and-push.env
    - docker login -u ${REGISTRY_USER} -p ${REGISTRY_TOKEN} docker-registry.linagora.com:5000
    - docker build . -t build:latest
    - docker-tag-and-push.sh build:latest ${DOCKER_IMAGE_PRIVATE}
    - docker logout
  only:
    - master@linagora/lgs/openpaas/esn
    - /^release-.*/@linagora/lgs/openpaas/esn
  except:
    variables:
      - $SKIP_BUILD_DOCKER

docker-release:
  <<: *build-docker-tpl
  stage: build
  variables:
      DOCKER_HOST: "tcp://docker-dind"
      DOCKER_IMAGE_PRIVATE: "docker-registry.linagora.com:5000/openpaas-releases/openpaas-esn"
      DOCKER_IMAGE_PUBLIC: "linagora/esn"
  script:
    - docker-tag-computing.sh ${CI_COMMIT_TAG} docker-tag-and-push.env
    - docker login -u ${REGISTRY_USER_RELEASE} -p ${REGISTRY_TOKEN_RELEASE} docker-registry.linagora.com:5000
    - docker login -u ${HUB_DOCKER_USER} -p ${HUB_DOCKER_TOKEN}
    - docker build . -t build:latest
    - docker-tag-and-push.sh build:latest ${DOCKER_IMAGE_PRIVATE} ${DOCKER_IMAGE_PUBLIC}
    - docker logout
  only:
    - tags@linagora/lgs/openpaas/esn
  except:
    variables:
      - $SKIP_BUILD_DOCKER

docker-mark-as-latest-from-tag:
  <<: *build-docker-tpl
  stage: deploy
  variables:
      GIT_STRATEGY: none
      DOCKER_HOST: "tcp://docker-dind"
      DOCKER_IMAGE_PRIVATE: "docker-registry.linagora.com:5000/openpaas-releases/openpaas-esn"
      DOCKER_IMAGE_PUBLIC: "linagora/esn"
  script:
    - docker login -u ${REGISTRY_USER_RELEASE} -p ${REGISTRY_TOKEN_RELEASE} docker-registry.linagora.com:5000
    - docker login -u ${HUB_DOCKER_USER} -p ${HUB_DOCKER_TOKEN}
    - docker-tag-computing.sh ${CI_COMMIT_TAG} docker-tags.env
    - source docker-tags.env
    - docker pull ${DOCKER_IMAGE_PRIVATE}:${DOCKER_TAG}
    - export DOCKER_TAGS=latest
    - docker-tag-and-push.sh ${DOCKER_IMAGE_PRIVATE}:${DOCKER_TAG} ${DOCKER_IMAGE_PRIVATE} ${DOCKER_IMAGE_PUBLIC}
    - docker logout
  when: manual
  only:
    - tags@linagora/lgs/openpaas/esn
