-
Notifications
You must be signed in to change notification settings - Fork 3
158 lines (135 loc) · 5.66 KB
/
build.yml
File metadata and controls
158 lines (135 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
name: Build
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: build-${{ github.ref }}
cancel-in-progress: true # Cancel previous builds
jobs:
test:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Run Tests
run: ./gradlew allTests
build-dev:
needs: test
runs-on: macos-latest
if: github.ref == 'refs/heads/main'
outputs:
build-version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Generate Build Version
id: version
run: |
# Use timestamp + short SHA for dev builds
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
SHORT_SHA=${GITHUB_SHA:0:7}
BUILD_VERSION="dev-$TIMESTAMP-$SHORT_SHA"
echo "version=$BUILD_VERSION" >> $GITHUB_OUTPUT
echo "📦 Build version: $BUILD_VERSION"
- name: Build XCFramework
run: ./gradlew :umbrella:createXCFramework
- name: Prepare Distribution
run: |
cd umbrella/build/XCFrameworks/release
zip -r QuranSyncUmbrella-${{ steps.version.outputs.version }}.xcframework.zip QuranSyncUmbrella.xcframework
- name: Calculate Checksum
id: checksum
run: |
CHECKSUM=$(swift package compute-checksum umbrella/build/XCFrameworks/release/QuranSyncUmbrella-${{ steps.version.outputs.version }}.xcframework.zip)
echo "checksum=$CHECKSUM" >> $GITHUB_OUTPUT
- name: Update Package.swift for Dev Build
run: |
# Update Package.swift directly with dev build info
sed -i '' "s/{VERSION}/${{ steps.version.outputs.version }}/g" Package.swift
sed -i '' "s/{CHECKSUM_TO_BE_REPLACED_BY_CI}/${{ steps.checksum.outputs.checksum }}/g" Package.swift
- name: Commit Package.swift for Dev Build
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add Package.swift
git commit -m "chore: update Package.swift for dev build ${{ steps.version.outputs.version }}"
git push origin main
- name: Create Development Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.version.outputs.version }}
name: "Development Build ${{ steps.version.outputs.version }}"
prerelease: true
files: |
umbrella/build/XCFrameworks/release/QuranSyncUmbrella-${{ steps.version.outputs.version }}.xcframework.zip
body: |
## 🚧 Development Build
**Commit:** ${{ github.sha }}
**Branch:** ${{ github.ref_name }}
**Checksum:** `${{ steps.checksum.outputs.checksum }}`
### Usage (SPM)
Package.swift has been automatically updated for this dev build:
```swift
.package(url: "https://github.com/quran/mobile-sync", exact: "${{ steps.version.outputs.version }}")
```
### Alternative: Manual Binary Target
If you prefer manual control:
```swift
.binaryTarget(
name: "QuranSyncUmbrella",
url: "https://github.com/quran/mobile-sync/releases/download/${{ steps.version.outputs.version }}/QuranSyncUmbrella-${{ steps.version.outputs.version }}.xcframework.zip",
checksum: "${{ steps.checksum.outputs.checksum }}"
)
```
### ⚠️ Important Warnings
- **This is a development build** - use stable releases for production
- **Dev builds may be deleted without notice** - we only keep the 5 most recent
- **Package.swift will be overwritten** by the next dev build or release
- **No stability guarantees** - APIs may change between dev builds
- **For testing only** - not recommended for App Store submissions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
cleanup-old-dev-builds:
needs: build-dev
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Cleanup Old Dev Builds
uses: actions/github-script@v7
with:
script: |
const { data: releases } = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
});
// Keep last 5 dev builds, delete older ones
const devBuilds = releases
.filter(release => release.tag_name.startsWith('dev-'))
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))
.slice(5); // Skip first 5 (keep them)
for (const release of devBuilds) {
console.log(`Deleting old dev build: ${release.tag_name}`);
await github.rest.repos.deleteRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
});
}