Skip to content

rpm packaging: v4.0.0 ships legacy wheels-cli module, missing .version / .channel files (titan cutover regression) #2700

@bpamiri

Description

@bpamiri

Describe the bug

The v4.0.0 rpm distribution diverges from the brew/Scoop distributions in two ways that block production deployment of wheels start on Rocky Linux. Surfaced during the titan production cutover on 2026-05-13 (see paiindustries/titan cutover run log).

1. Wrong module ships in /opt/wheels/modules/

The rpm installs the legacy CommandBox-style wheels-cli module (~558 KB, expects box install-shaped contents) instead of the new lucli-native wheels-module (~24 MB, with Module.cfc at top). This makes wheels start fail with Unknown command: 'start'. The brew formula ships the correct wheels-module.

2. Missing /opt/wheels/.version and /opt/wheels/.channel

The wrapper script reads these files to report version info. Without them, wheels --version returns unknown (stable). The brew formula writes both files during install.

3. Wrapper does not prepend module name when invoking lucli

The rpm's /usr/bin/wheels wrapper passes args directly to lucli without prepending the module name, so wheels start becomes lucli start (Unknown command). The brew wrapper renames the binary to wheels and routes via argv[0]. The rpm wrapper needs equivalent routing — either an argv[0] rename or an explicit lucli modules run wheels <args> invocation.

To Reproduce

On a fresh Rocky Linux 10 minimal cloud image:

dnf install tar  # rpm omits this dep — see note below
dnf install wheels-4.0.0-1.el10.x86_64.rpm
wheels --version            # → "unknown (stable)"
wheels start                # → "Unknown command: 'start'"
ls /opt/wheels/modules/     # → wheels-cli/ (legacy), not wheels-module/

Expected behavior

  • wheels --version returns the installed version + channel.
  • wheels start launches the Lucee server.
  • /opt/wheels/modules/ contains wheels-module (lucli-native), not wheels-cli (CommandBox-legacy).

Workaround currently in production (paiindustries/titan)

The titan Ansible wheels-cli role overlays the correct module after rpm install, writes .version + .channel, and uses wheels modules run wheels start in the systemd unit. See ansible/roles/wheels-cli/ and commits 867d1f906 + 9dc45da6b + 3a3c1dbe5.

This workaround should not be necessary — every titan VM has to apply it independently.

Additional notes

  • The rpm should explicitly declare tar as a dependency. Rocky Linux 10 minimal cloud images do not ship tar, and the rpm's post-install (or any role unpacking the module) fails silently without it.
  • The rpm wrapper's invocation strategy could mirror the brew approach (argv[0] rename) or use explicit module-routed lucli calls. Either is fine — they just need to match each other across distributions.

Desktop:

  • OS: Rocky Linux 10 (minimal cloud image, Proxmox)
  • Wheels: 4.0.0 (rpm)
  • Java: OpenJDK 21

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions