name: Preview Builder # Manually build a preview on master on: # Dispatch or Manual triggers workflow_dispatch: # push: # branches: # - master # paths: # - '**' # - '!**.md' # - '!.github/**' # - '.github/scripts/**' # - '.github/workflows/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: prepare-build: runs-on: 'ubuntu-24.04' outputs: VERSION_TAG: ${{ steps.get_tag.outputs.VERSION_TAG }} CURRENT_SHA: ${{ steps.current_commit.outputs.CURRENT_SHA }} PREV_RELEASE_SHA: ${{ steps.previous_commit.outputs.PREV_RELEASE_SHA }} COMMIT_LOGS: ${{ steps.commit_logs.outputs.COMMIT_LOGS }} ARTIFACTS_PREFIX: ${{ steps.prepare_env.outputs.ARTIFACTS_PREFIX }} BUILD_TYPE_NAME: ${{ steps.prepare_env.outputs.BUILD_TYPE_NAME }} TAG_NAME: ${{ steps.prepare_env.outputs.TAG_NAME }} PREV_TAG_NAME: ${{ steps.previous_commit.outputs.PREV_TAG_NAME }} steps: - name: Get tag name (${{ github.ref }}) id: get_tag run: | set -x echo "VERSION_TAG=${GITHUB_REF/refs\/heads\//}" echo "VERSION_TAG=${GITHUB_REF/refs\/heads\//}" >> $GITHUB_OUTPUT - name: Clone Repository (${{ steps.get_tag.outputs.VERSION_TAG }}) uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 - name: Get previous release id: last_release uses: InsonusK/get-latest-release@7a9ff16c8c6b7ead5d71c0f1cc61f2703170eade # v1.1.0 with: myToken: ${{ github.token }} exclude_types: "draft" view_top: 1 - name: Curren commit id: current_commit run: | set -e commit_count=$(git rev-list --count HEAD) echo "COMMIT_COUNT=$commit_count" echo "COMMIT_COUNT=$commit_count" >> $GITHUB_OUTPUT current_sha=$(git rev-parse --short HEAD) echo "CURRENT_SHA=$current_sha" echo "CURRENT_SHA=$current_sha" >> $GITHUB_OUTPUT - name: Previous commit id: previous_commit run: | set -e commit_count_diff=$(git rev-list --count "${{ steps.last_release.outputs.tag_name }}"..HEAD) # Fake at least 1 commits (to avoid no changes) if [ "${commit_count_diff}" -eq 0 ]; then commit_count_diff=1 fi echo "commit_count_diff=$commit_count_diff" prev_release_sha=$(git rev-parse --short HEAD~$commit_count_diff) echo "PREV_RELEASE_SHA=$prev_release_sha" echo "PREV_RELEASE_SHA=$prev_release_sha" >> $GITHUB_OUTPUT echo "PREV_TAG_NAME=${{ steps.last_release.outputs.tag_name }}" echo "PREV_TAG_NAME=${{ steps.last_release.outputs.tag_name }}" >> $GITHUB_OUTPUT - name: Prepare env id: prepare_env run: | set -e tag_prefix=r artifacts_prefix=preview/app build_type_name=Preview echo "TAG_NAME=${tag_prefix}${{ steps.current_commit.outputs.COMMIT_COUNT }}" echo "TAG_NAME=${tag_prefix}${{ steps.current_commit.outputs.COMMIT_COUNT }}" >> $GITHUB_OUTPUT echo "ARTIFACTS_PREFIX=$artifacts_prefix" echo "ARTIFACTS_PREFIX=$artifacts_prefix" >> $GITHUB_OUTPUT echo "BUILD_TYPE_NAME=$build_type_name" echo "BUILD_TYPE_NAME=$build_type_name" >> $GITHUB_OUTPUT - name: Commit logs id: commit_logs run: | set -e echo "COMMIT_LOGS<<{delimiter} $(curl -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/repos/komikku-app/komikku/compare/${{ steps.previous_commit.outputs.PREV_RELEASE_SHA }}...${{ steps.current_commit.outputs.CURRENT_SHA }}" \ | jq '[.commits[]|{message:(.commit.message | split("\n")), username:.author.login}]' \ | jq -r '.[]|"- \(.message | first) (@\(.username))"') {delimiter}" >> $GITHUB_OUTPUT build-app: runs-on: 'ubuntu-24.04' needs: prepare-build if: github.ref == 'refs/heads/master' && github.repository == 'komikku-app/komikku' steps: - name: Clone Repository (${{ needs.prepare-build.outputs.VERSION_TAG }} - ${{ needs.prepare-build.outputs.TAG_NAME }}) uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 - name: Setup Android SDK run: | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "build-tools;29.0.3" - name: Set up JDK uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 with: java-version: 17 distribution: temurin - name: Write google-services.json uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 with: path: app/google-services.json contents: ${{ secrets.GOOGLE_SERVICES_JSON }} write-mode: overwrite - name: Write client_secrets.json uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 with: path: app/src/main/assets/client_secrets.json contents: ${{ secrets.GOOGLE_CLIENT_SECRETS_JSON }} write-mode: overwrite - name: Set up gradle uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4 - name: Check code format run: ./gradlew spotlessCheck - name: Build app run: ./gradlew assemblePreview -Pinclude-analytics -Penable-updater - name: Run unit tests run: ./gradlew testReleaseUnitTest - name: Upload artifacts uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: path: "**/*.apk" retention-days: 1 release-app: runs-on: 'ubuntu-24.04' needs: - prepare-build - build-app steps: - name: Download artifacts uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9 with: merge-multiple: true - name: Setup Android SDK run: | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "build-tools;29.0.3" - name: Sign APK uses: r0adkll/sign-android-release@f30bdd30588842ac76044ecdbd4b6d0e3e813478 with: releaseDirectory: app/build/outputs/apk/preview signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD }} - name: Get SHA & clean up build artifacts id: get_sha run: | set -e mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-universal-preview-signed.apk Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_UNIVERSAL_SHA=$sha" >> $GITHUB_OUTPUT mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-arm64-v8a-preview-signed.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_ARM64_V8A_SHA=$sha" >> $GITHUB_OUTPUT mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-armeabi-v7a-preview-signed.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_ARMEABI_V7A_SHA=$sha" >> $GITHUB_OUTPUT mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86-preview-signed.apk Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_X86_SHA=$sha" >> $GITHUB_OUTPUT mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86_64-preview-signed.apk Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_X86_64_SHA=$sha" >> $GITHUB_OUTPUT - name: Create release uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1 with: tag_name: ${{ needs.prepare-build.outputs.TAG_NAME }} name: Komikku Preview ${{ needs.prepare-build.outputs.TAG_NAME }} (${{ needs.prepare-build.outputs.VERSION_TAG }}) body: | #### What's Changed ##### New ##### Improve ##### Fix ${{ needs.prepare-build.outputs.COMMIT_LOGS }} **Full Changelog**: [komikku-app/komikku@${{ needs.prepare-build.outputs.PREV_TAG_NAME }}...${{ needs.prepare-build.outputs.TAG_NAME }}](https://github.com/komikku-app/komikku/compare/${{ needs.prepare-build.outputs.PREV_TAG_NAME }}...${{ needs.prepare-build.outputs.TAG_NAME }}) --- ### Checksums | Variant | SHA-256 | | ------- | ------- | | Universal | ${{ steps.get_sha.outputs.APK_UNIVERSAL_SHA }} | | arm64-v8a | ${{ steps.get_sha.outputs.APK_ARM64_V8A_SHA }} | | armeabi-v7a | ${{ steps.get_sha.outputs.APK_ARMEABI_V7A_SHA }} | | x86 | ${{ steps.get_sha.outputs.APK_X86_SHA }} | | x86_64 | ${{ steps.get_sha.outputs.APK_X86_64_SHA }} | ### If you are unsure which apk to download then go with `Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk` files: | Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk draft: true prerelease: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}