Skip to content

Add installer build tooling and cross-platform runtime fixes#4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdev eimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitai Bot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s) Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
Owner Author

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

@eimexdev eimexdev closed this May 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant