# Cross-Platform Install Tests Unified workflow for testing langflow installation across multiple platforms, supporting both manual and programmatic execution. ## Manual Testing ### 1. Test from PyPI Tests published langflow packages from PyPI across all platforms. **Via GitHub UI:** 1. Go to **Actions** → **Cross-Platform Installation Test** 2. Check **"Test from PyPI instead of building from source"** 3. Optionally specify a version (leave empty for latest) 4. Click **"Run workflow"** **Via CLI:** ```bash # Test latest version gh workflow run cross-platform-test.yml -f test-from-pypi=true # Test specific version gh workflow run cross-platform-test.yml \ -f test-from-pypi=true \ -f langflow-version="1.0.18" ``` ### 2. Test from Source Builds and tests langflow from current branch source code using release-like dependency resolution (transforms workspace dependencies to published packages for testing parity). **Via GitHub UI:** 1. Go to **Actions** → **Cross-Platform Installation Test** 2. Leave **"Test from PyPI instead of building from source"** unchecked 3. Click **"Run workflow"** **Via CLI:** ```bash # Test current branch with release-like dependencies gh workflow run cross-platform-test.yml -f test-from-pypi=false ``` ## Programmatic Testing For CI, releases, and other automated workflows that test wheel installation: ```yaml jobs: test-cross-platform: uses: ./.github/workflows/cross-platform-test.yml with: base-artifact-name: "dist-base" main-artifact-name: "dist-main" test-timeout: 120 # optional, defaults to 5 ``` ## Platforms Tested - **Linux**: AMD64 - **macOS**: Intel (AMD64), Apple Silicon (ARM64) - **Windows**: AMD64 - **Python versions**: - **All platforms**: 3.10, 3.12, and 3.13 - **Stability**: 3.10 and 3.12 are required to pass (blocking) - **Preview**: 3.13 testing is optional (non-blocking) to monitor ecosystem readiness ## What Gets Tested 1. **Package Installation**: `uv pip install langflow` (PyPI) or local wheel installation 2. **Dependencies**: Additional packages like `openai` for full functionality 3. **CLI Help**: `langflow --help` 4. **Server Startup**: `langflow run --backend-only` with `/health_check` endpoint validation 5. **Python Import**: `import langflow` ## Common Options ```bash # Extended timeout (10 minutes instead of default 5) gh workflow run cross-platform-test.yml \ -f test-timeout=10 # Test specific PyPI version gh workflow run cross-platform-test.yml \ -f test-from-pypi=true \ -f langflow-version="1.0.18" ``` ## Use Cases - **Before releases**: Verify current branch works on all platforms - **After PyPI publish**: Confirm published packages install correctly - **Debugging issues**: Test specific versions when users report problems - **Development**: Quick cross-platform validation during feature work ## Technical Details ### Installation Methods - **PyPI testing**: Uses `uv pip install` with official PyPI packages - **Source testing**: Transforms workspace dependencies to published packages (like nightly builds), then builds wheels from source and installs locally - **Dependencies**: Automatically installs additional packages (`openai`) for full functionality ### Health Checking - **Endpoint**: Uses `/health_check` for reliable server readiness validation - **Validation**: Checks database connectivity and chat service functionality - **Timeout**: Configurable timeout with proper cross-platform handling ### Platform-Specific Optimizations - **Stable versions**: Python 3.10 and 3.12 provide reliable package ecosystem support - **Preview testing**: Python 3.13 runs as non-blocking to monitor when it becomes viable - **Virtual Environments**: Uses `uv venv --seed` for consistent pip availability ### Workflow Architecture **Unified Single-File Design:** ``` cross-platform-test.yml ├── workflow_dispatch (Manual UI) │ ├── PyPI Testing (test-from-pypi=true) │ └── Source Testing (test-from-pypi=false) └── workflow_call (Programmatic API) └── Wheel Testing (always uses wheel method) ``` **Key Benefits:** - **Single File**: No complex workflow chains or parameter passing issues - **Unified Logic**: Same test matrix for all use cases - **Smart Routing**: Automatically determines install method based on trigger type - **Context-Aware**: Summary messages adapt to manual vs programmatic usage ### Trigger Types **Manual (`workflow_dispatch`):** - Simple boolean toggle: "Test from PyPI" vs "Test from Source" - Source testing always uses release-like dependency resolution for testing parity - User-friendly parameter names - Context-specific success/failure messages **Programmatic (`workflow_call`):** - Full parameter control for CI/releases - Backward compatible with existing workflows - Always uses wheel installation method (tests built artifacts) ### Implementation Details The workflow uses dynamic job conditions to route execution: ```yaml # Build only runs for source testing or when no artifacts provided build-if-needed: if: | (github.event_name == 'workflow_dispatch' && inputs.test-from-pypi == false) || (github.event_name == 'workflow_call' && (inputs.base-artifact-name == '' || inputs.main-artifact-name == '')) # Test matrix adapts install method based on trigger test-installation: steps: - name: Determine install method # workflow_dispatch: maps boolean to install method # workflow_call: always uses wheel method - name: Install from PyPI if: steps.install-method.outputs.method == 'pypi' - name: Install from wheels if: steps.install-method.outputs.method == 'wheel' ``` ## Known Issues ### macOS Compilation Issues (Historical) **Issue**: Previously, nightly/release builds could fail on macOS with Python 3.13 due to `chroma-hnswlib` compilation errors: ``` clang: error: unsupported argument 'native' to option '-march=' error: command '/usr/bin/clang++' failed with exit code 1 ``` **Root Cause**: Systematic difference in dependency resolution between workspace builds vs published packages: | Build Type | Package Source | Dependencies | chromadb | Result | |------------|----------------|--------------|----------|---------| | **Manual/Source** | Workspace (`langflow-base = { workspace = true }`) | 162 packages | ❌ Not included | ✅ Success | | **Nightly/Release** | Published (`langflow-base-nightly==0.5.0.dev21`) | 420 packages | ✅ Included | ❌ Compilation fails | **Technical Details**: 1. **Workspace builds** use local `src/backend/base/pyproject.toml` which excludes `chromadb` 2. **Nightly builds** modify dependencies via `scripts/ci/update_uv_dependency.py`: - Changes: `langflow-base~=0.5.0` → `langflow-base-nightly==0.5.0.dev21` - Uses published PyPI package with full dependency tree including `chromadb==0.5.23` 3. **macOS clang** doesn't support `-march=native` flag used by `chroma-hnswlib` compilation **Current Status**: - **Stable testing**: Python 3.10 and 3.12 are required to pass (blocking jobs) - **Preview testing**: Python 3.13 runs as non-blocking to monitor ecosystem readiness - **Compilation issues**: Python 3.13 may still fail due to `chroma-hnswlib` but won't block releases - **Manual testing**: Source builds now use the same dependency transformation as nightly builds for testing parity **Files Involved**: - `scripts/ci/update_uv_dependency.py` - Modifies dependency resolution - `scripts/ci/update_pyproject_combined.py` - Orchestrates nightly build changes - `pyproject.toml` vs `src/backend/base/pyproject.toml` - Different dependency trees ## Results - ✅ **Success**: All platforms pass installation and basic functionality - ❌ **Failure**: One or more platforms fail (check logs for details) - Each platform/Python combination runs independently - **Parallel execution**: All platforms tested simultaneously for faster feedback