Skip to content

Commit e6e0d18

Browse files
committed
ci: add GGUF model caching to CI and update Makefile
Introduces a new 'download-model' job in the GitHub Actions workflow to cache and restore the GGUF model, reducing redundant downloads. Updates the Makefile to use GGUF model variables, simplifies test model handling, and ensures the test binary is built with the correct SQLite source. Add SQLite amalgamation for testing.
1 parent 3128c18 commit e6e0d18

File tree

3 files changed

+255996
-16
lines changed

3 files changed

+255996
-16
lines changed

.github/workflows/main.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,47 @@ permissions:
77
contents: write
88
id-token: write
99

10+
env:
11+
GGUF_MODEL_DIR: tests/models/unsloth/gemma-3-270m-it-GGUF
12+
GGUF_MODEL_NAME: gemma-3-270m-it-UD-IQ2_M.gguf
13+
GGUF_MODEL_URL: https://huggingface.co/unsloth/gemma-3-270m-it-GGUF/resolve/main/gemma-3-270m-it-UD-IQ2_M.gguf
14+
1015
jobs:
16+
download-model:
17+
outputs:
18+
cache-key: gguf-${{ steps.meta.outputs.etag }}
19+
name: Download GGUF model
20+
runs-on: ubuntu-22.04
21+
steps:
22+
- name: Fetch GGUF metadata
23+
id: meta
24+
run: |
25+
etag=$(curl -sI "${{ env.GGUF_MODEL_URL }}" | tr -d '\r' | awk 'tolower($1)=="etag:" {print $2}' | tr -d '"')
26+
if [ -z "$etag" ]; then
27+
echo "Failed to determine model ETag" >&2
28+
exit 1
29+
fi
30+
echo "etag=$etag" >> "$GITHUB_OUTPUT"
31+
32+
- name: Prepare model directory
33+
run: mkdir -p "${{ env.GGUF_MODEL_DIR }}"
34+
35+
- name: Restore GGUF cache
36+
id: cache
37+
uses: actions/cache@v4
38+
with:
39+
path: ${{ env.GGUF_MODEL_DIR }}/${{ env.GGUF_MODEL_NAME }}
40+
key: gguf-${{ steps.meta.outputs.etag }}
41+
42+
- name: Download GGUF model
43+
if: steps.cache.outputs.cache-hit != 'true'
44+
run: |
45+
curl -L --fail --retry 3 "${{ env.GGUF_MODEL_URL }}" -o "${{ env.GGUF_MODEL_DIR }}/${{ env.GGUF_MODEL_NAME }}"
46+
- name: Verify GGUF model
47+
run: test -f "${{ env.GGUF_MODEL_DIR }}/${{ env.GGUF_MODEL_NAME }}"
48+
1149
build:
50+
needs: download-model
1251
runs-on: ${{ matrix.os }}
1352
container: ${{ matrix.container && matrix.container || '' }}
1453
name: ${{ matrix.name }}${{ matrix.arch && format('-{0}', matrix.arch) || '' }} build${{ matrix.arch != 'arm64-v8a' && matrix.name != 'ios-sim' && matrix.name != 'ios' && matrix.name != 'apple-xcframework' && matrix.name != 'android-aar' && ( matrix.name != 'macos' || matrix.arch != 'x86_64' ) && ' + test' || ''}}
@@ -106,6 +145,18 @@ jobs:
106145
with:
107146
submodules: true
108147

148+
- name: Prepare GGUF model directory
149+
run: mkdir -p "${{ env.GGUF_MODEL_DIR }}"
150+
151+
- name: Restore GGUF cache
152+
uses: actions/cache@v4
153+
with:
154+
path: ${{ env.GGUF_MODEL_DIR }}/${{ env.GGUF_MODEL_NAME }}
155+
key: ${{ needs.download-model.outputs.cache-key }}
156+
157+
- name: Verify GGUF model
158+
run: test -f "${{ env.GGUF_MODEL_DIR }}/${{ env.GGUF_MODEL_NAME }}"
159+
109160
- name: android setup java
110161
if: matrix.name == 'android-aar'
111162
uses: actions/setup-java@v4

