Multi-Platform App Build and Publish #1
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: Multi-Platform App Build and Distribution | |
on: | |
workflow_dispatch: | |
inputs: | |
release_type: | |
type: choice | |
options: | |
- internal | |
- beta | |
default: internal | |
description: Release Type | |
distribute_android: | |
type: boolean | |
default: false | |
description: Distribute Android App On Play Store | |
distribute_ios: | |
type: boolean | |
default: false | |
description: Distribute iOS App On App Store | |
distribute_desktop: | |
type: boolean | |
default: false | |
description: Distribute Desktop Apps On App Store | |
distribute_web: | |
type: boolean | |
default: false | |
description: Distribute Web App | |
permissions: | |
contents: write | |
jobs: | |
build_android: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up JDK 17 | |
uses: actions/[email protected] | |
with: | |
distribution: 'temurin' | |
java-version: '17' | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
- uses: actions/cache@v3 | |
with: | |
path: | | |
~/.gradle/caches | |
~/.gradle/wrapper | |
~/.konan | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} | |
- uses: ./.github/actions/inflate-secrets | |
name: Inflate Secrets | |
with: | |
keystore: ${{ secrets.ORIGINAL_KEYSTORE_FILE }} | |
google-services: ${{ secrets.GOOGLESERVICES }} | |
playstore-creds: ${{ secrets.PLAYSTORECREDS }} | |
firebase-creds: ${{ secrets.FIREBASECREDS }} | |
- name: Build Release | |
env: | |
KEYSTORE_PASSWORD: ${{ secrets.ORIGINAL_KEYSTORE_FILE_PASSWORD }} | |
KEYSTORE_ALIAS: ${{ secrets.ORIGINAL_KEYSTORE_ALIAS }} | |
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.ORIGINAL_KEYSTORE_ALIAS_PASSWORD }} | |
VERSION_CODE: ${{ steps.rel_number.outputs.version-code }} | |
run: | | |
./gradlew :mifospay-android:assembleRelease | |
- name: Upload Android Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: android-app | |
retention-days: 1 | |
compression-level: 9 | |
path: ./**/*.apk | |
distribute_android_on_firebase: | |
needs: [ build_android, generate_release_info ] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up JDK 17 | |
uses: actions/[email protected] | |
with: | |
distribution: 'temurin' | |
java-version: '17' | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
- uses: ./.github/actions/inflate-secrets | |
name: Inflate Secrets | |
with: | |
keystore: ${{ secrets.ORIGINAL_KEYSTORE_FILE }} | |
google-services: ${{ secrets.GOOGLESERVICES }} | |
playstore-creds: ${{ secrets.PLAYSTORECREDS }} | |
firebase-creds: ${{ secrets.FIREBASECREDS }} | |
- name: Download Android Artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: android-app | |
- name: Download Beta Changelog | |
uses: actions/download-artifact@v4 | |
with: | |
name: beta-changelog | |
- name: Move APK to build directory | |
run: | | |
mkdir -p ./mifospay-android/build/outputs/apk/prod/release/ | |
mv ./*.apk ./mifospay-android/build/outputs/apk/prod/release/ | |
mv changelogBeta ./mifospay-android/build/outputs/ | |
- name: ☁️ Deploy to Firebase | |
env: | |
KEYSTORE_PASSWORD: ${{ secrets.ORIGINAL_KEYSTORE_FILE_PASSWORD }} | |
KEYSTORE_ALIAS: ${{ secrets.ORIGINAL_KEYSTORE_ALIAS }} | |
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.ORIGINAL_KEYSTORE_ALIAS_PASSWORD }} | |
VERSION_CODE: ${{ needs.generate_release_info.outputs.version_code }} | |
run: ./gradlew appDistributionUploadProdRelease --no-configuration-cache | |
distribute_android_on_playstore: | |
needs: [ build_android, generate_release_info ] | |
if: inputs.distribute_android | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up JDK 17 | |
uses: actions/[email protected] | |
with: | |
distribution: 'temurin' | |
java-version: '17' | |
- name: Configure Ruby | |
uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 | |
with: | |
bundler-cache: true | |
- name: Install Fastlane | |
run: | | |
gem install bundler:2.2.27 | |
bundle install --jobs 4 --retry 3 | |
bundle exec fastlane add_plugin firebase_app_distribution | |
bundle exec fastlane add_plugin increment_build_number | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
- uses: ./.github/actions/inflate-secrets | |
name: Inflate Secrets | |
with: | |
keystore: ${{ secrets.UPLOAD_KEYSTORE_FILE }} | |
google-services: ${{ secrets.GOOGLESERVICES }} | |
playstore-creds: ${{ secrets.PLAYSTORECREDS }} | |
firebase-creds: ${{ secrets.FIREBASECREDS }} | |
- name: Build Release | |
env: | |
KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_FILE_PASSWORD }} | |
KEYSTORE_ALIAS: ${{ secrets.UPLOAD_KEYSTORE_ALIAS }} | |
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_ALIAS_PASSWORD }} | |
VERSION_CODE: ${{ needs.generate_release_info.outputs.version_code }} | |
run: | | |
./gradlew :mifospay-android:bundleRelease | |
- name: Archive Build | |
uses: actions/upload-artifact@v4 | |
with: | |
name: release-aabs | |
path: ./**/*.aab | |
- name: Deploy to Playstore Internal | |
run: bundle exec fastlane deploy_internal | |
- name: Promote Internal to Beta | |
if: github.event.inputs.release_type == 'beta' | |
run: bundle exec fastlane promote_to_beta | |
build_ios: | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: 'temurin' | |
- name: Configure Ruby | |
uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 | |
with: | |
bundler-cache: true | |
- name: Install Fastlane | |
run: | | |
gem install bundler:2.2.27 | |
bundle install --jobs 4 --retry 3 | |
bundle exec fastlane add_plugin firebase_app_distribution | |
bundle exec fastlane add_plugin increment_build_number | |
- name: Build iOS App | |
continue-on-error: true | |
run: bundle exec fastlane ios build_ios | |
- name: Upload iOS Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ios-app | |
retention-days: 1 | |
compression-level: 9 | |
path: mifospay-ios/mifospay-ios-app.ipa | |
distribute_ios_app_to_firebase: | |
name: Build iOS App | |
needs: [ build_ios ] | |
runs-on: macos-latest | |
permissions: | |
contents: write | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Configure Ruby | |
uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 | |
with: | |
bundler-cache: true | |
- name: Install Fastlane | |
run: | | |
gem install bundler:2.2.27 | |
bundle install --jobs 4 --retry 3 | |
bundle exec fastlane add_plugin firebase_app_distribution | |
bundle exec fastlane add_plugin increment_build_number | |
- name: Download Beta Changelog | |
uses: actions/download-artifact@v4 | |
with: | |
name: beta-changelog | |
- name: Upload iOS App to Firebase Distribution | |
run: bundle exec fastlane ios deploy_on_firebase | |
- name: Print `git status` | |
run: git status | |
distribute_ios_app_to_app_center: | |
needs: [ build_ios ] | |
if: inputs.distribute_ios || inputs.release_type == 'internal' | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download iOS Artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ios-app | |
- name: Download Changelog | |
uses: actions/download-artifact@v4 | |
with: | |
name: git-changelog | |
# Distribute on App Store | |
build_desktop: | |
strategy: | |
matrix: | |
os: [ ubuntu-latest, macos-latest, windows-latest ] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: 'temurin' | |
- name: Build Desktop App | |
env: | |
NOTARIZATION_APPLE_ID: ${{ secrets.NOTARIZATION_APPLE_ID }} | |
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }} | |
NOTARIZATION_TEAM_ID: ${{ secrets.NOTARIZATION_TEAM_ID }} | |
run: ./gradlew packageReleaseDistributionForCurrentOS | |
- name: Upload Windows Apps | |
if: matrix.os == 'windows-latest' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: desktop-app-${{ matrix.os }} | |
retention-days: 1 | |
compression-level: 9 | |
path: | | |
./mifospay-desktop/build/compose/binaries/main-release/exe/*.exe | |
./mifospay-desktop/build/compose/binaries/main-release/msi/*.msi | |
- name: Upload Linux App | |
if: matrix.os == 'ubuntu-latest' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: desktop-app-${{ matrix.os }} | |
retention-days: 1 | |
compression-level: 9 | |
path: './mifospay-desktop/build/compose/binaries/main-release/deb/*.deb' | |
- name: Upload MacOS App | |
if: matrix.os == 'macos-latest' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: desktop-app-${{ matrix.os }} | |
retention-days: 1 | |
compression-level: 9 | |
path: './mifospay-desktop/build/compose/binaries/main-release/dmg/*.dmg' | |
distribute_desktop: | |
needs: [ build_desktop ] | |
if: inputs.distribute_desktop || inputs.release_type == 'beta' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download Desktop Artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: desktop-app-* | |
path: desktop-apps | |
# Distribute on Desktop Store, | |
build_web: | |
runs-on: windows-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: 'zulu' | |
java-version: 17 | |
- uses: actions/cache@v3 | |
with: | |
path: | | |
~/.gradle/caches | |
~/.gradle/wrapper | |
~/.konan | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} | |
- name: Build Web(JS) App | |
run: ./gradlew jsBrowserDistribution | |
- name: Archive Web Build | |
shell: pwsh | |
run: | | |
Compress-Archive -Path './mifospay-web/build/dist/js/productionExecutable/*' -DestinationPath 'web-app.zip' | |
- name: Upload Web Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: web-app | |
path: 'web-app.zip' | |
distribute_web: | |
needs: [ build_web ] | |
if: inputs.distribute_web || inputs.release_type == 'internal' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download Web Artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: web-app | |
# Deploy to Web Hosting | |
generate_release_info: | |
runs-on: ubuntu-latest | |
outputs: | |
version: ${{ steps.rel_number.outputs.version }} | |
version_code: ${{ steps.rel_number.outputs.version-code }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: ./.github/actions/create-release-number | |
name: Create Release Number | |
id: rel_number | |
- uses: ./.github/actions/create-release-notes | |
name: Create Release Notes | |
with: | |
tag-name: ${{ steps.rel_number.outputs.version }} | |
gh-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload GitHub Changelog | |
uses: actions/upload-artifact@v4 | |
with: | |
name: git-changelog | |
path: './mifospay-android/build/outputs/changelogGithub' | |
- name: Upload Beta Changelog | |
uses: actions/upload-artifact@v4 | |
with: | |
name: beta-changelog | |
path: './mifospay-android/build/outputs/changelogBeta' | |
release: | |
needs: [ build_android, build_desktop, build_web, build_ios ] | |
if: inputs.release_type == 'beta' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Download All Artifacts | |
uses: actions/download-artifact@v4 | |
- name: Download Git Changelog | |
uses: actions/download-artifact@v4 | |
with: | |
name: git-changelog | |
- name: Create Github Pre-Release | |
uses: softprops/[email protected] | |
with: | |
tag_name: ${{ needs.generate_release_info.outputs.version }} | |
body_path: changelogGithub | |
draft: false | |
prerelease: true | |
files: | | |
android-app/* | |
desktop-app-*/* | |
web-app/* | |
ios-app/* |