version: 2.1

executors:
  default:
    working_directory: /tmp/workspace
    docker:
      - image: misskey/ci:latest
      - image: circleci/mongo:latest
      - image: circleci/redis:latest
  docker:
    working_directory: /tmp/workspace
    docker:
      - image: docker:latest
  alpine:
    working_directory: /tmp/workspace
    docker:
      - image: alpine:latest

jobs:
  ok:
    executor: alpine
    steps:
      - run:
          name: OK
          command: |
            echo -e '\033[0;32mOK\033[0;39m'

  build:
    executor: default
    steps:
      - checkout
      - run:
          name: Ensure package-lock.json
          command: |
            [ ! -e package-lock.json ] && echo '{}' > package-lock.json
      - restore_cache:
          name: Restore npm package caches
          keys:
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
            - npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
            - npm-v1-arch-{{ arch }}-
            - npm-v1-
      - run:
          name: Install Dependencies
          command: |
            npm install
            npm prune
      - run:
          name: Configure
          command: |
            cp .circleci/misskey/default.yml .config
            cp .circleci/misskey/test.yml .config
      - run:
          name: Build
          command: |
            npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)
            ls -1ARl node_modules > ls
      - save_cache:
          name: Cache npm packages
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
          paths:
            - node_modules
#      - store_artifacts:
#          path: built
      - persist_to_workspace:
          root: .
          paths:
            - .
  test:
    parameters:
      without_redis:
        type: string
        default: ""
    executor: default
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - when:
          condition: <<parameters.without_redis>>
          steps:
            - run:
                name: Configure
                command: |
                  mv .config/test.yml .config/test_redis.yml
                  touch .config/test.yml
                  cat .config/test_redis.yml | while IFS= read line; do if [[ "$line" = '# __REDIS__' ]]; then break; else echo "$line" >> .config/test.yml; fi; done
      - run:
          name: Test
          command: |
            npm run test || (npm rebuild && npm run test) || ((node-gyp configure && node-gyp build && npm run build || (echo -e '\033[0;34mRebuild modules\033[0;39m' && ls -1A node_modules | grep '^[^@]' | xargs npm rebuild && ls -1A node_modules | grep '^@' | xargs -I%1 sh -c 'ls -1A node_modules/'%1' | xargs -P0 -I%2 npm rebuild node_modules/'%1'/%2' && npm run build)) && npm run test)
            ls -1ARl node_modules > ls
      - save_cache:
          name: Cache npm packages
          key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
          paths:
            - node_modules

  docker:
    parameters:
      with_deploy:
        type: string
        default: ""
    executor: docker
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Build
          command: |
            docker build -t misskey/misskey .
      - when:
          condition: <<parameters.with_deploy>>
          steps:
            - run:
                name: Deploy
                command: |
                  if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
                   then
                    apk update && apk add jq
                    docker tag misskey/misskey misskey/misskey:$(cat package.json | jq -r .version)
                    docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
                    docker push misskey/misskey
                   else
                    echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
                  fi

workflows:
  version: 2
  build-and-test:
    jobs:
      - ok:
          filters:
            branches:
              only:
                - l10n_develop
                - imgbot
      - build:
          filters:
            branches:
              ignore:
                - l10n_develop
                - imgbot
      - test:
          requires:
            - build
          filters:
            branches:
              ignore:
#                - master
                - l10n_develop
                - imgbot
      - test:
          without_redis: "true"
          requires:
            - build
          filters:
            branches:
              only: master
#      - docker:
#          filters:
#            branches:
#              ignore: master
      - docker:
          with_deploy: "true"
          filters:
            branches:
              only: master