386 lines
14 KiB
YAML
386 lines
14 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}"
|
|
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
|
|
|
|
setup-python-env:
|
|
desc: Setup Python environment using Poetry
|
|
cmds:
|
|
- poetry install
|
|
- poetry run pip install ruff
|
|
|
|
lint-python:
|
|
desc: Lint Python code using ruff
|
|
cmds:
|
|
- poetry run ruff check . --exclude tests
|
|
- poetry run ruff format --check . --exclude tests
|
|
|
|
lint-frontend:
|
|
desc: Lint frontend code
|
|
cmds:
|
|
- "{{.NPM}} run lint"
|
|
|
|
lint:
|
|
desc: Run all linters (frontend and Python)
|
|
deps: [lint-frontend, lint-python]
|
|
|
|
format-python:
|
|
desc: Format Python code using ruff
|
|
cmds:
|
|
- poetry run ruff format ./ --exclude tests
|
|
- poetry run ruff check --fix ./ --exclude tests
|
|
|
|
format-frontend:
|
|
desc: Format frontend code using Prettier and ESLint
|
|
cmds:
|
|
- "{{.NPM}} run format"
|
|
- "{{.NPM}} run lint:fix"
|
|
|
|
format:
|
|
desc: Format all code (Python and frontend)
|
|
deps: [format-python, format-frontend]
|
|
|
|
test-python:
|
|
desc: Run Python tests using pytest
|
|
cmds:
|
|
- poetry run pytest tests/backend --cov=meshchatx/src/backend
|
|
|
|
test-python-cov:
|
|
desc: Run Python tests with detailed coverage report
|
|
cmds:
|
|
- poetry run pytest tests/backend --cov=meshchatx/src/backend --cov-report=term-missing
|
|
|
|
test-frontend:
|
|
desc: Run frontend tests using vitest
|
|
cmds:
|
|
- "{{.NPM}} run test"
|
|
|
|
test:
|
|
desc: Run all tests
|
|
deps: [test-python, test-frontend]
|
|
|
|
test:cov:
|
|
desc: Run all tests with coverage reports
|
|
deps: [test-python-cov, test-frontend]
|
|
|
|
compile:
|
|
desc: Compile Python code to check for syntax errors
|
|
cmds:
|
|
- "{{.PYTHON}} -m compileall meshchatx/"
|
|
|
|
install:
|
|
desc: Install all dependencies (installs node modules and python deps)
|
|
deps: [node_modules, python]
|
|
|
|
node_modules:
|
|
desc: Install Node.js dependencies
|
|
cmds:
|
|
- "{{.NPM}} install"
|
|
|
|
python:
|
|
desc: Install Python dependencies using Poetry
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry install"
|
|
|
|
run:
|
|
desc: Run the application
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry run meshchat"
|
|
|
|
dev:
|
|
desc: Run the application in development mode
|
|
deps: [build-frontend]
|
|
cmds:
|
|
- task: run
|
|
|
|
build:
|
|
desc: Build the application (frontend and backend)
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.NPM}} run build"
|
|
|
|
build-frontend:
|
|
desc: Build only the frontend
|
|
deps: [node_modules]
|
|
cmds:
|
|
- "{{.NPM}} run build-frontend"
|
|
|
|
wheel:
|
|
desc: Build Python wheel package
|
|
deps: [install]
|
|
cmds:
|
|
- "{{.PYTHON}} -m poetry build -f wheel"
|
|
- "{{.PYTHON}} scripts/move_wheels.py"
|
|
|
|
build-appimage:
|
|
desc: Build Linux AppImage
|
|
deps: [build]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "{{.NPM}} run dist -- --linux AppImage"
|
|
|
|
build-exe:
|
|
desc: Build Windows portable executable
|
|
deps: [build]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "{{.NPM}} run dist -- --win portable"
|
|
|
|
build-electron-linux:
|
|
desc: Build Linux Electron app with prebuilt backend
|
|
deps: [build-frontend]
|
|
cmds:
|
|
- "{{.NPM}} run dist:linux"
|
|
|
|
build-electron-windows:
|
|
desc: Build Windows Electron apps (portable and installer)
|
|
deps: [build-frontend]
|
|
cmds:
|
|
- "{{.NPM}} run dist:windows"
|
|
|
|
build-electron-all:
|
|
desc: Build all Electron apps (Linux and Windows)
|
|
deps: [build-frontend]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "{{.NPM}} run build-backend"
|
|
- "{{.NPM}} run dist -- --linux AppImage deb --win portable nsis"
|
|
|
|
dist:
|
|
desc: Build distribution (defaults to AppImage)
|
|
cmds:
|
|
- task: build-appimage
|
|
|
|
electron-legacy:
|
|
desc: Install legacy Electron version
|
|
cmds:
|
|
- "{{.NPM}} install --no-save electron@{{.LEGACY_ELECTRON_VERSION}}"
|
|
|
|
build-appimage-legacy:
|
|
desc: Build Linux AppImage with legacy Electron version
|
|
deps: [build, electron-legacy]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "{{.NPM}} run dist -- --linux AppImage"
|
|
- "./scripts/rename_legacy_artifacts.sh"
|
|
|
|
build-exe-legacy:
|
|
desc: Build Windows portable executable with legacy Electron version
|
|
deps: [build, electron-legacy]
|
|
cmds:
|
|
- "{{.NPM}} run electron-postinstall"
|
|
- "{{.NPM}} run dist -- --win portable"
|
|
- "./scripts/rename_legacy_artifacts.sh"
|
|
|
|
clean:
|
|
desc: Clean build artifacts and dependencies
|
|
cmds:
|
|
- rm -rf node_modules
|
|
- rm -rf build
|
|
- rm -rf dist
|
|
- rm -rf python-dist
|
|
- rm -rf meshchatx/public
|
|
- rm -rf build-dir
|
|
- task: android-clean
|
|
|
|
build-docker:
|
|
desc: Build Docker image using 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}}
|
|
|
|
run-docker:
|
|
desc: Run Docker container using docker-compose
|
|
cmds:
|
|
- 'MESHCHAT_IMAGE="{{.DOCKER_IMAGE}}" {{.DOCKER_COMPOSE_CMD}} -f {{.DOCKER_COMPOSE_FILE}} up --remove-orphans --pull never reticulum-meshchatx'
|
|
|
|
docker-build-env:
|
|
desc: Build the Docker image for containerized builds
|
|
cmds:
|
|
- docker build -t {{.DOCKER_BUILD_IMAGE}} -f {{.DOCKER_BUILD_FILE}} .
|
|
|
|
docker-build-artifacts:
|
|
desc: Build whls and electron artifacts inside a container and export them
|
|
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-init:
|
|
desc: Initialize Gradle wrapper for Android project
|
|
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 build (copy meshchatx package and assets)
|
|
deps: [build-frontend, android-init]
|
|
cmds:
|
|
- |
|
|
echo "Copying meshchatx package and dependencies to Android project..."
|
|
mkdir -p "{{.PYTHON_SRC_DIR}}"
|
|
# Remove old copies to ensure fresh build
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/meshchatx"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/RNS"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXMF"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXST"
|
|
|
|
# Copy MeshChatX
|
|
cp -r meshchatx "{{.PYTHON_SRC_DIR}}/"
|
|
|
|
# Vendor RNS, LXMF, and LXST from ./misc/ and ./src/
|
|
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
|
|
|
|
# Copy pycodec2 wheel from ./misc
|
|
cp "./misc/pycodec2-3.0.1-cp311-cp311-linux_aarch64.whl" "{{.PYTHON_SRC_DIR}}/" || true
|
|
|
|
# Copy native libraries from ./misc
|
|
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
|
|
|
|
# Cleanup vendored packages (remove utilities/tests etc if needed, similar to Sideband)
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/RNS/Utilities/RNS"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXMF/Utilities/LXMF"
|
|
rm -rf "{{.PYTHON_SRC_DIR}}/LXST/Utilities/LXST"
|
|
- |
|
|
echo "Android build prepared. Don't forget to:"
|
|
echo "1. Add Chaquopy license to {{.ANDROID_DIR}}/local.properties"
|
|
echo "2. Open {{.ANDROID_DIR}}/ in Android Studio or run: task android-build"
|
|
|
|
android-build:
|
|
desc: Build Android APK (requires Android SDK and Chaquopy license)
|
|
deps: [android-prepare]
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew assembleDebug
|
|
|
|
android-build-release:
|
|
desc: Build Android APK (release, requires signing config)
|
|
deps: [android-prepare]
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew assembleRelease
|
|
|
|
android-clean:
|
|
desc: Clean Android build artifacts
|
|
cmds:
|
|
- cd "{{.ANDROID_DIR}}" && ./gradlew clean
|
|
- rm -rf "{{.PYTHON_SRC_DIR}}/meshchatx"
|
|
|
|
flatpak-check-sdk:
|
|
desc: Check if required Flatpak SDK is installed
|
|
cmds:
|
|
- |
|
|
if ! flatpak info org.freedesktop.Sdk//24.08 >/dev/null 2>&1; then
|
|
echo "Flatpak SDK 24.08 is not installed."
|
|
echo "Install it with: flatpak install org.freedesktop.Sdk//24.08"
|
|
exit 1
|
|
fi
|
|
if ! flatpak info org.freedesktop.Platform//24.08 >/dev/null 2>&1; then
|
|
echo "Flatpak Platform runtime 24.08 is not installed."
|
|
echo "Install it with: flatpak install org.freedesktop.Platform//24.08"
|
|
exit 1
|
|
fi
|
|
if ! flatpak info org.freedesktop.Sdk.Extension.node20//24.08 >/dev/null 2>&1; then
|
|
echo "Flatpak Node.js 20 extension is not installed."
|
|
echo "Install it with: flatpak install org.freedesktop.Sdk.Extension.node20//24.08"
|
|
exit 1
|
|
fi
|
|
echo "Required Flatpak SDK, Platform runtime, and Node.js extension are installed."
|
|
|
|
build-flatpak:
|
|
desc: Build Flatpak package
|
|
deps: [flatpak-check-sdk]
|
|
cmds:
|
|
- flatpak-builder --force-clean build-dir flatpak.json
|
|
|
|
install-flatpak:
|
|
desc: Install Flatpak package locally
|
|
deps: [build-flatpak]
|
|
cmds:
|
|
- flatpak-builder --install --user --force-clean build-dir flatpak.json
|
|
|
|
run-flatpak:
|
|
desc: Run Flatpak application
|
|
cmds:
|
|
- flatpak run com.sudoivan.reticulummeshchatx
|