1+ name : Production
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ tags :
8+ - " v*"
9+ pull_request :
10+ branches :
11+ - main
12+
13+ jobs :
14+ verify :
15+ name : Verify Code Quality
16+ runs-on : ubuntu-latest
17+ steps :
18+ - name : Checkout Repository
19+ uses : actions/checkout@v4
20+ - name : Setup Java (For Android tools)
21+ uses : actions/setup-java@v4
22+ with :
23+ distribution : " zulu"
24+ java-version : " 17"
25+ - name : Setup Flutter
26+ uses : subosito/flutter-action@v2
27+ with :
28+ channel : " stable"
29+ cache : true
30+ - name : Install Dependencies
31+ run : flutter pub get
32+ - name : Check Formatting
33+ run : dart format --output=none --set-exit-if-changed .
34+ - name : Static Code Analysis
35+ run : flutter analyze
36+ - name : Run Unit & Widget Tests
37+ run : flutter test --coverage
38+ build-android :
39+ name : Build Production Android
40+ needs : verify
41+ runs-on : ubuntu-latest
42+ if : github.event_name == 'push'
43+ steps :
44+ - name : Checkout Repository
45+ uses : actions/checkout@v4
46+ - name : Setup Java
47+ uses : actions/setup-java@v4
48+ with :
49+ distribution : " zulu"
50+ java-version : " 17"
51+ - name : Setup Flutter
52+ uses : subosito/flutter-action@v2
53+ with :
54+ channel : " stable"
55+ cache : true
56+ - name : Install Dependencies
57+ run : flutter pub get
58+ - name : Decode Android Keystore
59+ run : |
60+ echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android/app/upload-keystore.jks
61+ - name : Build Android App Bundle (AAB)
62+ env :
63+ KEYSTORE_PASSWORD : ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
64+ KEY_ALIAS : ${{ secrets.ANDROID_KEY_ALIAS }}
65+ KEY_PASSWORD : ${{ secrets.ANDROID_KEY_PASSWORD }}
66+ run : |
67+ flutter build appbundle --release \
68+ --dart-define=APP_ENV=production
69+ - name : Upload Android Artifact
70+ uses : actions/upload-artifact@v4
71+ with :
72+ name : production-appbundle
73+ path : build/app/outputs/bundle/release/app-release.aab
74+ build-ios :
75+ name : Build Production iOS
76+ needs : verify
77+ runs-on : macos-latest
78+ if : github.event_name == 'push'
79+ steps :
80+ - name : Checkout Repository
81+ uses : actions/checkout@v4
82+ - name : Setup Flutter
83+ uses : subosito/flutter-action@v2
84+ with :
85+ channel : " stable"
86+ cache : true
87+ - name : Install Dependencies
88+ run : flutter pub get
89+ - name : Install Apple Certificate and Provisioning Profile
90+ env :
91+ BUILD_CERTIFICATE_BASE64 : ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
92+ P12_PASSWORD : ${{ secrets.P12_PASSWORD }}
93+ BUILD_PROVISION_PROFILE_BASE64 : ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
94+ KEYCHAIN_PASSWORD : ${{ secrets.KEYCHAIN_PASSWORD }}
95+ run : |
96+ CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
97+ PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
98+ KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
99+
100+ echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
101+ echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
102+
103+ security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
104+ security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
105+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
106+
107+ security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
108+ security list-keychain -d user -s $KEYCHAIN_PATH
109+
110+ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
111+ cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles/
112+ - name : Build iOS IPA
113+ run : |
114+ flutter build ipa --release \
115+ --export-options-plist=$HOME/export_options.plist \
116+ --dart-define=APP_ENV=production
117+ - name : Upload iOS Artifact
118+ uses : actions/upload-artifact@v4
119+ with :
120+ name : production-ipa
121+ path : build/ios/ipa/*.ipa
0 commit comments