name: Release on: push: tags: - 'v*' concurrency: group: release-${{ github.ref }} cancel-in-progress: true jobs: build-android: name: Build Android runs-on: ubuntu-latest permissions: contents: write steps: #1 Checkout Repository - name: Checkout Repository uses: actions/checkout@v4 #2 Setup Java - name: Set Up Java uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' - name: Setup Gradle and caching uses: gradle/actions/setup-gradle@v3 with: cache-read-only: false #3 Setup Flutter - name: Set Up Flutter uses: subosito/flutter-action@v2 with: channel: 'stable' cache: true #4 Install Dependencies - name: Install Dependencies run: flutter pub get --enforce-lockfile - name: Generate code (build_runner) run: dart run build_runner build --delete-conflicting-outputs #5 Setup Keystore - name: Create Keystore run: | echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > app/conduit-keystore.jks echo "${{ secrets.ANDROID_KEY_PROPERTIES_BASE64 }}" | base64 --decode > key.properties env: ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} ANDROID_KEY_PROPERTIES_BASE64: ${{ secrets.ANDROID_KEY_PROPERTIES_BASE64 }} working-directory: android - name: Build APK run: flutter build apk --split-per-abi --release - name: Build appBundle run: flutter build appbundle --release - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: Android-Release path: | build/app/outputs/flutter-apk/app-arm64-v8a-release.apk build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk build/app/outputs/flutter-apk/app-x86_64-release.apk build/app/outputs/bundle/release/app-release.aab - name: Create or Update Release uses: ncipollo/release-action@v1 with: artifacts: "build/app/outputs/flutter-apk/app-arm64-v8a-release.apk,build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk,build/app/outputs/flutter-apk/app-x86_64-release.apk,build/app/outputs/bundle/release/app-release.aab" tag: ${{ github.ref_name }} token: ${{ secrets.GITHUB_TOKEN }} generateReleaseNotes: true allowUpdates: true makeLatest: true build-ios: name: Build iOS runs-on: macos-latest permissions: contents: write steps: #1 Checkout Repository - name: Checkout Repository uses: actions/checkout@v4 #2 Setup Flutter - name: Set Up Flutter uses: subosito/flutter-action@v2 with: channel: 'stable' cache: true #3 Install Dependencies - name: Install Dependencies run: flutter pub get --enforce-lockfile - name: Generate code (build_runner) run: dart run build_runner build --delete-conflicting-outputs #4 Setup Xcode - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: latest-stable #5 Cache CocoaPods - name: Cache CocoaPods uses: actions/cache@v4 with: path: | ios/Pods key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- - name: Install CocoaPods run: | cd ios pod install --verbose #6 Cache Xcode DerivedData - name: Cache Xcode DerivedData uses: actions/cache@v4 with: path: | ~/Library/Developer/Xcode/DerivedData key: ${{ runner.os }}-xcode-${{ hashFiles('ios/Podfile.lock', 'ios/Runner.xcodeproj/project.pbxproj', 'pubspec.lock') }} restore-keys: | ${{ runner.os }}-xcode- - name: Build iOS App run: | flutter build ios --release --no-codesign #7 Create IPA from App Bundle - name: Create IPA run: | mkdir -p build/ios/ipa cd build/ios/Release-iphoneos mkdir Payload cp -r Runner.app Payload/ zip -r ../ipa/conduit.ipa Payload cd ../ipa #8 Upload Artifacts - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: iOS-Release path: | build/ios/ipa/*.ipa #9 Update Release - name: Update Release with IPA uses: ncipollo/release-action@v1 with: artifacts: "build/ios/ipa/conduit.ipa" tag: ${{ github.ref_name }} token: ${{ secrets.GITHUB_TOKEN }} allowUpdates: true makeLatest: true omitBody: true omitBodyDuringUpdate: true omitNameDuringUpdate: true