diff --git a/.github/workflows/mobile-release.yml b/.github/workflows/mobile-release.yml new file mode 100644 index 000000000..cfe8ef986 --- /dev/null +++ b/.github/workflows/mobile-release.yml @@ -0,0 +1,114 @@ +name: Mobile Release + +on: + push: + tags: + - 'mobile-v*' + +permissions: + contents: write + +jobs: + build: + name: Build Mobile Apps + uses: ./.github/workflows/flutter-build.yml + secrets: inherit + + release: + name: Create Mobile GitHub Release + needs: [build] + runs-on: ubuntu-latest + timeout-minutes: 10 + + permissions: + contents: write + + steps: + - name: Extract version from tag + id: version + run: | + # Strip 'mobile-' prefix to get the version part (e.g., 'mobile-v1.0.0' -> 'v1.0.0') + VERSION="${GITHUB_REF_NAME#mobile-}" + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Extracted version: $VERSION" + + - name: Download Android APK artifact + uses: actions/download-artifact@v4.3.0 + with: + name: app-release-apk + path: ${{ runner.temp }}/mobile-artifacts + + - name: Download iOS build artifact + uses: actions/download-artifact@v4.3.0 + with: + name: ios-build-unsigned + path: ${{ runner.temp }}/ios-build + + - name: Prepare release assets + run: | + set -euo pipefail + mkdir -p ${{ runner.temp }}/release-assets + + echo "=== Downloaded artifacts ===" + echo "Mobile artifacts:" + ls -laR "${{ runner.temp }}/mobile-artifacts" || echo "No mobile-artifacts directory" + echo "iOS build:" + ls -laR "${{ runner.temp }}/ios-build" || echo "No ios-build directory" + echo "===========================" + + # Copy debug APK if it exists + if [ -f "${{ runner.temp }}/mobile-artifacts/app-debug.apk" ]; then + cp "${{ runner.temp }}/mobile-artifacts/app-debug.apk" \ + "${{ runner.temp }}/release-assets/sure-${{ steps.version.outputs.version }}-debug.apk" + echo "✓ Debug APK prepared" + fi + + # Copy release APK if it exists + if [ -f "${{ runner.temp }}/mobile-artifacts/app-release.apk" ]; then + cp "${{ runner.temp }}/mobile-artifacts/app-release.apk" \ + "${{ runner.temp }}/release-assets/sure-${{ steps.version.outputs.version }}.apk" + echo "✓ Release APK prepared" + fi + + # Create iOS app archive (zip the .app bundle) + if [ -d "${{ runner.temp }}/ios-build/ios/iphoneos/Runner.app" ]; then + cd "${{ runner.temp }}/ios-build/ios/iphoneos" + zip -r "${{ runner.temp }}/release-assets/sure-${{ steps.version.outputs.version }}-ios-unsigned.zip" Runner.app + echo "✓ iOS build archive prepared" + fi + + # Copy iOS build info + if [ -f "${{ runner.temp }}/ios-build/ios-build-info.txt" ]; then + cp "${{ runner.temp }}/ios-build/ios-build-info.txt" "${{ runner.temp }}/release-assets/" + fi + + echo "Release assets:" + ls -la "${{ runner.temp }}/release-assets/" + + # Fail early if no assets were produced + if [ -z "$(ls -A "${{ runner.temp }}/release-assets/")" ]; then + echo "::error::No release assets were produced" + exit 1 + fi + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + name: "${{ steps.version.outputs.version }} (Mobile)" + draft: false + prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'rc') }} + generate_release_notes: false + files: | + ${{ runner.temp }}/release-assets/* + body: | + ## Mobile-Only Release: ${{ steps.version.outputs.version }} + + This is a mobile-only release. It does not include server-side changes. + + ### Downloads + + - **Android APK**: Debug build for testing on Android devices + - **iOS Build**: Unsigned iOS build (requires code signing for installation) + + > **Note**: These are builds intended for testing purposes. For production use, please build from source with proper signing credentials.