Skip to content

Commit a57e65e

Browse files
authored
Update debugbuild.yml
1 parent d10625c commit a57e65e

1 file changed

Lines changed: 280 additions & 3 deletions

File tree

.github/workflows/debugbuild.yml

Lines changed: 280 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ on:
55
branches:
66
- "**"
77

8+
env:
9+
# Set these as repository secrets or environment variables
10+
DEPLOYMENT_API_URL: ${{ secrets.DEPLOYMENT_API_URL }}
11+
DEPLOYMENT_API_KEY: ${{ secrets.DEPLOYMENT_API_KEY }}
12+
813
jobs:
914
LINUXANDROID:
1015
name: Linux & Android
@@ -13,6 +18,9 @@ jobs:
1318
- name: Checkout repository
1419
uses: actions/checkout@v4
1520

21+
- name: Install jq for JSON parsing
22+
run: sudo apt-get update && sudo apt-get install -y jq
23+
1624
- name: Setup Flutter
1725
uses: subosito/flutter-action@v2
1826
with:
@@ -55,7 +63,7 @@ jobs:
5563
- name: Upload build artifacts
5664
uses: actions/upload-artifact@v4
5765
with:
58-
name: dist-${{ runner.os }}
66+
name: dist-linux-android
5967
path: dist/
6068

6169
MACOSIOS:
@@ -93,7 +101,7 @@ jobs:
93101
- name: Upload build artifacts
94102
uses: actions/upload-artifact@v4
95103
with:
96-
name: dist-${{ runner.os }}
104+
name: dist-macos-ios
97105
path: dist/
98106

