1+ name : CI/CD Pipeline
2+
3+ on :
4+ push :
5+ branches : [ main, develop ]
6+ pull_request :
7+ branches : [ main, develop ]
8+ push :
9+ tags :
10+ - ' v*'
11+
12+ jobs :
13+ test :
14+ runs-on : ubuntu-latest
15+ if : github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/')
16+
17+ steps :
18+ - name : Checkout code
19+ uses : actions/checkout@v4
20+
21+ - name : Setup Java
22+ uses : actions/setup-java@v4
23+ with :
24+ distribution : ' zulu'
25+ java-version : ' 17'
26+
27+ - name : Setup Flutter
28+ uses : subosito/flutter-action@v2
29+ with :
30+ flutter-version : ' 3.19.0'
31+ channel : ' stable'
32+
33+ - name : Cache dependencies
34+ uses : actions/cache@v4
35+ with :
36+ path : |
37+ ~/.gradle/caches
38+ ~/.gradle/wrapper
39+ ${{ env.PUB_CACHE }}
40+ key : ${{ runner.os }}-deps-${{ hashFiles('**/pubspec.lock', '**/*.gradle*', '**/gradle-wrapper.properties') }}
41+ restore-keys : |
42+ ${{ runner.os }}-deps-
43+
44+ - name : Get Flutter dependencies
45+ run : flutter pub get
46+
47+ - name : Analyze code
48+ run : flutter analyze
49+
50+ - name : Run tests
51+ run : flutter test
52+
53+ - name : Upload test results
54+ uses : actions/upload-artifact@v4
55+ if : always()
56+ with :
57+ name : test-results
58+ path : |
59+ coverage/
60+ test-results/
61+
62+ build-debug :
63+ runs-on : ubuntu-latest
64+ if : github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/')
65+ needs : test
66+
67+ steps :
68+ - name : Checkout code
69+ uses : actions/checkout@v4
70+
71+ - name : Setup Java
72+ uses : actions/setup-java@v4
73+ with :
74+ distribution : ' zulu'
75+ java-version : ' 17'
76+
77+ - name : Setup Flutter
78+ uses : subosito/flutter-action@v2
79+ with :
80+ flutter-version : ' 3.19.0'
81+ channel : ' stable'
82+
83+ - name : Cache dependencies
84+ uses : actions/cache@v4
85+ with :
86+ path : |
87+ ~/.gradle/caches
88+ ~/.gradle/wrapper
89+ ${{ env.PUB_CACHE }}
90+ key : ${{ runner.os }}-deps-${{ hashFiles('**/pubspec.lock', '**/*.gradle*', '**/gradle-wrapper.properties') }}
91+ restore-keys : |
92+ ${{ runner.os }}-deps-
93+
94+ - name : Get Flutter dependencies
95+ run : flutter pub get
96+
97+ - name : Build Debug APK
98+ run : flutter build apk --debug
99+
100+ - name : Upload Debug APK
101+ uses : actions/upload-artifact@v4
102+ with :
103+ name : debug-apk
104+ path : build/app/outputs/flutter-apk/app-debug.apk
105+
106+ build-release :
107+ runs-on : ubuntu-latest
108+ if : startsWith(github.ref, 'refs/tags/')
109+
110+ steps :
111+ - name : Checkout code
112+ uses : actions/checkout@v4
113+
114+ - name : Setup Java
115+ uses : actions/setup-java@v4
116+ with :
117+ distribution : ' zulu'
118+ java-version : ' 17'
119+
120+ - name : Setup Flutter
121+ uses : subosito/flutter-action@v2
122+ with :
123+ flutter-version : ' 3.19.0'
124+ channel : ' stable'
125+
126+ - name : Cache dependencies
127+ uses : actions/cache@v4
128+ with :
129+ path : |
130+ ~/.gradle/caches
131+ ~/.gradle/wrapper
132+ ${{ env.PUB_CACHE }}
133+ key : ${{ runner.os }}-deps-${{ hashFiles('**/pubspec.lock', '**/*.gradle*', '**/gradle-wrapper.properties') }}
134+ restore-keys : |
135+ ${{ runner.os }}-deps-
136+
137+ - name : Get Flutter dependencies
138+ run : flutter pub get
139+
140+ - name : Build Release APK
141+ run : flutter build apk --release
142+
143+ - name : Build Split APKs (for smaller downloads)
144+ run : flutter build apk --split-per-abi --release
145+
146+ - name : Upload Release APK
147+ uses : actions/upload-artifact@v4
148+ with :
149+ name : release-apk
150+ path : build/app/outputs/flutter-apk/app-release.apk
151+
152+ - name : Upload Split APKs
153+ uses : actions/upload-artifact@v4
154+ with :
155+ name : split-apks
156+ path : build/app/outputs/flutter-apk/
157+
158+ release :
159+ needs : build-release
160+ runs-on : ubuntu-latest
161+ if : startsWith(github.ref, 'refs/tags/')
162+
163+ steps :
164+ - name : Checkout code
165+ uses : actions/checkout@v4
166+
167+ - name : Download Release APK
168+ uses : actions/download-artifact@v4
169+ with :
170+ name : release-apk
171+ path : .
172+
173+ - name : Download Split APKs
174+ uses : actions/download-artifact@v4
175+ with :
176+ name : split-apks
177+ path : split-apks/
178+
179+ - name : Create Release
180+ uses : softprops/action-gh-release@v1
181+ with :
182+ files : |
183+ app-release.apk
184+ split-apks/app-armeabi-v7a-release.apk
185+ split-apks/app-arm64-v8a-release.apk
186+ split-apks/app-x86_64-release.apk
187+ draft : false
188+ prerelease : false
189+ generate_release_notes : true
190+ body : |
191+ ## 📱 E-commerce App Release
192+
193+ ### What's New
194+ - Bug fixes and improvements
195+ - Enhanced chat functionality
196+ - Better user experience
197+
198+ ### Installation
199+ - **Full APK**: Download `app-release.apk` for all devices
200+ - **Split APKs**: Download the appropriate architecture for smaller file size:
201+ - `app-arm64-v8a-release.apk` (Most modern devices)
202+ - `app-armeabi-v7a-release.apk` (Older ARM devices)
203+ - `app-x86_64-release.apk` (Emulators and Intel devices)
204+
205+ ### Features
206+ - User authentication
207+ - Product management
208+ - Real-time chat
209+ - Responsive design
210+ env :
211+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
212+
213+ - name : Comment on PR
214+ if : github.event_name == 'pull_request'
215+ uses : actions/github-script@v7
216+ with :
217+ script : |
218+ github.rest.issues.createComment({
219+ issue_number: context.issue.number,
220+ owner: context.repo.owner,
221+ repo: context.repo.repo,
222+ body: '🚀 APK has been built and released! Check the [releases page](https://github.com/${{ github.repository }}/releases) for the latest version.'
223+ })
0 commit comments