name: Build And Upload Release Assets on: release: types: [published] workflow_dispatch: permissions: contents: write env: FLUTTER_VERSION: "3.35.6" APP_NAME: meshcore-sar jobs: build-android: name: Build Android APK runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Java uses: actions/setup-java@v4 with: distribution: temurin java-version: "17" - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} channel: stable cache: true - name: Install dependencies run: flutter pub get - name: Build APK run: flutter build apk --release - name: Prepare APK artifact run: | TAG="${{ github.event.release.tag_name || github.ref_name }}" cp build/app/outputs/flutter-apk/app-release.apk "${APP_NAME}-${TAG}-android.apk" - name: Upload APK artifact uses: actions/upload-artifact@v4 with: name: release-android path: "${{ env.APP_NAME }}-*-android.apk" if-no-files-found: error build-linux: name: Build Linux App runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Linux build dependencies run: | sudo apt-get update sudo apt-get install -y \ clang \ cmake \ ninja-build \ pkg-config \ libgtk-3-dev \ liblzma-dev - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} channel: stable cache: true - name: Enable Linux desktop run: flutter config --enable-linux-desktop - name: Install dependencies run: flutter pub get - name: Build Linux release run: flutter build linux --release - name: Package Linux artifact run: | TAG="${{ github.event.release.tag_name || github.ref_name }}" tar -C build/linux/x64/release -czf "${APP_NAME}-${TAG}-linux.tar.gz" bundle - name: Upload Linux artifact uses: actions/upload-artifact@v4 with: name: release-linux path: "${{ env.APP_NAME }}-*-linux.tar.gz" if-no-files-found: error build-windows: name: Build Windows App runs-on: windows-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} channel: stable cache: true - name: Enable Windows desktop shell: pwsh run: flutter config --enable-windows-desktop - name: Install dependencies shell: pwsh run: flutter pub get - name: Build Windows release shell: pwsh run: flutter build windows --release - name: Package Windows artifact shell: pwsh run: | $Tag = "${{ github.event.release.tag_name || github.ref_name }}" $Output = "${{ env.APP_NAME }}-$Tag-windows.zip" Compress-Archive -Path "build/windows/x64/runner/Release/*" -DestinationPath $Output - name: Upload Windows artifact uses: actions/upload-artifact@v4 with: name: release-windows path: "${{ env.APP_NAME }}-*-windows.zip" if-no-files-found: error build-macos: name: Build macOS DMG runs-on: macos-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} channel: stable cache: true - name: Enable macOS desktop run: flutter config --enable-macos-desktop - name: Install dependencies run: flutter pub get - name: Build macOS release run: flutter build macos --release - name: Create DMG run: | TAG="${{ github.event.release.tag_name || github.ref_name }}" APP_PATH=$(find build/macos/Build/Products/Release -maxdepth 1 -name "*.app" -print -quit) if [ -z "$APP_PATH" ]; then echo "No .app bundle found in build output" exit 1 fi hdiutil create -volname "MeshCore SAR" -srcfolder "$APP_PATH" -ov -format UDZO "${APP_NAME}-${TAG}-macos.dmg" - name: Upload macOS artifact uses: actions/upload-artifact@v4 with: name: release-macos path: "${{ env.APP_NAME }}-*-macos.dmg" if-no-files-found: error upload-release-assets: name: Upload Assets To Release runs-on: ubuntu-latest needs: - build-android - build-linux - build-windows - build-macos steps: - name: Download all build artifacts uses: actions/download-artifact@v4 with: pattern: release-* path: dist merge-multiple: true - name: Upload assets to published release uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.event.release.tag_name || github.ref_name }} files: | dist/*.apk dist/*.tar.gz dist/*.zip dist/*.dmg fail_on_unmatched_files: true