Remote Dispatch Build Preview App #106
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Remote Dispatch Build Preview App | |
on: | |
# Dispatch or Manual triggers | |
workflow_dispatch: | |
inputs: | |
git-ref: | |
description: Git Ref to build ('master' for standard preview release, any other for dev preview pre-release) | |
required: false | |
dry-run: | |
description: Creates a draft release (any value would create a draft) | |
required: false | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.inputs.git-ref }} | |
cancel-in-progress: true | |
jobs: | |
prepare-build: | |
if: github.event.inputs.git-ref != '' | |
runs-on: ubuntu-latest | |
outputs: | |
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 }} | |
CHANGELOG: ${{ steps.set_changelog.outputs.CHANGELOG }} | |
TAG_NAME: ${{ steps.prepare_env.outputs.TAG_NAME }} | |
PREV_TAG_NAME: ${{ steps.previous_commit.outputs.PREV_TAG_NAME }} | |
steps: | |
- name: Clone Repository (${{ github.event.inputs.git-ref }}) | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
repository: 'komikku-app/komikku' | |
fetch-depth: 0 | |
ref: ${{ github.event.inputs.git-ref }} | |
- name: Validate Gradle Wrapper | |
uses: gradle/actions/wrapper-validation@cc4fc85e6b35bafd578d5ffbc76a5518407e1af0 # v4 | |
- 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 }}" >> $GITHUB_OUTPUT | |
- name: Prepare env | |
id: prepare_env | |
run: | | |
set -e | |
if [ "${{ github.event.inputs.git-ref }}" = "master" ]; then | |
tag_prefix=r | |
artifacts_prefix=standard/preview/app-standard | |
build_type_name=Preview | |
else | |
tag_prefix=d | |
artifacts_prefix=dev/preview/app-dev | |
build_type_name="Dev build" | |
fi | |
echo "${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" >> $GITHUB_OUTPUT | |
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 | |
- name: Set CHANGELOG | |
id: set_changelog | |
if: github.event.inputs.git-ref != 'master' | |
run: | | |
changelog="$(git log ${{ steps.previous_commit.outputs.PREV_RELEASE_SHA }}..${{ steps.current_commit.outputs.CURRENT_SHA }} --pretty=format:'{{changelogtext}}%s (@%an){{!changelogtext}}')" | |
changelog="${changelog//$'%'/%25}" | |
changelog="${changelog//$'\n'/}" | |
changelog="${changelog//$'\r'/}" | |
changelog="${changelog//$'<'/}" | |
changelog="${changelog//$'>'/}" | |
changelog="${changelog//$'&'/}" | |
changelog="$(echo $changelog | sed -e 's/{{changelogtext}}/<changelogtext>/g')" | |
changelog="$(echo $changelog | sed -e 's/{{!changelogtext}}/<\/changelogtext>/g')" | |
changelog="<?xml version=\"1.0\" encoding=\"utf-8\"?><changelog bulletedList=\"true\"><changelogversion versionName=\"${{ steps.current_commit.outputs.TAG_NAME }}\" changeDate=\"\">$changelog</changelogversion></changelog>" | |
echo "CHANGELOG=$changelog" >> $GITHUB_OUTPUT | |
build-app: | |
runs-on: ubuntu-latest | |
needs: prepare-build | |
steps: | |
- name: Clone Repository (${{ github.event.inputs.git-ref }} - ${{ needs.prepare-build.outputs.TAG_NAME }}) | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
repository: 'komikku-app/komikku' | |
fetch-depth: 0 | |
ref: ${{ github.event.inputs.git-ref }} | |
- 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@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 | |
with: | |
java-version: 17 | |
distribution: temurin | |
# Overwrite changelog with commits log if it's not a preview build | |
- name: Write changelog_preview.xml | |
uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 | |
if: github.event.inputs.git-ref != 'master' | |
with: | |
path: app/src/main/res/raw/changelog_preview.xml | |
contents: "${{ needs.prepare-build.outputs.CHANGELOG }}" | |
write-mode: overwrite | |
- name: Write google-services.json | |
uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 | |
if: github.event.inputs.git-ref == 'master' | |
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 | |
if: github.event.inputs.git-ref == 'master' | |
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@cc4fc85e6b35bafd578d5ffbc76a5518407e1af0 # v4 | |
# - name: Build app and run unit tests | |
# uses: gradle/gradle-command-action@v2 | |
# with: | |
# arguments: detekt assembleStandardPreview testStandardPreviewUnitTest testReleaseUnitTest | |
- name: Build standard app and run unit tests | |
if: github.event.inputs.git-ref == 'master' | |
run: ./gradlew assembleStandardPreview testStandardPreviewUnitTest testReleaseUnitTest -Pandroid.signingConfig=debug --stacktrace | |
- name: Build dev app and run unit tests | |
if: github.event.inputs.git-ref != 'master' | |
run: ./gradlew assembleDevPreview testDevPreviewUnitTest testReleaseUnitTest -Pandroid.signingConfig=debug --stacktrace | |
- name: Upload artifacts | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
path: "**/*.apk" | |
retention-days: 1 | |
release-app: | |
runs-on: ubuntu-latest | |
needs: | |
- prepare-build | |
- build-app | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
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@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 | |
with: | |
releaseDirectory: app/build/outputs/apk/standard/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-unsigned-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-unsigned-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-unsigned-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-unsigned-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-unsigned-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@01570a1f39cb168c169c802c3bceb9e93fb10974 # v2.1.0 | |
with: | |
tag_name: ${{ needs.prepare-build.outputs.TAG_NAME }} | |
name: Komikku ${{ needs.prepare-build.outputs.BUILD_TYPE_NAME }} ${{ needs.prepare-build.outputs.TAG_NAME }} | |
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: ${{ github.event.inputs.dry-run != '' || github.event.inputs.git-ref == 'master'}} | |
prerelease: ${{ github.event.inputs.git-ref != 'master'}} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
cleaning-repo: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Prune old releases | |
uses: dev-drprasad/delete-older-releases@dfbe6be2a006e9475dfcbe5b8d201f1824c2a9fe # v0.3.4 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
keep_latest: 28 | |
delete_tags: true |