-
Notifications
You must be signed in to change notification settings - Fork 16
267 lines (231 loc) · 9.55 KB
/
main.yml
File metadata and controls
267 lines (231 loc) · 9.55 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
name: build, test and release sqlite-sync
on:
push:
workflow_dispatch:
permissions:
contents: write
pages: write
id-token: write
jobs:
build:
runs-on: ${{ matrix.os }}
name: ${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }} build${{ matrix.arch != 'arm64-v8a' && matrix.name != 'isim' && matrix.name != 'ios' && matrix.name != 'wasm' && ' + test' || ''}}
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
arch: x86_64
name: linux
- os: LinuxARM64
arch: arm64
name: linux
- os: macos-latest
name: macos
- os: windows-latest
arch: x86_64
name: windows
- os: ubuntu-latest
arch: arm64-v8a
name: android
make: PLATFORM=android ARCH=arm64-v8a
- os: ubuntu-latest
arch: x86_64
name: android
make: PLATFORM=android ARCH=x86_64
sqlite-amalgamation-zip: https://sqlite.org/2025/sqlite-amalgamation-3490100.zip
- os: macos-latest
name: ios
make: PLATFORM=ios
- os: macos-latest
name: isim
make: PLATFORM=isim
- os: ubuntu-latest
name: wasm
make: PLATFORM=wasm
defaults:
run:
shell: bash
env:
CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}
APIKEY: ${{ secrets.APIKEY }}
WEBLITE: ${{ secrets.WEBLITE }}
steps:
- uses: actions/checkout@v4.2.2
- uses: msys2/setup-msys2@v2.27.0
if: matrix.os == 'windows-latest'
with:
msystem: mingw64
install: >-
mingw-w64-x86_64-cc
make
- name: windows build curl
if: matrix.os == 'windows-latest'
run: make curl/windows/libcurl.a
shell: msys2 {0}
- name: wasm install wabt
if: matrix.name == 'wasm'
run: sudo apt install wabt
- name: build sqlite-sync
run: make extension ${{ matrix.make && matrix.make || ''}}
- name: windows install sqlite3
if: matrix.os == 'windows-latest'
run: choco install sqlite -y
- name: macos install sqlite3 without SQLITE_OMIT_LOAD_EXTENSION
if: matrix.name == 'macos'
run: brew link sqlite --force
- name: android setup test environment
if: matrix.name == 'android' && matrix.arch != 'arm64-v8a'
run: |
echo "::group::enable kvm group perms"
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
echo "::endgroup::"
echo "::group::download and build sqlite3 without SQLITE_OMIT_LOAD_EXTENSION"
curl -O ${{ matrix.sqlite-amalgamation-zip }}
unzip sqlite-amalgamation-*.zip
export ${{ matrix.make }}
$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/${{ matrix.arch }}-linux-android26-clang sqlite-amalgamation-*/shell.c sqlite-amalgamation-*/sqlite3.c -o sqlite3 -ldl
# remove unused folders to save up space
rm -rf sqlite-amalgamation-*.zip sqlite-amalgamation-* openssl
echo "::endgroup::"
echo "::group::prepare the test script"
make test PLATFORM=$PLATFORM ARCH=$ARCH || echo "It should fail. Running remaining commands in the emulator"
cat > commands.sh << EOF
mv -f /data/local/tmp/sqlite3 /system/xbin
cd /data/local/tmp
export CONNECTION_STRING="$CONNECTION_STRING"
export APIKEY="$APIKEY"
export WEBLITE="$WEBLITE"
$(make test PLATFORM=$PLATFORM ARCH=$ARCH -n)
EOF
echo "::endgroup::"
- name: android test sqlite-sync
if: matrix.name == 'android' && matrix.arch != 'arm64-v8a'
uses: reactivecircus/android-emulator-runner@v2.34.0
with:
api-level: 26
arch: ${{ matrix.arch }}
script: |
adb root
adb remount
adb push ${{ github.workspace }}/. /data/local/tmp/
adb shell "sh /data/local/tmp/commands.sh"
- name: test sqlite-sync
if: matrix.name == 'linux' || matrix.name == 'windows'
run: make test
- name: test sqlite-sync + coverage
if: matrix.name == 'macos'
run: brew install lcov && make test COVERAGE=true
- uses: actions/upload-pages-artifact@v3.0.1
if: matrix.name == 'macos'
with:
path: coverage
- name: wasm npm pack
if: matrix.name == 'wasm'
run: |
git clone https://github.com/sqlite/sqlite-wasm.git sqlite-wasm
rm -rf sqlite-wasm/sqlite-wasm/*
unzip dist/sqlite-wasm.zip -d sqlite-wasm/tmp
mv sqlite-wasm/tmp/sqlite-wasm-*/jswasm sqlite-wasm/sqlite-wasm
rm -rf sqlite-wasm/tmp sqlite-wasm/bin sqlite-wasm/demo sqlite-wasm/package-lock.json
PKG=sqlite-wasm/package.json
TMP=sqlite-wasm/package.tmp.json
DESC="SQLite Wasm compiled with the automatically initialized cloudsync extension. Conveniently packaged as an ES Module for effortless integration."
jq \
--arg name "@cloudsync/sqlite-wasm" \
--arg version "$(make sqlite_version)+cloudsync-$(make version)" \
--arg desc "$DESC" \
--argjson keywords '["offsync","cloudsync","sqliteai"]' \
--arg repo_url "git+https://github.com/sqliteai/sqlite-sync.git" \
--arg author "Gioele Cantoni (gioele@sqlitecloud.io)" \
--arg bugs_url "https://github.com/sqliteai/sqlite-sync/issues" \
--arg homepage "https://github.com/sqliteai/sqlite-sync#readme" \
'
.name = $name
| .version = $version
| .description = $desc
| .keywords += $keywords
| del(.bin)
| .scripts |= with_entries(select(
.key != "build"
and .key != "start"
and .key != "start:node"
and .key != "prepublishOnly"
and .key != "deploy"
))
| .repository.url = $repo_url
| .author = $author
| .bugs.url = $bugs_url
| .homepage = $homepage
| del(.devDependencies.decompress)
| del(.devDependencies["http-server"])
| del(.devDependencies.shx)
' "$PKG" > "$TMP" && mv "$TMP" "$PKG"
sed 's/@sqlite\.org\/sqlite-wasm/@cloudsync\/sqlite-wasm/g' sqlite-wasm/README.md > sqlite-wasm/README.tmp
echo -e "# sqlite-sync WASM $(make version)\nThis README and the TypeScript types are from the [official SQLite wasm repository](https://github.com/sqlite/sqlite-wasm)\n\n$(cat sqlite-wasm/README.tmp)" > sqlite-wasm/README.md
rm sqlite-wasm/README.tmp
cd sqlite-wasm && npm i && npm run publint && npm run check-types && npm pack
- uses: actions/upload-artifact@v4.6.2
if: always()
with:
name: cloudsync-${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }}
path: |
dist/cloudsync.*
sqlite-wasm/*.tgz
if-no-files-found: error
release:
runs-on: ubuntu-latest
name: release
needs: build
if: github.ref == 'refs/heads/main'
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/download-artifact@v4.2.1
with:
path: artifacts
- name: setup GitHub Pages
uses: actions/configure-pages@v5
- name: deploy coverage to GitHub Pages
uses: actions/deploy-pages@v4.0.5
- name: release tag version from cloudsync.h
id: tag
run: |
VERSION=$(make version)
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
LATEST=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.name')
if [[ "$VERSION" != "$LATEST" || "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
else
echo "::warning file=src/cloudsync.h::To release a new version, please update the CLOUDSYNC_VERSION in src/cloudsync.h to be different than the latest $LATEST"
fi
exit 0
fi
echo "❌ CLOUDSYNC_VERSION not found in cloudsync.h"
exit 1
- name: zip artifacts
run: |
for folder in "artifacts"/*; do
if [ -d "$folder" ]; then
name=$(basename "$folder")
if [[ "$name" != "github-pages" ]]; then
zip -jq "${name}-${{ steps.tag.outputs.version }}.zip" "$folder"/*
tar -cJf "${name}-${{ steps.tag.outputs.version }}.tar.xz" -C "$folder" .
tar -czf "${name}-${{ steps.tag.outputs.version }}.tar.gz" -C "$folder" .
fi
fi
done
- uses: softprops/action-gh-release@v2.2.1
if: steps.tag.outputs.version != ''
with:
generate_release_notes: true
tag_name: ${{ steps.tag.outputs.version }}
files: |
cloudsync-*-${{ steps.tag.outputs.version }}.zip
cloudsync-*-${{ steps.tag.outputs.version }}.tar.xz
cloudsync-*-${{ steps.tag.outputs.version }}.tar.gz
make_latest: true