Makefile

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ DIST_DIR = dist
3030
VPATH = $(SRC_DIR)
3131
BUILD_DIR = build
3232
CTEST_BIN = $(BUILD_DIR)/tests/sqlite_ai_tests
33-
TEST_MODEL_DIR = tests/models/unsloth/gemma-3-270m-it-GGUF
34-
TEST_MODEL_FILE = $(TEST_MODEL_DIR)/gemma-3-270m-it-UD-IQ2_M.gguf
35-
TEST_MODEL_URL = https://huggingface.co/unsloth/gemma-3-270m-it-GGUF/resolve/main/gemma-3-270m-it-UD-IQ2_M.gguf
33+
GGUF_MODEL_DIR ?= tests/models/unsloth/gemma-3-270m-it-GGUF
34+
GGUF_MODEL_NAME ?= gemma-3-270m-it-UD-IQ2_M.gguf
35+
GGUF_MODEL_URL ?= https://huggingface.co/unsloth/gemma-3-270m-it-GGUF/resolve/main/gemma-3-270m-it-UD-IQ2_M.gguf
36+
GGUF_MODEL_PATH := $(GGUF_MODEL_DIR)/$(GGUF_MODEL_NAME)
3637
LLAMA_DIR = modules/llama.cpp
3738
WHISPER_DIR = modules/whisper.cpp
3839
MINIAUDIO_DIR = modules/miniaudio
@@ -63,12 +64,7 @@ SQLITE_TEST_LIBS = -lpthread -lm
6364
ifneq ($(PLATFORM),macos)
6465
SQLITE_TEST_LIBS += -ldl
6566
endif
66-
ifneq ($(SQLITE3),sqlite3)
67-
SQLITE3_BINDIR := $(dir $(SQLITE3))
68-
SQLITE3_PREFIX := $(abspath $(SQLITE3_BINDIR)/..)
69-
SQLITE_TEST_LIBS += -L$(SQLITE3_PREFIX)/lib
70-
endif
71-
SQLITE_TEST_LIBS += -lsqlite3
67+
SQLITE_TEST_SRC = tests/c/sqlite3.c
7268

7369
# Files
7470
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
@@ -224,17 +220,18 @@ endif
224220
$(BUILD_DIR)/%.o: %.c $(BUILD_DIR)/llama.cpp.stamp
225221
$(CC) $(CFLAGS) -O3 -fPIC -c $< -o $@
226222

227-
$(CTEST_BIN): tests/c/unittest.c
223+
$(CTEST_BIN): tests/c/unittest.c $(SQLITE_TEST_SRC)
228224
@mkdir -p $(dir $@)
229-
$(CC) -std=c11 -Wall -Wextra -I$(SRC_DIR) tests/c/unittest.c -o $@ $(SQLITE_TEST_LIBS)
225+
$(CC) -std=c11 -Wall -Wextra -DSQLITE_ENABLE_LOAD_EXTENSION -I$(SRC_DIR) tests/c/unittest.c $(SQLITE_TEST_SRC) -o $@ $(SQLITE_TEST_LIBS)
230226

231-
$(TEST_MODEL_FILE):
232-
@mkdir -p $(TEST_MODEL_DIR)
233-
curl -L --fail --retry 3 -o $@ $(TEST_MODEL_URL)
227+
$(GGUF_MODEL_PATH):
228+
@mkdir -p $(GGUF_MODEL_DIR)
229+
curl -L --fail --retry 3 -o $@ $(GGUF_MODEL_URL)
234230

235-
test: $(TARGET) $(CTEST_BIN) $(TEST_MODEL_FILE)
231+
test: $(TARGET) $(CTEST_BIN) $(GGUF_MODEL_PATH)
232+
@echo "Running sqlite3 CLI smoke test (ensures .load works)..."
236233
$(SQLITE3) ":memory:" -cmd ".bail on" ".load ./dist/ai" "SELECT ai_version();"
237-
$(CTEST_BIN) --extension "$(TARGET)" --model "$(TEST_MODEL_FILE)"
234+
$(CTEST_BIN) --extension "$(TARGET)" --model "$(GGUF_MODEL_PATH)"
238235

239236
# Build submodules
240237
ifeq ($(PLATFORM),windows)

0 commit comments

Comments
 (0)