1+ name : Build iOS IPA
2+
3+ on :
4+ workflow_dispatch :
5+ inputs :
6+ build_mode :
7+ description : ' Build mode'
8+ required : true
9+ default : ' release'
10+ type : choice
11+ options :
12+ - release
13+ - debug
14+ - profile
15+
16+ jobs :
17+ build_ios :
18+ runs-on : macos-latest
19+
20+ steps :
21+ - name : Checkout repository
22+ uses : actions/checkout@v4
23+
24+ - name : Setup Flutter
25+ uses : subosito/flutter-action@v2
26+ with :
27+ flutter-version : ' 3.24.0'
28+ channel : ' stable'
29+ cache : true
30+
31+ - name : Install dependencies
32+ run : flutter pub get
33+
34+ - name : Setup Xcode
35+ uses : maxim-lobanov/setup-xcode@v1
36+ with :
37+ xcode-version : latest-stable
38+
39+ - name : Install CocoaPods
40+ run : |
41+ cd ios
42+ pod install
43+ cd ..
44+
45+ - name : Build iOS (without codesigning)
46+ run : |
47+ flutter build ios --${{ inputs.build_mode }} --no-codesign
48+
49+ - name : Create IPA manually
50+ run : |
51+ mkdir -p Payload
52+ cp -r build/ios/iphoneos/Runner.app Payload/
53+ zip -r app-${{ inputs.build_mode }}-unsigned.ipa Payload
54+ rm -rf Payload
55+
56+ - name : Get latest release
57+ id : get_release
58+ uses : actions/github-script@v7
59+ with :
60+ script : |
61+ const releases = await github.rest.repos.listReleases({
62+ owner: context.repo.owner,
63+ repo: context.repo.repo,
64+ per_page: 1
65+ });
66+
67+ if (releases.data.length === 0) {
68+ core.setFailed('No releases found. Please create a release first.');
69+ return;
70+ }
71+
72+ const latestRelease = releases.data[0];
73+ core.setOutput('upload_url', latestRelease.upload_url);
74+ core.setOutput('release_id', latestRelease.id);
75+ core.setOutput('release_tag', latestRelease.tag_name);
76+ console.log(`Found release: ${latestRelease.tag_name}`);
77+
78+ - name : Upload IPA to latest release
79+ uses : softprops/action-gh-release@v1
80+ with :
81+ tag_name : ${{ steps.get_release.outputs.release_tag }}
82+ files : ./app-${{ inputs.build_mode }}-unsigned.ipa
83+ name : app-ios-${{ inputs.build_mode }}-${{ steps.get_release.outputs.release_tag }}.ipa
84+
85+ - name : Upload IPA artifact (backup)
86+ uses : actions/upload-artifact@v4
87+ with :
88+ name : app-${{ inputs.build_mode }}-unsigned.ipa
89+ path : app-${{ inputs.build_mode }}-unsigned.ipa
90+ retention-days : 30
0 commit comments