mirror of
https://git.quad4.io/RNS-Things/MeshChatX.git
synced 2026-04-01 08:05:48 +00:00
- Introduced a new task for setting up the Wine environment for Windows cross-builds in Taskfile.yml. - Updated build-test.yml and build.yml workflows to include 'xvfb' in the Wine installation command for improved compatibility. - Refactored the Wine setup process in the build workflow to utilize the new task instead of inline commands, enhancing maintainability.
479 lines
15 KiB
YAML
479 lines
15 KiB
YAML
version: "3"
|
|
|
|
vars:
|
|
PYTHON:
|
|
sh: echo "${PYTHON:-python}"
|
|
NPM:
|
|
sh: echo "${NPM:-pnpm}"
|
|
LEGACY_ELECTRON_VERSION:
|
|
sh: echo "${LEGACY_ELECTRON_VERSION:-30.0.8}"
|
|
WINE_PYTHON:
|
|
sh: echo "${WINE_PYTHON:-wine python}"
|
|
DOCKER_COMPOSE_CMD:
|
|
sh: echo "${DOCKER_COMPOSE_CMD:-docker compose}"
|
|
DOCKER_COMPOSE_FILE:
|
|
sh: echo "${DOCKER_COMPOSE_FILE:-docker-compose.yml}"
|
|
DOCKER_IMAGE:
|
|
sh: echo "${DOCKER_IMAGE:-reticulum-meshchatx:local}"
|
|
DOCKER_BUILDER:
|
|
sh: echo "${DOCKER_BUILDER:-meshchatx-builder}"
|
|
DOCKER_PLATFORMS:
|
|
sh: echo "${DOCKER_PLATFORMS:-linux/amd64}"
|
|
DOCKER_BUILD_FLAGS:
|
|
sh: echo "${DOCKER_BUILD_FLAGS:---load}"
|
|
DOCKER_BUILD_ARGS:
|
|
sh: echo "${DOCKER_BUILD_ARGS:-}"
|
|
DOCKER_CONTEXT:
|
|
sh: echo "${DOCKER_CONTEXT:-.}"
|
|
DOCKERFILE:
|
|
sh: echo "${DOCKERFILE:-Dockerfile}"
|
|
DOCKER_BUILD_IMAGE:
|
|
sh: echo "${DOCKER_BUILD_IMAGE:-reticulum-meshchatx-build:local}"
|
|
DOCKER_BUILD_FILE:
|
|
sh: echo "${DOCKER_BUILD_FILE:-Dockerfile.build}"
|
|
ANDROID_DIR:
|
|
sh: echo "${ANDROID_DIR:-android}"
|
|
PYTHON_SRC_DIR:
|
|
sh: echo "${PYTHON_SRC_DIR:-${ANDROID_DIR}/app/src/main/python}"
|
|
JNI_LIBS_DIR:
|
|
sh: echo "${JNI_LIBS_DIR:-${ANDROID_DIR}/app/src/main/jniLibs}"
|
|
RETICULUM_RNS_SRC:
|
|
sh: echo "${RETICULUM_RNS_SRC:-./misc/RNS}"
|
|
RETICULUM_LXMF_SRC:
|
|
sh: echo "${RETICULUM_LXMF_SRC:-./misc/LXMF}"
|
|
RETICULUM_LXST_SRC:
|
|
sh: echo "${RETICULUM_LXST_SRC:-./misc/LXST}"
|
|
SIDEBAND_CODEC2_WHL:
|
|
sh: echo "${SIDEBAND_CODEC2_WHL:-./misc/pycodec2-3.0.1-cp311-cp311-linux_aarch64.whl}"
|
|
SIDEBAND_LIB_ARM64:
|
|
sh: echo "${SIDEBAND_LIB_ARM64:-./misc/libcodec2-arm64-v8a.so}"
|
|
SIDEBAND_LIB_ARMEABI:
|
|
sh: echo "${SIDEBAND_LIB_ARMEABI:-./misc/libcodec2-armeabi-v7a.so}"
|
|
|
|
tasks:
|
|
default:
|
|
desc: Show available tasks
|
|
cmds:
|
|
- task --list
|
|
|
|
# --- Initialization & Dependencies ---
|
|
|
|
install:
|
|
desc: Install all dependencies (frontend and backend)
|
|
deps: [deps:fe, deps:be]
|
|
|
|
setup:wine:
|
|
desc: Setup Wine environment for Windows cross-builds
|
|
cmds:
|
|
- ./scripts/setup_wine_env.sh
|
|
|
|
deps:fe:
|
|
desc: Install Node.js dependencies
|
|
cmds:
|
|
- "{{.NPM}} install"
|
|
|
|
deps:be:
|
|
desc: Install Python dependencies using Poetry
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry install"
|
|
|
|
setup:be:
|
|
desc: Full backend environment setup
|
|
cmds:
|
|
- poetry install
|
|
- poetry run pip install ruff
|
|
|
|
# --- Execution ---
|
|
|
|
run:
|
|
desc: Run the application
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry run meshchat"
|
|
|
|
dev:
|
|
desc: Run in development mode (builds frontend first)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- task: run
|
|
|
|
start:
|
|
desc: Run the application via Electron Forge
|
|
cmds:
|
|
- "{{.NPM}} run start"
|
|
|
|
package:
|
|
desc: Package the application with Electron Forge
|
|
cmds:
|
|
- "{{.NPM}} run package"
|
|
|
|
make:
|
|
desc: Generate distributables with Electron Forge
|
|
cmds:
|
|
- "{{.NPM}} run make"
|
|
|
|
# --- Code Quality ---
|
|
|
|
lint:all:
|
|
desc: Run all linters
|
|
deps: [lint:fe, lint:be]
|
|
|
|
lint:be:
|
|
desc: Lint Python code (ruff)
|
|
cmds:
|
|
- poetry run ruff check .
|
|
- poetry run ruff format --check .
|
|
|
|
lint:fe:
|
|
desc: Lint frontend code
|
|
cmds:
|
|
- "{{.NPM}} run lint"
|
|
|
|
fmt:all:
|
|
desc: Format all code
|
|
deps: [fmt:fe, fmt:be]
|
|
|
|
fmt:be:
|
|
desc: Format Python code (ruff)
|
|
cmds:
|
|
- poetry run ruff format ./ --exclude tests
|
|
- poetry run ruff check --fix ./ --exclude tests
|
|
|
|
fmt:fe:
|
|
desc: Format frontend code (Prettier/ESLint)
|
|
cmds:
|
|
- "{{.NPM}} run format"
|
|
- "{{.NPM}} run lint:fix"
|
|
|
|
# --- Testing & Analysis ---
|
|
|
|
test:all:
|
|
desc: Run all tests
|
|
deps: [test:be, test:fe, test:lang]
|
|
|
|
test:be:
|
|
desc: Run Python tests (pytest)
|
|
cmds:
|
|
- poetry run pytest tests/backend --cov=meshchatx/src/backend
|
|
|
|
test:be:cov:
|
|
desc: Run Python tests with detailed coverage
|
|
cmds:
|
|
- poetry run pytest tests/backend --cov=meshchatx/src/backend --cov-report=term-missing
|
|
|
|
test:fe:
|
|
desc: Run frontend tests (vitest)
|
|
cmds:
|
|
- "{{.NPM}} run test -- --exclude tests/frontend/i18n.test.js"
|
|
|
|
test:lang:
|
|
desc: Run localization tests
|
|
cmds:
|
|
- "{{.NPM}} run test tests/frontend/i18n.test.js"
|
|
- "poetry run pytest tests/backend/test_translator_handler.py"
|
|
|
|
test:integrity:
|
|
desc: Run data integrity tests
|
|
cmds:
|
|
- poetry run pytest tests/backend/test_integrity.py tests/backend/test_backend_integrity.py
|
|
|
|
test:cov:
|
|
desc: Run all tests with coverage
|
|
deps: [test:be:cov, test:fe]
|
|
|
|
bench:be:
|
|
desc: Run backend benchmarks
|
|
cmds:
|
|
- poetry run python tests/backend/run_comprehensive_benchmarks.py
|
|
|
|
bench:be:extreme:
|
|
desc: Run extreme stress benchmarks
|
|
cmds:
|
|
- poetry run python tests/backend/run_comprehensive_benchmarks.py --extreme
|
|
|
|
profile:mem:
|
|
desc: Run memory profiling
|
|
cmds:
|
|
- poetry run pytest tests/backend/test_memory_profiling.py
|
|
|
|
check:
|
|
desc: Run formatting, linting, and testing sequentially
|
|
cmds:
|
|
- task: fmt:all
|
|
- task: lint:all
|
|
- task: test:all
|
|
|
|
compile:
|
|
desc: Compile Python to check for syntax errors
|
|
cmds:
|
|
- "{{.PYTHON}} -m compileall meshchatx/"
|
|
|
|
# --- Build & Packaging ---
|
|
|
|
build:all:
|
|
desc: Build frontend and prepare backend
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.NPM}} run build"
|
|
|
|
build:fe:
|
|
desc: Build frontend assets
|
|
deps: [deps:fe]
|
|
cmds:
|
|
- "{{.NPM}} run build-frontend"
|
|
|
|
build:wheel:
|
|
desc: Build Python wheel package
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry build -f wheel"
|
|
- "{{.PYTHON}} scripts/move_wheels.py"
|
|
|
|
# --- Electron Distribution ---
|
|
|
|
dist:linux:appimage:
|
|
desc: Build Linux AppImage
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --linux AppImage"
|
|
|
|
dist:linux:arm64:
|
|
desc: Build Linux arm64 AppImage
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=linux ARCH=arm64 {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --linux AppImage --arm64"
|
|
|
|
dist:win:exe:
|
|
desc: Build Windows portable EXE
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=win32 {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --win portable"
|
|
|
|
dist:win:arm64:
|
|
desc: Build Windows arm64 portable EXE
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=win32 ARCH=arm64 {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --win portable --arm64"
|
|
|
|
dist:win:wine:
|
|
desc: Build Windows EXE/Installer via Wine
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=win32 PYTHON_CMD='{{.WINE_PYTHON}}' {{.NPM}} run build-backend"
|
|
- "npx electron-builder --win portable nsis --publish=never"
|
|
|
|
dist:fe:linux:
|
|
desc: Build Linux Electron app (prebuilt backend)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run dist:linux"
|
|
|
|
dist:fe:rpm:
|
|
desc: Build RPM package
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run dist:rpm"
|
|
|
|
dist:fe:flatpak:
|
|
desc: Build Flatpak package
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run dist:flatpak"
|
|
|
|
dist:fe:win:
|
|
desc: Build Windows Electron apps
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run dist:windows"
|
|
|
|
dist:fe:zip:
|
|
desc: Build Electron ZIP (Forge)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist:zip"
|
|
|
|
dist:all:
|
|
desc: Build all Electron apps (Linux + Win)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "PLATFORM=win32 {{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --linux AppImage deb --win portable nsis"
|
|
|
|
dist:all:wine:
|
|
desc: Build all Electron apps (Linux + Win via Wine)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "PLATFORM=win32 PYTHON_CMD='{{.WINE_PYTHON}}' {{.NPM}} run build-backend"
|
|
- "npx electron-builder --linux AppImage deb --win portable nsis --publish=never"
|
|
|
|
# --- Legacy Electron Builds ---
|
|
|
|
dist:legacy:linux:
|
|
desc: Build Linux AppImage (Legacy Electron)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "npx electron-builder -c package-legacy.json --linux AppImage --publish=never"
|
|
|
|
dist:legacy:win:
|
|
desc: Build Windows EXE (Legacy Electron)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "PLATFORM=win32 {{.NPM}} run build-backend"
|
|
- "npx electron-builder -c package-legacy.json --win portable --publish=never"
|
|
|
|
dist:legacy:win:wine:
|
|
desc: Build Windows EXE via Wine (Legacy Electron)
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "PLATFORM=win32 PYTHON_CMD='{{.WINE_PYTHON}}' {{.NPM}} run build-backend"
|
|
- "npx electron-builder -c package-legacy.json --win portable nsis --publish=never"
|
|
|
|
dist:legacy:all:
|
|
desc: Build all Legacy apps
|
|
deps: [build:fe]
|
|
cmds:
|
|
- "PLATFORM=linux {{.NPM}} run build-backend"
|
|
- "PLATFORM=win32 {{.NPM}} run build-backend"
|
|
- "npx electron-builder -c package-legacy.json --linux AppImage deb --win portable nsis --publish=never"
|
|
|
|
# --- Docker ---
|
|
|
|
docker:build:
|
|
desc: Build Docker image (buildx)
|
|
cmds:
|
|
- |
|
|
if ! docker buildx inspect {{.DOCKER_BUILDER}} >/dev/null 2>&1; then
|
|
docker buildx create --name {{.DOCKER_BUILDER}} --use >/dev/null
|
|
else
|
|
docker buildx use {{.DOCKER_BUILDER}}
|
|
fi
|
|
- |
|
|
docker buildx build --builder {{.DOCKER_BUILDER}} --platform {{.DOCKER_PLATFORMS}} \
|
|
{{.DOCKER_BUILD_FLAGS}} \
|
|
-t {{.DOCKER_IMAGE}} \
|
|
{{.DOCKER_BUILD_ARGS}} \
|
|
-f {{.DOCKERFILE}} \
|
|
{{.DOCKER_CONTEXT}}
|
|
|
|
docker:run:
|
|
desc: Run Docker container (compose)
|
|
cmds:
|
|
- 'MESHCHAT_IMAGE="{{.DOCKER_IMAGE}}" {{.DOCKER_COMPOSE_CMD}} -f {{.DOCKER_COMPOSE_FILE}} up --remove-orphans --pull never reticulum-meshchatx'
|
|
|
|
docker:run:dev:
|
|
desc: Run Docker container (dev compose)
|
|
cmds:
|
|
- 'MESHCHAT_IMAGE="{{.DOCKER_IMAGE}}" {{.DOCKER_COMPOSE_CMD}} -f docker-compose.dev.yml up --build --remove-orphans reticulum-meshchatx'
|
|
|
|
docker:build:env:
|
|
desc: Build containerized build environment
|
|
cmds:
|
|
- docker build -t {{.DOCKER_BUILD_IMAGE}} -f {{.DOCKER_BUILD_FILE}} .
|
|
|
|
docker:build:artifacts:
|
|
desc: Build and export artifacts from container
|
|
cmds:
|
|
- docker rm -f meshchat-build-temp || true
|
|
- docker run --name meshchat-build-temp {{.DOCKER_BUILD_IMAGE}}
|
|
- mkdir -p dist python-dist
|
|
- docker cp meshchat-build-temp:/app/dist/. ./dist/
|
|
- docker cp meshchat-build-temp:/app/python-dist/. ./python-dist/
|
|
- docker rm meshchat-build-temp
|
|
|
|
# --- Android ---
|
|
|
|
android:init:
|
|
desc: Initialize Gradle wrapper
|
|
cmds:
|
|
- |
|
|
if [ ! -f "{{.ANDROID_DIR}}/gradle/wrapper/gradle-wrapper.jar" ]; then
|
|
echo "Downloading Gradle wrapper jar..."
|
|
mkdir -p "{{.ANDROID_DIR}}/gradle/wrapper"
|
|
curl -L -o "{{.ANDROID_DIR}}/gradle/wrapper/gradle-wrapper.jar" \
|
|
https://raw.githubusercontent.com/gradle/gradle/v8.12.1/gradle/wrapper/gradle-wrapper.jar || \
|
|
echo "Failed to download. Please run: cd {{.ANDROID_DIR}} && gradle wrapper --gradle-version 8.12.1"
|
|
else
|
|
echo "Gradle wrapper already initialized."
|
|
fi
|
|
|
|
android:prepare:
|
|
desc: Prepare Android source assets
|
|
deps: [build:fe, android:init]
|
|
cmds:
|
|
- |
|
|
echo "Copying meshchatx package and dependencies to Android project..."
|
|
mkdir -p "{{.PYTHON_SRC_DIR}}"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/meshchatx"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/RNS"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXMF"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXST"
|
|
|
|
cp -r meshchatx "{{.PYTHON_SRC_DIR}}/"
|
|
cp -r ./misc/RNS "{{.PYTHON_SRC_DIR}}/"
|
|
cp -r ./misc/LXMF "{{.PYTHON_SRC_DIR}}/"
|
|
cp -r ./misc/LXST "{{.PYTHON_SRC_DIR}}/"
|
|
cp -r ./src/RNS "{{.PYTHON_SRC_DIR}}/" || true
|
|
cp -r ./src/LXMF "{{.PYTHON_SRC_DIR}}/" || true
|
|
cp -r ./src/LXST "{{.PYTHON_SRC_DIR}}/" || true
|
|
cp "./misc/pycodec2-3.0.1-cp311-cp311-linux_aarch64.whl" "{{.PYTHON_SRC_DIR}}/" || true
|
|
|
|
mkdir -p "{{.JNI_LIBS_DIR}}/arm64-v8a"
|
|
mkdir -p "{{.JNI_LIBS_DIR}}/armeabi-v7a"
|
|
cp "./misc/libcodec2-arm64-v8a.so" "{{.JNI_LIBS_DIR}}/arm64-v8a/" || true
|
|
cp "./misc/libcodec2-armeabi-v7a.so" "{{.JNI_LIBS_DIR}}/armeabi-v7a/" || true
|
|
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/RNS/Utilities/RNS"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXMF/Utilities/LXMF"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXST/Utilities/LXST"
|
|
|
|
android:build:
|
|
desc: Build Debug APK
|
|
deps: [android:prepare]
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew assembleDebug
|
|
|
|
android:build:release:
|
|
desc: Build Release APK
|
|
deps: [android:prepare]
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew assembleRelease
|
|
|
|
android:clean:
|
|
desc: Clean Android artifacts
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew clean
|
|
- rm -rf "{{.PYTHON_SRC_DIR}}/meshchatx"
|
|
|
|
# --- Maintenance ---
|
|
|
|
dist:
|
|
desc: Alias for dist:linux:appimage
|
|
cmds:
|
|
- task: dist:linux:appimage
|
|
|
|
clean:
|
|
desc: Nuke all build artifacts and dependencies
|
|
cmds:
|
|
- rm -rf node_modules build dist python-dist meshchatx/public build-dir out
|
|
- task: android:clean
|
|
|
|
locales:gen:
|
|
desc: Generate localization template
|
|
cmds:
|
|
- "{{.PYTHON}} scripts/generate_locale_template.py"
|