version: 2.1

aliases:
  - &defaults
    docker:
      - image: cimg/node:12.20.1-browsers
        auth:
          username: $DOCKERHUB_USERNAME
          password: $DOCKERHUB_PASSWORD
    working_directory: ~/repo
  - &setup
    name: "setup"
    command: |
      npm --production=false ci
      mkdir ./test/results
  - &lint
    name: "run lint tests"
    command: |
      npm run test:lint:ci
  - &build
    name: "run npm build"
    command: |
      WWW_VERSION=${CIRCLE_SHA1:0:5} npm run build
  - &unit
    name: "Run unit tests"
    command: |
      JEST_JUNIT_OUTPUT_NAME=unit-jest-results.xml npm run test:unit:jest:unit -- --reporters=jest-junit
      JEST_JUNIT_OUTPUT_NAME=localization-jest-results.xml npm run test:unit:jest:localization -- --reporters=jest-junit
      npm run test:unit:tap -- --output-file ./test/results/unit-raw.tap
      npm run test:unit:convertReportToXunit
  - &setup_python
    name: "setup python"
    command: |
      curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py
      python3 get-pip.py pip==21.0.1
      pip install s3cmd==2.1.0
  - &deploy
    name: "deploy"
    command: |
      npm run deploy
  - &integration
    name: "integration tests with Jest"
    command: |
      JEST_JUNIT_OUTPUT_NAME=integration-jest-results.xml npm run test:integration:remote -- --reporters=jest-junit
  - &build_no_deploy
    <<: *defaults
    resource_class: large
    steps:
      - checkout
      - run:
          <<: *setup
      - run:
          <<: *lint
      - run:
          <<: *build
      - run:
          <<: *unit
      - store_test_results:
          path: test/results
  - &build_and_deploy
    <<: *defaults
    resource_class: large
    steps:
      - checkout
      - run:
          <<: *setup
      - run:
          <<: *lint
      - run:
          <<: *build
      - run:
          <<: *unit
      - run:
          <<: *setup_python
      - run:
          <<: *deploy
      - run:
          <<: *integration
      - store_test_results:
          path: test/results
      - run:
          name: Compress Artifacts
          command: tar -cvzf build.tar build
      - store_artifacts:
          path: build.tar
  - &update-translations
    <<: *defaults
    steps:
      - checkout
      - run:
          name: "setup"
          command: npm --production=false ci
      - run:
          name: "run i18n script"
          command: npm run i18n:push

# build-test-deploy requires two separately named jobs
jobs:
  build-and-deploy-staging:
    <<: *build_and_deploy
  build-and-deploy-production:
    <<: *build_and_deploy
  update-translations:
    <<: *update-translations
  build-no-deploy:
    <<: *build_no_deploy

workflows:
  build-test-deploy:
    jobs:
      - build-and-deploy-staging:
          context:
            - scratch-www-all
            - scratch-www-staging
          filters:
            branches:
              only:
                - develop
                - /^hotfix\/.*/
                - /^release\/.*/
      - build-and-deploy-production:
          context:
            - scratch-www-all
            - scratch-www-production
          filters:
            branches:
              only:
                - master
  Update-translations:
    triggers:
      - schedule: # every evening at 7pm EST (8pm EDT, Midnight UTC)
          cron: "0 0 * * *"
          filters:
            branches:
              only: develop
    jobs:
      - update-translations:
          context:
            - scratch-www-all
            - scratch-www-staging
          filters:
            branches:
              only:
                - develop
  build-test-no-deploy:
    jobs:
      - build-no-deploy:
          filters:
            branches:
              ignore:
                - develop
                - master
                - /^hotfix\/.*/
                - /^release\/.*/