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-19;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-19;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: /.*/