Skip to content

Commit 77fc7d7

Browse files
committed
feat: Add GitHub Actions workflow for building iOS IPA with customizable build modes
1 parent db074b5 commit 77fc7d7

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

.github/workflows/build-ios.yml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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

Comments
 (0)