name: Flutter CI & Release on: push: # branches: [main] tags: ["v*.*.*"] # pull_request: # branches: [main] workflow_dispatch: jobs: # test: # name: Test # runs-on: ubuntu-latest # steps: # - name: Checkout repository # uses: actions/checkout@v4 # with: # submodules: recursive # - name: Setup Flutter Environment # uses: ./.github/actions/flutter-setup # Path to the composite action directory # # Pass inputs if needed (optional, using defaults here) # # with: # # flutter-channel: 'stable' # # java-version: '17' # # Debug: Echo current directory contents # - name: List root directory contents # run: | # pwd # ls -la # # Debug: Recursive directory structure # - name: Show full directory structure # run: | # echo "Full directory structure:" # tree -L 3 # # Debug: Submodule status and details # - name: Check submodule status # run: | # echo "Submodule status:" # git submodule status # echo "\nSubmodule details:" # git submodule foreach 'echo $path: && pwd && ls -la' # # - name: Run static analysis # # run: flutter analyze # - name: Check formatting # run: | # dart format -o none --set-exit-if-changed lib/ # - name: Run tests # run: flutter test # build_android: # name: Build Android APKs # needs: test # runs-on: ubuntu-latest # steps: # - name: Checkout repository # uses: actions/checkout@v4 # with: # submodules: recursive # - name: Setup Flutter Environment # uses: ./.github/actions/flutter-setup # Path to the composite action directory # with: # flutter-channel: stable # java-version: 17 # - name: Accept Android SDK Licenses # run: | # yes | sudo $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses # - name: Decode android/upload.jks # run: echo "${{ secrets.UPLOAD_KEYSTORE_JKS }}" | base64 --decode > android/upload.jks # - name: Decode android/key.properties # run: echo "${{ secrets.KEY_PROPERTIES }}" | base64 --decode > android/key.properties # - name: Build APKs # run: flutter build apk --release --split-per-abi # - name: Build Universal APK # run: flutter build apk --release # - name: Rename Universal APK # run: mv build/app/outputs/flutter-apk/{app-release,app-universal-release}.apk # - name: Build App Bundle # run: flutter build appbundle --release # - name: Upload Android APK Artifact # uses: actions/upload-artifact@v4 # with: # name: android-release-artifacts # path: | # build/app/outputs/flutter-apk/*-release*.apk # build/app/outputs/bundle/release/*.aab # build_linux: # needs: test # runs-on: ubuntu-latest # steps: # - name: Checkout repository # uses: actions/checkout@v4 # with: # submodules: recursive # - name: Setup Flutter Environment # uses: ./.github/actions/flutter-setup # Path to the composite action directory # - name: Install Linux dependencies # run: | # sudo apt-get update -y # sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev locate libfuse2 # # Download and install appimagetool # wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage # chmod +x appimagetool-x86_64.AppImage # sudo mv appimagetool-x86_64.AppImage /usr/local/bin/appimagetool # shell: bash # - name: setup fastforge # run: | # dart pub global activate fastforge # - name: Build Linux AppImage and deb # run: fastforge package --platform linux --targets deb,appimage # - name: Rename Linux Artifacts # run: | # # Find and rename .deb file # DEB_FILE=$(find dist/ -name "*.deb" -type f) # if [ -n "$DEB_FILE" ]; then # mv "$DEB_FILE" dist/vaani-linux-amd64.deb # echo "Renamed DEB: $DEB_FILE to dist/vaani-linux-amd64.deb" # else # echo "Error: .deb file not found in dist/" # exit 1 # fi # # Find and rename .AppImage file # APPIMAGE_FILE=$(find dist/ -name "*.AppImage" -type f) # if [ -n "$APPIMAGE_FILE" ]; then # mv "$APPIMAGE_FILE" dist/vaani-linux-amd64.AppImage # echo "Renamed AppImage: $APPIMAGE_FILE to dist/vaani-linux-amd64.AppImage" # else # echo "Error: .AppImage file not found in dist/" # exit 1 # fi # shell: bash # - name: Upload Linux Artifacts # uses: actions/upload-artifact@v4 # with: # name: linux-release-artifacts # path: | # dist/vaani-linux-amd64.deb # dist/vaani-linux-amd64.AppImage # build_windows: # needs: test # runs-on: windows-latest # permissions: # contents: write # steps: # - name: Checkout repository # uses: actions/checkout@v4 # with: # submodules: recursive # - name: Setup Flutter # uses: subosito/flutter-action@v2 # with: # flutter-version: "3.32.0" # cache: true # - name: Restore Packages # run: | # flutter pub get # - name: Install flutter_distributor # run: dart pub global activate flutter_distributor # - name: Build Windows # run: | # flutter_distributor package --platform windows --targets msix,zip --skip-clean # - name: Upload Windows Artifacts # uses: actions/upload-artifact@v4 # with: # name: windows-release-artifacts # path: | # dist/*/*.msix # dist/*/*.zip build_macos: # needs: test runs-on: macos-latest permissions: contents: write steps: - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: "3.32.0" cache: true - name: Restore packages run: | flutter pub get - name: Install appdmg run: npm install -g appdmg - name: Install flutter_distributor run: dart pub global activate flutter_distributor - name: Build MacOS run: | flutter_distributor package --platform macos --targets dmg,zip --skip-clean - name: Upload MacOS to Artifacts uses: actions/upload-artifact@v4 with: name: macos-release-artifacts path: | dist/*/*.dmg dist/*/*.zip # Job 4: Create GitHub Release (NEW - runs only on tag pushes) create_release: name: Create GitHub Release # needs: [build_android, build_linux, build_windows, build_macos] # Depends on successful builds needs: build_macos # Depends on successful builds runs-on: ubuntu-latest permissions: contents: write # Need write access to create release # <<< CONDITION: Only run this job if the trigger was a tag starting with 'v' if: startsWith(github.ref, 'refs/tags/v') steps: # No checkout needed if only downloading artifacts and using context variables # - name: Checkout repository # uses: actions/checkout@v4 # Download artifacts created earlier IN THIS SAME WORKFLOW RUN - name: Download Android Artifacts uses: actions/download-artifact@v4 with: name: android-release-artifacts path: ./release-artifacts/android - name: Download Linux Artifacts uses: actions/download-artifact@v4 with: name: linux-release-artifacts path: ./release-artifacts/linux - name: Download Windows Artifacts uses: actions/download-artifact@v4 with: name: windows-release-artifacts path: ./release-artifacts/windows - name: Download Macos Artifacts uses: actions/download-artifact@v4 with: name: macos-release-artifacts path: ./release-artifacts/macos - name: List downloaded files (for debugging) run: ls -R ./release-artifacts shell: bash # Extract version info from the tag - name: Extract Version from Tag id: version run: | TAG_NAME=${GITHUB_REF#refs/tags/} VERSION=${TAG_NAME#v} echo "tag=${TAG_NAME}" >> $GITHUB_OUTPUT echo "version=${VERSION}" >> $GITHUB_OUTPUT shell: bash # Generate release notes (optional, consider its configuration for tags) - name: Generate Release Notes id: generate_release_notes uses: release-drafter/release-drafter@v6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Create the GitHub Release using downloaded artifacts - name: Create GitHub Release uses: ncipollo/release-action@v1 with: artifacts: "./release-artifacts/**/*" # Use downloaded artifacts name: Release v${{ steps.version.outputs.version }} tag: ${{ github.ref }} body: ${{ steps.generate_release_notes.outputs.body }} # token: ${{ secrets.GITHUB_TOKEN }} # Usually inferred