name: CI on: pull_request: branches: [ master, main ] push: branches: [ master, main ] jobs: build: name: Build & Lint runs-on: ubuntu-latest concurrency: group: ci-build-${{ github.ref }} cancel-in-progress: true steps: - name: Checkout code uses: actions/checkout@v4 - name: Decode release keystore if: env.RELEASE_KEYSTORE_BASE64 != '' env: RELEASE_KEYSTORE_BASE64: ${{ secrets.RELEASE_KEYSTORE_BASE64 }} run: echo "$RELEASE_KEYSTORE_BASE64" | base64 -d > app/release.keystore - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - name: Setup Android SDK uses: android-actions/setup-android@v3 - name: Generate Gradle wrapper run: gradle wrapper --gradle-version 8.9 - name: Build release APK env: RELEASE_KEYSTORE_FILE: ${{ secrets.RELEASE_KEYSTORE_BASE64 != '' && 'release.keystore' || '' }} RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }} RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }} RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} run: ./gradlew assembleRelease - name: Run unit tests run: ./gradlew testReleaseUnitTest testDebugUnitTest - name: Run Android Lint run: ./gradlew lintRelease - name: Upload release APK if: github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: parseable-android-release path: app/build/outputs/apk/release/*.apk retention-days: 14 - name: Upload lint results if: always() uses: actions/upload-artifact@v4 with: name: lint-results path: app/build/reports/lint-results-release.html retention-days: 14 release: name: Create Release needs: build if: github.event_name == 'push' runs-on: ubuntu-latest concurrency: group: release cancel-in-progress: false permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Decode release keystore if: env.RELEASE_KEYSTORE_BASE64 != '' env: RELEASE_KEYSTORE_BASE64: ${{ secrets.RELEASE_KEYSTORE_BASE64 }} run: echo "$RELEASE_KEYSTORE_BASE64" | base64 -d > app/release.keystore - name: Set version from commit timestamp run: | VERSION_NAME=$(TZ=UTC git log -1 --format='%cd' --date=format-local:'%Y.%m.%d.%H%M') echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - name: Setup Android SDK uses: android-actions/setup-android@v3 - name: Generate Gradle wrapper run: gradle wrapper --gradle-version 8.9 - name: Build release APK env: RELEASE_KEYSTORE_FILE: ${{ secrets.RELEASE_KEYSTORE_BASE64 != '' && 'release.keystore' || '' }} RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }} RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }} RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} run: ./gradlew assembleRelease - name: Rename APK with version run: | for apk in app/build/outputs/apk/release/*.apk; do mv "$apk" "app/build/outputs/apk/release/parseable-android-${VERSION_NAME}.apk" done - name: Create release uses: softprops/action-gh-release@v2 with: tag_name: v${{ env.VERSION_NAME }} name: v${{ env.VERSION_NAME }} generate_release_notes: true files: | app/build/outputs/apk/release/*.apk