Skip to content

new: release ipa/app in Actions#1005

Merged
lollipopkit merged 5 commits intomainfrom
lollipopkit/issue770
Jan 15, 2026
Merged

new: release ipa/app in Actions#1005
lollipopkit merged 5 commits intomainfrom
lollipopkit/issue770

Conversation

@lollipopkit
Copy link
Owner

@lollipopkit lollipopkit commented Jan 14, 2026

Fixes #770

Summary by CodeRabbit

  • Chores
    • Expanded CI/CD release workflow to cover Android, Linux, Windows, macOS and iOS with dedicated platform jobs.
    • Replaced BUILD_NUMBER with RELEASE_TAG for consistent, versioned artifact naming across platforms.
    • Produces versioned artifacts (ZIP/IPA/APK/AppImage) named by RELEASE_TAG; release steps use RELEASE_TAG.
    • Adds recursive submodule checkouts and updates Flutter on Android.
    • Removes commented Apple block; adds active macOS and iOS release jobs with improved error handling and file checks.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 14, 2026

📝 Walkthrough

Walkthrough

Adds and restructures release workflows in .github/workflows/release.yml: replaces commented Apple block with active releaseIOS and releaseMacOS jobs, standardizes artifact naming to RELEASE_TAG, enables recursive submodule checkouts, adds platform-specific artifact validation/rename steps, and updates Android flutter version and release uploads.

Changes

Cohort / File(s) Summary
GitHub Actions Release Workflow
\.github/workflows/release.yml
Replaces BUILD_NUMBER with RELEASE_TAG; adds releaseMacOS and releaseIOS jobs on macOS; enables recursive submodules for Android/Linux/Windows; updates Android Flutter version 3.38.03.38.7; adds artifact validation/rename steps for Android (APK per-arch), Linux (AppImage), Windows (ZIP), macOS (ZIP), and iOS (IPA); release upload steps now reference RELEASE_TAG; removes commented Apple block and adds error/file-existence checks.

Sequence Diagram(s)

sequenceDiagram participant GH as GitHub Actions participant Runner as Platform Runner participant Checkout as actions/checkout participant FlutterAction as Flutter Installer participant Builder as flutter build participant Artifact as Filesystem participant Release as GitHub Release GH->>Runner: start releaseIOS / releaseMacOS (or other platform job) Runner->>Checkout: checkout repo (recursive submodules) Runner->>FlutterAction: install Flutter (specified version) Runner->>Builder: run flutter build (platform-specific, e.g., ios/macos) Builder-->>Artifact: produce IPA / app bundle / APK / AppImage / ZIP Runner->>Artifact: locate, validate, rename/package artifact to RELEASE_TAG-based filename Runner->>Release: upload RELEASE_TAG-named artifact(s) Release-->>GH: release artifact(s) published 
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'new: release ipa/app in Actions' directly addresses the main objective of enabling macOS and iOS app releases in GitHub Actions.
Linked Issues check ✅ Passed The PR implements the core requirements from issue #770: adds macOS and iOS release jobs with proper Flutter installation, builds via fl_build, and releases artifacts with RELEASE_TAG-based naming.
Out of Scope Changes check ✅ Passed All changes are directly related to enabling macOS and iOS releases in Actions. The BUILD_NUMBER to RELEASE_TAG refactor and architecture-based handling for Android are supporting changes necessary for consistent artifact naming across all platforms.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch lollipopkit/issue770

🧹 Recent nitpick comments
.github/workflows/release.yml (1)

144-145: Consider pinning Flutter version for consistency across platforms.

The Android job pins Flutter to version 3.38.7, but iOS and macOS jobs (and Linux/Windows) use the default stable channel without a version pin. This could lead to inconsistent builds if Flutter releases updates between job runs.

Suggested change for iOS and macOS jobs
 - name: Install Flutter uses: subosito/flutter-action@v2 + with: + channel: "stable" + flutter-version: "3.38.7"

Also applies to: 175-176


📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad3e4e7 and 703ca48.

📒 Files selected for processing (1)
  • .github/workflows/release.yml
🔇 Additional comments (6)
.github/workflows/release.yml (6)

12-14: LGTM!

Good use of workflow-level environment variables. Using github.ref_name for RELEASE_TAG correctly captures the tag name for versioned releases.


40-55: LGTM!

The rename loop with shopt -s nullglob and explicit count validation is a robust pattern. Good error handling with diagnostic output (ls -la) on failure.


117-127: Consistent pattern with other platforms.

Good use of shell: bash to ensure bash features work on Windows. Same verification concern as Linux regarding the output directory.


146-158: LGTM!