99107
WINDOWS:
@@ -132,5 +140,274 @@ jobs:
132140
- name: Upload build artifacts
133141
uses: actions/upload-artifact@v4
134142
with:
135-
name: dist-${{ runner.os }}
143+
name: dist-windows
136144
path: dist/
145+
146+
DEPLOY:
147+
name: Deploy Release
148+
needs: [LINUXANDROID, WINDOWS, MACOSIOS]
149+
runs-on: ubuntu-latest
150+
if: always() && (needs.LINUXANDROID.result == 'success' || needs.WINDOWS.result == 'success' || needs.MACOSIOS.result == 'success')
151+
steps:
152+
- name: Checkout repository
153+
uses: actions/checkout@v4
154+
155+
- name: Download all artifacts
156+
uses: actions/download-artifact@v4
157+
with:
158+
path: ./artifacts
159+
160+
- name: Organize build files
161+
run: |
162+
mkdir -p release/{windows,linux,android,macos,ios}
163+
164+
# Copy files from artifacts to organized structure
165+
if [ -d "./artifacts/dist-linux-android" ]; then
166+
find ./artifacts/dist-linux-android -name "*.rpm" -exec cp {} release/linux/ \;
167+
find ./artifacts/dist-linux-android -name "*.AppImage" -exec cp {} release/linux/ \;
168+
find ./artifacts/dist-linux-android -name "*.apk" -exec cp {} release/android/ \;
169+
fi
170+
171+
if [ -d "./artifacts/dist-windows" ]; then
172+
find ./artifacts/dist-windows -name "*.exe" -exec cp {} release/windows/ \;
173+
find ./artifacts/dist-windows -name "*.msi" -exec cp {} release/windows/ \;
174+
fi
175+
176+
if [ -d "./artifacts/dist-macos-ios" ]; then
177+
find ./artifacts/dist-macos-ios -name "*.dmg" -exec cp {} release/macos/ \;
178+
find ./artifacts/dist-macos-ios -name "*.pkg" -exec cp {} release/macos/ \;
179+
find ./artifacts/dist-macos-ios -name "*.ipa" -exec cp {} release/ios/ \;
180+
fi
181+
182+
- name: Generate deployment manifest
183+
run: |
184+
# Extract version from pubspec.yaml or use a default
185+
VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //' | tr -d ' ' || echo "1.0.0")
186+
187+
# Determine flavor based on branch
188+
if [[ "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "master" ]]; then
189+
FLAVOR="stable"
190+
elif [[ "${{ github.ref_name }}" == "release" ]]; then
191+
FLAVOR="release"
192+
else
193+
FLAVOR="nightly"
194+
fi
195+
196+
# Generate JSON manifest
197+
cat > release/manifest.json << EOF
198+
{
199+
"version": "$VERSION",
200+
"flavor": "$FLAVOR",
201+
"platforms": [
202+
EOF
203+
204+
# Add Windows platform if files exist
205+
if ls release/windows/*.exe >/dev/null 2>&1 || ls release/windows/*.msi >/dev/null 2>&1; then
206+
echo ' {' >> release/manifest.json
207+
echo ' "platform": "windows",' >> release/manifest.json
208+
echo ' "files": [' >> release/manifest.json
209+
210+
FIRST=true
211+
for file in release/windows/*; do
212+
if [ -f "$file" ]; then
213+
[ "$FIRST" = false ] && echo ',' >> release/manifest.json
214+
filename=$(basename "$file")
215+
if [[ "$filename" == *.exe ]]; then
216+
echo -n " {\"type\": \".exe Installer\", \"path\": \"windows/$filename\"}" >> release/manifest.json
217+
elif [[ "$filename" == *.msi ]]; then
218+
echo -n " {\"type\": \".msi Installer\", \"path\": \"windows/$filename\"}" >> release/manifest.json
219+
fi
220+
FIRST=false
221+
fi
222+
done
223+
echo '' >> release/manifest.json
224+
echo ' ]' >> release/manifest.json
225+
echo ' },' >> release/manifest.json
226+
fi
227+
228+
# Add Linux platform if files exist
229+
if ls release/linux/*.rpm >/dev/null 2>&1 || ls release/linux/*.AppImage >/dev/null 2>&1; then
230+
echo ' {' >> release/manifest.json
231+
echo ' "platform": "linux",' >> release/manifest.json
232+
echo ' "files": [' >> release/manifest.json
233+
234+
FIRST=true
235+
for file in release/linux/*; do
236+
if [ -f "$file" ]; then
237+
[ "$FIRST" = false ] && echo ',' >> release/manifest.json
238+
filename=$(basename "$file")
239+
if [[ "$filename" == *.rpm ]]; then
240+
echo -n " {\"type\": \"RPM\", \"path\": \"linux/$filename\"}" >> release/manifest.json
241+
elif [[ "$filename" == *.AppImage ]]; then
242+
echo -n " {\"type\": \"AppImage\", \"path\": \"linux/$filename\"}" >> release/manifest.json
243+
fi
244+
FIRST=false
245+
fi
246+
done
247+
echo '' >> release/manifest.json
248+
echo ' ]' >> release/manifest.json
249+
echo ' },' >> release/manifest.json
250+
fi
251+
252+
# Add Android platform if files exist
253+
if ls release/android/*.apk >/dev/null 2>&1; then
254+
echo ' {' >> release/manifest.json
255+
echo ' "platform": "android",' >> release/manifest.json
256+
echo ' "files": [' >> release/manifest.json
257+
258+
FIRST=true
259+
for file in release/android/*; do
260+
if [ -f "$file" ]; then
261+
[ "$FIRST" = false ] && echo ',' >> release/manifest.json
262+
filename=$(basename "$file")
263+
echo -n " {\"type\": \"APK\", \"path\": \"android/$filename\"}" >> release/manifest.json
264+
FIRST=false
265+
fi
266+
done
267+
echo '' >> release/manifest.json
268+
echo ' ]' >> release/manifest.json
269+
echo ' },' >> release/manifest.json
270+
fi
271+
272+
# Add macOS platform if files exist
273+
if ls release/macos/*.dmg >/dev/null 2>&1 || ls release/macos/*.pkg >/dev/null 2>&1; then
274+
echo ' {' >> release/manifest.json
275+
echo ' "platform": "macos",' >> release/manifest.json
276+
echo ' "files": [' >> release/manifest.json
277+
278+
FIRST=true
279+
for file in release/macos/*; do
280+
if [ -f "$file" ]; then
281+
[ "$FIRST" = false ] && echo ',' >> release/manifest.json
282+
filename=$(basename "$file")
283+
if [[ "$filename" == *.dmg ]]; then
284+
echo -n " {\"type\": \"DMG\", \"path\": \"macos/$filename\"}" >> release/manifest.json
285+
elif [[ "$filename" == *.pkg ]]; then
286+
echo -n " {\"type\": \"PKG\", \"path\": \"macos/$filename\"}" >> release/manifest.json
287+
fi
288+
FIRST=false
289+
fi
290+
done
291+
echo '' >> release/manifest.json
292+
echo ' ]' >> release/manifest.json
293+
echo ' },' >> release/manifest.json
294+
fi
295+
296+
# Remove trailing comma and close JSON
297+
sed -i '$ s/,$//' release/manifest.json
298+
echo ' ]' >> release/manifest.json
299+
echo ' }' >> release/manifest.json
300+
301+
- name: Create deployment package
302+
run: |
303+
cd release
304+
zip -r ../floaty-release-${{ github.ref_name }}-$(date +%Y%m%d-%H%M%S).zip .
305+
cd ..
306+
307+
- name: Display manifest content
308+
run: cat release/manifest.json
309+
310+
- name: Deploy to API
311+
id: deploy
312+
run: |
313+
PACKAGE_NAME="floaty-release-${{ github.ref_name }}-$(date +%Y%m%d-%H%M%S).zip"
314+
315+
# Send the deployment package to your API (matching your test page format)
316+
RESPONSE=$(curl -X POST \
317+
-H "x-api-key: ${{ env.DEPLOYMENT_API_KEY }}" \
318+
-F "artifact=@${PACKAGE_NAME}" \
319+
-w "\n%{http_code}" \
320+
"${{ env.DEPLOYMENT_API_URL }}" \
321+
2>/dev/null)
322+
323+
# Extract response body and status code
324+
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
325+
RESPONSE_BODY=$(echo "$RESPONSE" | head -n -1)
326+
327+
if [ "$HTTP_CODE" -eq 200 ]; then
328+
echo "Successfully deployed $PACKAGE_NAME"
329+
echo "Response: $RESPONSE_BODY"
330+
331+
# Parse JSON response and set outputs for GitHub release
332+
echo "deployment_response=$RESPONSE_BODY" >> $GITHUB_OUTPUT
333+
334+
# Extract individual fields for use in release
335+
DEPLOYMENT_ID=$(echo "$RESPONSE_BODY" | jq -r '.deploymentId // empty')
336+
VERSION=$(echo "$RESPONSE_BODY" | jq -r '.version // empty')
337+
FLAVOR=$(echo "$RESPONSE_BODY" | jq -r '.flavor // empty')
338+
339+
echo "deployment_id=$DEPLOYMENT_ID" >> $GITHUB_OUTPUT
340+
echo "version=$VERSION" >> $GITHUB_OUTPUT
341+
echo "flavor=$FLAVOR" >> $GITHUB_OUTPUT
342+
343+
echo "Deployment ID: $DEPLOYMENT_ID"
344+
echo "Version: $VERSION"
345+
echo "Flavor: $FLAVOR"
346+
else
347+
echo "Deployment failed with HTTP $HTTP_CODE"
348+
echo "Error: $RESPONSE_BODY"
349+
exit 1
350+
fi
351+
352+
- name: Create GitHub Release
353+
if: steps.deploy.outputs.deployment_id != ''
354+
uses: actions/create-release@v1
355+
env:
356+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
357+
with:
358+
tag_name: "${{ steps.deploy.outputs.flavor }}-v${{ steps.deploy.outputs.version }}-${{ steps.deploy.outputs.deployment_id }}"
359+
release_name: "${{ steps.deploy.outputs.flavor }} v${{ steps.deploy.outputs.version }}"
360+
body: |
361+
## ${{ steps.deploy.outputs.flavor }} Release v${{ steps.deploy.outputs.version }}
362+
363+
🔗 **[View Changelogs](https://floaty.fyi/changelogs#${{ steps.deploy.outputs.deployment_id }})**
364+
365+
This release includes builds for:
366+
${{ needs.LINUXANDROID.result == 'success' && '- 🐧 Linux (RPM, AppImage)' || '' }}
367+
${{ needs.LINUXANDROID.result == 'success' && '- 🤖 Android (APK)' || '' }}
368+
${{ needs.WINDOWS.result == 'success' && '- 🪟 Windows (EXE Installer)' || '' }}
369+
${{ needs.MACOSIOS.result == 'success' && '- 🍎 macOS (DMG, PKG)' || '' }}
370+
${{ needs.MACOSIOS.result == 'success' && '- 📱 iOS (IPA)' || '' }}
371+
372+
**Deployment ID:** `${{ steps.deploy.outputs.deployment_id }}`
373+
**Branch:** `${{ github.ref_name }}`
374+
**Commit:** `${{ github.sha }}`
375+
draft: false
376+
prerelease: ${{ steps.deploy.outputs.flavor != 'stable' }}
377+
378+
- name: Upload Release Assets
379+
if: steps.deploy.outputs.deployment_id != ''
380+
run: |
381+
# Get the release ID from the created release
382+
RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
383+
"https://api.github.com/repos/${{ github.repository }}/releases/tags/${{ steps.deploy.outputs.flavor }}-v${{ steps.deploy.outputs.version }}-${{ steps.deploy.outputs.deployment_id }}" \
384+
| jq -r '.id')
385+
386+
# Upload all platform-specific files as release assets
387+
for platform_dir in release/windows release/linux release/android release/macos release/ios; do
388+
if [ -d "$platform_dir" ]; then
389+
for file in "$platform_dir"/*; do
390+
if [ -f "$file" ]; then
391+
filename=$(basename "$file")
392+
echo "Uploading $filename..."
393+
curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
394+
-H "Content-Type: application/octet-stream" \
395+
--data-binary @"$file" \
396+
"https://uploads.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets?name=$filename"
397+
fi
398+
done
399+
fi
400+
done
401+
402+
# Also upload the deployment manifest
403+
curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
404+
-H "Content-Type: application/json" \
405+
--data-binary @"release/manifest.json" \
406+
"https://uploads.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets?name=manifest.json"
407+
408+
- name: Upload final package as artifact
409+
uses: actions/upload-artifact@v4
410+
with:
411+
name: deployment-package
412+
path: "*.zip"
413+
retention-days: 30

0 commit comments

Comments
 (0)