version: 2

references:

  workspace_root: &workspace_root
      ~/wulkanowy

  container_config: &container_config
    docker:
      - image: circleci/android@sha256:5cdc8626cc6f13efe5ed982cdcdb432b0472f8740fed8743a6461e025ad6cdfc
    working_directory: *workspace_root
    environment:
      environment:
        _JAVA_OPTS: -Xmx3072m

  attach_workspace: &attach_workspace
    attach_workspace:
      at: *workspace_root

  general_cache_key: &general_cache_key
    key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}

jobs:

  build:
    <<: *container_config
    steps:
      - run: |
          curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash
      - checkout
      - restore_cache:
          <<: *general_cache_key
      - run:
          name: Setup environment
          command: ./gradlew dependencies --no-daemon --stacktrace --console=plain -PdisablePreDex || true
      - run:
          name: Initial build
          command: ./gradlew build -x test -x lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease -x packageRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
      - run:
          name: Run FOSSA
          command: fossa --no-ansi || true
      - persist_to_workspace:
          root: *workspace_root
          paths:
            - .
      - save_cache:
          <<: *general_cache_key
          paths:
            - "~/.gradle"

  lint:
    <<: *container_config
    steps:
      - *attach_workspace
      - restore_cache:
          <<: *general_cache_key
      - run:
          name: Run lint
          command: ./gradlew lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
      - store_artifacts:
          path: ./app/build/reports/
          destination: lint_reports/app/
      - store_test_results:
          path: ./app/build/reports/
      - persist_to_workspace:
          root: *workspace_root
          paths:
            - "./app/build/reports/lint-results.xml"

  app-test:
    <<: *container_config
    steps:
      - *attach_workspace
      - restore_cache:
          <<: *general_cache_key
      - run:
          name: Run app tests
          command: ./gradlew :app:test :app:jacocoTestReport -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
      - run:
          name: Upload unit code coverage to codecov
          command: bash <(curl -s https://codecov.io/bash) -F app
      - store_artifacts:
          path: ./app/build/reports/
          destination: reports/
      - store_test_results:
          path: ./app/build/test-results
      - persist_to_workspace:
          root: *workspace_root
          paths:
            - "./app/build/jacoco"

  instrumented:
    <<: *container_config
    steps:
      - *attach_workspace
      - run:
          name: Accept licenses
          command: yes | sdkmanager --licenses && yes | sdkmanager --update
      - run:
          name: Setup emulator
          command: sdkmanager "system-images;android-22;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-22;default;armeabi-v7a"
      - run:
          name: Launch emulator
          command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
          background: true
      - run:
          name: Change circle-android script file permissions
          command: sudo chmod +rx /bin/circle-android
      - run:
          name: Wait emulator
          command: |
            # wait for it to have booted
            circle-android wait-for-boot
            # unlock the emulator screen
            sleep 30
            adb shell input keyevent 82
      - run:
          name: Run instrumented tests
          command: ./gradlew clean createFdroidDebugCoverageReport jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
      - run:
          name: Collect logs from emulator
          command: adb logcat -d > ./app/build/reports/logcat_emulator.txt
          when: always
      - run:
          name: Upload code covarage to codecov
          command: bash <(curl -s https://codecov.io/bash) -F instrumented
      - store_artifacts:
          path: ./app/build/reports
          destination: reports
      - store_test_results:
          path: ./app/build/outputs/androidTest-results/connected/
      - persist_to_workspace:
          root: *workspace_root
          paths:
            - "./app/build/outputs/code-coverage/connected"

  sonarcube:
    <<: *container_config
    steps:
      - *attach_workspace
      - restore_cache:
          <<: *general_cache_key
      - run:
          name: Prepare coverage report
          command: ./gradlew jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
      - run:
          name: Run sonarqube runner
          command: if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex; fi
          command: "[[ -v CIRCLE_PR_NUMBER ]] && ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex || true"

  deploy:
    <<: *container_config
    steps:
      - *attach_workspace
      - restore_cache:
          <<: *general_cache_key
      - run:
          name: Decrypt keys
          command: |
            gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg
            openssl aes-256-cbc -d -in ./app/key-encrypted.p12 -k $ENCRYPT_KEY >> ./app/key.p12
            openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
      - run:
          name: Publish release
          command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex

workflows:
  version: 2

  build-test-deploy:
    jobs:
      - build:
          filters:
            tags:
              only: /.*/
      - lint:
          filters:
            tags:
              only: /.*/
          requires:
            - build
      - app-test:
          filters:
            tags:
              only: /.*/
          requires:
            - build
      - instrumented:
          filters:
            tags:
              only: /.*/
          requires:
            - build
      - sonarcube:
          filters:
            tags:
              only: /.*/
          requires:
            - build
            - lint
            - app-test
            - instrumented
      - deploy:
          requires:
            - instrumented
          filters:
            tags:
              only: /\d+\.\d+\.\d+/
            branches:
              ignore: /.*/