Good implementation addressing previous review feedback. The explicit path build/ios/ipa/*.ipa is correct for Flutter's standard output location. Using cp instead of mv preserves the original file, which is safer.


180-196: LGTM!

Excellent implementation addressing previous review feedback:

  • Uses absolute paths with $GITHUB_WORKSPACE instead of fragile relative paths
  • Validates both release directory and app bundle existence before packaging
  • Uses zip -ry which correctly preserves symlinks in macOS .app bundles
  • Changes to the release directory before zipping to avoid full path in archive

86-96: Specify the AppImage output directory explicitly.

Unlike the Android job which explicitly references build/app/outputs/flutter-apk, the Linux rename step assumes the AppImage is in the workspace root. If fl_build outputs the AppImage to a subdirectory (such as build/linux/), the glob pattern will fail silently. Specify the output directory explicitly:

Example fix
shopt -s nullglob BUILD_DIR="build/linux/x64/release" # or determine from fl_build matches=("$BUILD_DIR"/${APP_NAME}_*_amd64.AppImage)

Alternatively, investigate fl_build's documentation to confirm its AppImage output location and update the script accordingly.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.github/workflows/release.yml: - Around line 109-111: The pipeline step that runs the cp command uses a brittle glob (cp build/ios/ipa/*.ipa ...) which will fail if no .ipa exists or if multiple .ipa files exist; update the run block to explicitly locate a single IPA (e.g., pick the most recent with a command like listing/sorting or find ... | head -n1), verify that the selected file exists, and then copy it to ${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_ios.ipa, failing the job with a clear error if no IPA is found to avoid silent or confusing cp errors. 
🧹 Nitpick comments (3)
.github/workflows/release.yml (3)

104-107: Consider pinning the Flutter version for reproducible builds.

The Android job pins Flutter to version 3.38.0, but this job uses only channel: "stable" without a specific version. This could lead to inconsistent builds if the stable channel updates between releases.

Suggested change for consistency
 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: "3.38.0"

126-129: Same recommendation: pin Flutter version for consistency.

Same concern as the iOS job - consider pinning the Flutter version to match the Android job for reproducible builds.

Suggested change
 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: "3.38.0"

131-134: Add error handling for the build and zip steps.

If the build fails or the app directory doesn't exist, the cd and zip commands may fail silently or with unclear errors. Consider adding validation.

Suggested improvement
 - name: Build run: | dart run fl_build -p macos -- --no-codesign + APP_DIR="build/macos/Build/Products/Release/${{ env.APP_NAME }}.app" + if [ ! -d "$APP_DIR" ]; then + echo "Error: App bundle not found at $APP_DIR" + exit 1 + fi cd build/macos/Build/Products/Release zip -r "../../../../../${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_macos.zip" "${{ env.APP_NAME }}.app"
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8589b3b and 17ea373.

📒 Files selected for processing (1)
  • .github/workflows/release.yml
🔇 Additional comments (1)
.github/workflows/release.yml (1)

98-141: Implementation follows the established pattern from existing release jobs.

The iOS and macOS jobs correctly use the dart run fl_build command followed by artifact operations using ${{ env.APP_NAME }} and ${{ env.BUILD_NUMBER }}, which is identical to the Android, Linux, and Windows jobs. Since the Android job in the same workflow already relies on fl_build setting these environment variables, the mechanism is proven to work. The artifact naming (_ios.ipa, _macos.zip) is appropriate and consistent with platform conventions.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.github/workflows/release.yml: - Around line 137-140: Replace the fragile relative cd and blind zip with an absolute-path check: after running `dart run fl_build -p macos -- --no-codesign`, compute the release directory using the workspace (e.g., join `$GITHUB_WORKSPACE` with `build/macos/Build/Products/Release`) and the target app name `${{ env.APP_NAME }}.app`, verify the app directory exists (fail with a clear message and non‑zero exit if not), then run `zip -r` against the verified absolute path and write the artifact to the intended zip name using `${{ env.BUILD_NUMBER }}`; update the existing run block that currently contains `cd build/macos/Build/Products/Release` and the zip command to perform these checks and use absolute paths. 
🧹 Nitpick comments (2)
.github/workflows/release.yml (2)

104-107: Consider pinning Flutter version for build reproducibility.

The Android job pins Flutter to version 3.38.0 (line 28), but this iOS job uses only the stable channel without a specific version. This could result in different Flutter versions across platform builds if released at different times, potentially causing inconsistent behavior.

Suggested fix to align with Android job
 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: "3.38.0"

132-135: Same version pinning concern as iOS job.

Consider adding flutter-version: "3.38.0" for consistency with the Android job.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 17ea373 and feb8030.

📒 Files selected for processing (1)
  • .github/workflows/release.yml
🔇 Additional comments (1)
.github/workflows/release.yml (1)

109-117: Good error handling for IPA file discovery.

The find with head -n 1 approach, combined with explicit validation and error messaging, properly handles edge cases where no IPA is generated or multiple exist. This is a solid improvement.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
.github/workflows/release.yml (2)

104-107: Consider pinning Flutter version for reproducible builds.

The Android job pins Flutter to version 3.38.0 (line 28), but this iOS job only specifies channel: "stable". This could lead to inconsistent builds if the stable channel updates between releases.

Suggested fix for version consistency
 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: "3.38.0"

132-135: Consider pinning Flutter version for reproducible builds.

Same as the iOS job—pinning the Flutter version would ensure consistent builds across platforms.

Suggested fix
 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" + flutter-version: "3.38.0"
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between feb8030 and 6accdc3.

📒 Files selected for processing (1)
  • .github/workflows/release.yml
🔇 Additional comments (3)
.github/workflows/release.yml (3)

108-117: LGTM!

The build step properly handles edge cases with the find command and validates the IPA file exists before copying. Good error handling that addresses the previous review feedback.


147-157: Good error handling for build artifact validation.

The validation checks for both the release directory and app bundle before attempting to zip are well-implemented. Using $GITHUB_WORKSPACE for absolute paths addresses the previous review feedback about fragile relative paths.


158-164: LGTM!

The release step follows the same pattern as other platform jobs and correctly references the versioned zip file.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@lollipopkit lollipopkit merged commit cd3c094 into main Jan 15, 2026
2 checks passed
@lollipopkit lollipopkit deleted the lollipopkit/issue770 branch January 15, 2026 04:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant