Multi-Platform App Build and Publish #4
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: true | |
description: Distribute Web App | |
# turning off iOS build for now | |
build_ios: | |
type: boolean | |
default: false | |
description: Build iOS App | |
permissions: | |
contents: write | |
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. | |
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. | |
concurrency: | |
group: "pages" | |
cancel-in-progress: false | |
jobs: | |
build_android: | |
name: Build Android Application | |
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: | | |
./mifospay-android/build/outputs/apk/demo/release/mifospay-android-demo-release.apk | |
./mifospay-android/build/outputs/apk/prod/release/mifospay-android-prod-release.apk | |
distribute_android_on_firebase: | |
name: Deploy Android App 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: Display structure of downloaded files | |
run: ls -R | |
- name: Move APK to build directory | |
run: | | |
mkdir -p ./mifospay-android/build/outputs/apk/prod/release/ | |
mv android-app/mifospay-android-prod-release.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: | |
name: Distribute Android App On Play Store | |
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 | |
# Disabled iOS build for now | |
build_ios: | |
name: Build iOS App | |
if: inputs.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 | |
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: Distribute iOS App On Firebase | |
needs: [ build_ios, generate_release_info ] | |
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 iOS App | |
uses: actions/download-artifact@v4 | |
with: | |
name: ios-app | |
- name: Download Beta Changelog | |
uses: actions/download-artifact@v4 | |
with: | |
name: beta-changelog | |
- name: Move APK to build directory | |
run: | | |
mv ios-app/*.ipa ./mifospay-ios/ | |
mv beta-changelog/changelogBeta ./mifospay-android/build/outputs/ | |
- 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, generate_release_info ] | |
name: Distribute iOS App On App Center | |
if: inputs.distribute_ios | |
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: | |
name: Build Desktop App | |
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: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
- 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: | |
name: Distribute Desktop App | |
needs: [ build_desktop ] | |
if: inputs.distribute_desktop | |
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 | |
- name: Display structure of downloaded files | |
run: ls -R | |
# Distribute on Desktop Store, | |
# print downloaded desktop artifacts | |
- name: Print `git status` | |
run: git status | |
build_web: | |
name: Build Web Application | |
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: Upload Web Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: web-app | |
path: './mifospay-web/build/dist/js/productionExecutable/*' | |
distribute_web: | |
name: Publish Web App | |
needs: [ build_web ] | |
if: inputs.distribute_web | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: 'zulu' | |
java-version: 17 | |
- name: Download Web Artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: web-app | |
- name: Setup Pages | |
uses: actions/configure-pages@v5 | |
- name: Upload static files as artifact | |
uses: actions/upload-pages-artifact@v3 | |
with: | |
path: 'web-app/*' | |
- name: Deploy to GitHub Pages | |
id: deployment | |
uses: actions/deploy-pages@v4 | |
generate_release_info: | |
name: 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: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: 'temurin' | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
- 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' | |
github_release: | |
name: Create Github Release | |
needs: [ build_android, build_desktop, build_web, build_ios, generate_release_info ] | |
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: Archive Web Build | |
shell: pwsh | |
run: | | |
Compress-Archive -Path 'web-app/*' -DestinationPath 'web-app.zip' | |
- 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.zip | |
ios-app/* |