Build all apps from Markdown content; Compose Desktop replaces GTK on Linux and Windows

- content/ + scripts/build-content.py produce content.json for every app
- stable lesson IDs with one-time progress migration (Swift, Kotlin)
- shared answer-check tests (tests/answers.json) for Kotlin and Swift
- android/desktop: Compose app with updater, speech and GTK progress import
- CI packages AppImage and Windows zip with ProGuard, runs the tests

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-09 20:40:37 +02:00
commit c3bc32113b
964 changed files with 57285 additions and 1156 deletions

View file

@ -24,19 +24,27 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install dependencies
# ProGuard and jlink need a JDK that ships jmods; Temurin 21 does.
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- uses: gradle/actions/setup-gradle@v4
with:
build-root-directory: android
- name: Answer checks
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config curl \
libgtk-4-dev librsvg2-dev \
desktop-file-utils \
appstream
chmod +x android/gradlew
cd android
./gradlew :desktop:test --no-daemon
- name: Build AppImage
env:
COMMIT: ${{ github.sha }}
run: |
export PACKAGE_JDK="$JAVA_HOME"
chmod +x scripts/bundle-linux.sh
./scripts/bundle-linux.sh
@ -51,38 +59,35 @@ jobs:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
shell: bash
steps:
- uses: actions/checkout@v4
- uses: msys2/setup-msys2@v2
- uses: actions/setup-java@v4
with:
msystem: UCRT64
update: true
install: >-
make
zip
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-gtk4
mingw-w64-ucrt-x86_64-pkg-config
mingw-w64-ucrt-x86_64-make
distribution: temurin
java-version: 21
- name: Build and bundle
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: gradle/actions/setup-gradle@v4
with:
build-root-directory: android
- name: Build zip
env:
COMMIT: ${{ github.sha }}
run: |
make bundle
cd dist
zip -qry ../graduately-windows-x64.zip .
cd ..
mkdir -p dist-out
mv graduately-windows-x64.zip dist-out/
export PACKAGE_JDK="$JAVA_HOME"
bash scripts/bundle-windows.sh
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: graduately-windows
path: dist-out/graduately-windows-x64.zip
path: dist/graduately-windows-x64.zip
macos:
name: macOS app
@ -173,11 +178,11 @@ jobs:
with:
build-root-directory: android
- name: Extract content and build APK
- name: Build content and APK
env:
COMMIT: ${{ github.sha }}
run: |
python3 scripts/extract-android-content.py
python3 scripts/build-content.py
chmod +x android/gradlew
cd android
./gradlew :app:assembleRelease --no-daemon
@ -198,7 +203,14 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Extract content and build IPA
- name: Answer checks
env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
run: |
chmod +x scripts/test-answers-swift.sh
./scripts/test-answers-swift.sh
- name: Build content and IPA
env:
COMMIT: ${{ github.sha }}
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
@ -253,6 +265,8 @@ jobs:
[ -f fresh/graduately-android.apk ] && echo "${{ github.sha }}" > staged/VERSION-android
[ -f fresh/graduately-ios.ipa ] && echo "${{ github.sha }}" > staged/VERSION-ios
ls fresh/graduately-macos-*.zip >/dev/null 2>&1 && echo "${{ github.sha }}" > staged/VERSION-macos
[ -f fresh/graduately-windows-x64.zip ] && echo "${{ github.sha }}" > staged/VERSION-windows
[ -f fresh/graduately-linux-x86_64.AppImage ] && echo "${{ github.sha }}" > staged/VERSION-linux
# Compatibility aliases so older installers/updaters still find packages.
[ -f staged/graduately-macos-arm64.zip ] && cp -f staged/graduately-macos-arm64.zip staged/maturita-macos-arm64.zip
[ -f staged/graduately-macos-x86_64.zip ] && cp -f staged/graduately-macos-x86_64.zip staged/maturita-macos-x86_64.zip