Skip to content

Conversation

@MaxMansfield
Copy link
Collaborator

@MaxMansfield MaxMansfield commented Jan 27, 2026


name: Pull Request
about: Submit changes to the RTMS SDK

Description

This PR introduces a comprehensive release infrastructure overhaul for the Zoom RTMS SDK, transitioning from manual ad-hoc releases to a fully automated CI/CD pipeline with Trusted Publishing (OIDC) and manual approval gates.

Key highlights:

  • Improved Documentation: Support for VideoSDK and Python references as part of CI/CD
  • Git tag-based publishing: Push js-v1.0.0 or py-v1.0.0 tags to trigger automated builds and publishing
  • Pre-release tag support: RC/alpha/beta tags for testing (Node.js=dry-run, Python=TestPyPI)
  • Trusted Publishing (OIDC): Secure authentication without long-lived API tokens for both npm and PyPI
  • Manual approval gates: Human review required before packages are published to registries
  • Multi-platform builds: Automated builds for Linux x64 and macOS ARM64
  • cibuildwheel integration: Single command builds all 8 Python wheels (4 Python versions × 2 platforms)
  • Version 1.0.0: Both Node.js and Python bindings are now production-ready

Related Issues

  • Implements release infrastructure for v1.0.0 launch
  • Fixes ZOOM-1118204
  • Fixes Deskshare issues

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Tests (adding or improving tests)
  • Build changes

Affected Components

  • Core C++ implementation
  • Node.js bindings
  • Python bindings
  • Go bindings
  • Build system
  • Documentation
  • Examples
  • Other (please specify)

Testing Performed

CI/CD Testing

  • Workflow triggers correctly on js-v* and py-v* tags
  • Dry-run mode tested via workflow_dispatch
  • Build artifacts created successfully for all platforms
  • Manual approval gates function correctly

Build Testing

  • Node.js prebuilds for darwin-arm64 and linux-x64 (N-API v9 and v10)
  • Python wheels for Python 3.10, 3.11, 3.12, 3.13 on both platforms
  • cibuildwheel produces all 8 expected wheels

Automated Tests

  • Node.js tests pass on Linux (20.3.0, 22.x, 24.x) and macOS (24.x)
  • Python tests pass on Linux (3.10, 3.11, 3.12, 3.13) and macOS (3.10, 3.13)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published

Additional Context

Breaking Changes

  1. Event System Redesign: The event callback system has been redesigned with typed callbacks for both Node.js and Python. Existing code using the old event patterns will need to be updated.

  2. Minimum Version Requirements:

    • Node.js: Now requires 20.3.0+ (was 18.x)
    • Python: Now requires 3.10+ (was 3.8+)

Publishing Workflow

After this PR is merged:

  1. Create version tags:

    git tag js-v1.0.0
    git tag py-v1.0.0
    git push origin js-v1.0.0 py-v1.0.0
  2. The publish workflow will automatically:

    • Build all platform-specific artifacts
    • Pause for manual approval
    • Publish to npm and PyPI after approval
    • Create GitHub Releases

Dry-Run Testing

To test the CI/CD without publishing:

  1. Go to Actions → "Publish Packages" workflow
  2. Click "Run workflow"
  3. Select branch, language (node/python), version (1.0.0)
  4. Set "Dry run" to true
  5. Run and verify artifacts are built correctly

Files Changed

New Files:

  • .github/workflows/publish.yml - Git tag publishing workflow
  • PUBLISHING.md - Comprehensive publishing guide
  • CHANGELOG.md - Release changelog
  • examples/ - Product-specific example guides

Modified Files:

  • .github/workflows/main.yml - Enhanced CI/CD with artifact reuse
  • Taskfile.yml - New cibuildwheel tasks, wheel cleanup
  • pyproject.toml - cibuildwheel configuration, v1.0.0
  • package.json - v1.0.0
  • compose.yaml - Automated test commands
  • README.md - Supported products, updated badges
  • CLAUDE.md - Updated documentation

- Add cibuildwheel configuration to pyproject.toml
  - Build for Python 3.10, 3.11, 3.12, 3.13
  - Support darwin-arm64 and linux-x64
  - Configure auditwheel for Linux manylinux compliance

- Add Taskfile tasks for cibuildwheel
  - build:py:cibuildwheel: Auto-detect platform
  - build:py:cibuildwheel:linux: Build via Docker
  - build:py:cibuildwheel:darwin: Build locally on macOS

- Add cibuild-py service to compose.yaml
- Add py-cibuild target to Dockerfile

This enables building wheels for all supported Python versions
in a single command, producing 8 wheels per release (4 versions x 2 platforms)
- Create publish.yml workflow
  - Triggered by git tags (js-v*, py-v*)
  - Detects language and version from tag
  - Validates version matches package.json/pyproject.toml
  - Builds all platform-specific artifacts
  - Uses GitHub Environments for manual approval before publish
  - Publishes to npm/PyPI only after approval
  - Creates GitHub Release
  - Supports workflow_dispatch for dry-run testing

- Update main.yml workflow
  - Add workflow_dispatch trigger for manual testing
  - Add conditions to respect manual trigger inputs
  - Enables testing doc builds on branches
  - Enables dry-run testing without deployment

Requires GitHub Environment 'production' with reviewers configured.
Requires GitHub secrets: NPM_TOKEN, PYPI_TOKEN, TESTPYPI_TOKEN
- Add detailed "Git Tag-Based Publishing" section
  - Prerequisites and setup instructions
  - Tag naming convention (js-v*, py-v*)
  - GitHub Environment setup (one-time configuration)
  - Step-by-step Node.js release process
  - Step-by-step Python release process (with cibuildwheel)
  - Dry-run testing mode instructions
  - Automated validation details
  - Manual approval benefits and workflow
  - Rollback procedures (before and after publish)
  - Troubleshooting common issues
  - Comparison table: manual vs git tag publishing

- Update tag examples from python-v* to py-v* (consistency)
- Add note that cibuildwheel builds 8 wheels (4 versions x 2 platforms)

This provides maintainers with a complete guide for the new
automated publishing workflow with manual approval gates.
- Created single meetings.md with both Node.js and Python examples
- Added webinars.md and videosdk.md overviews
- Updated README.md with Examples by Product section
- Fixed VideoSDK webhook events (session.rtms_started not videosdk.*)
- Simple flat structure: meetings.md, webinars.md, videosdk.md
- All examples are markdown-based, linkable, and version controlled
- No build process needed - direct markdown files
- Added early Supported Products section after badges
- Links to all product examples (Meetings, Webinars, Video SDK)
- Removed duplicate Examples by Product section later in file
- Better visibility for product-specific documentation
- compose.yaml: Use 'npx jest tests/' instead of 'task manual:js' (no .env needed)
- compose.yaml: Run pytest for Python tests instead of echo
- workflows/main.yml: Remove Node 20.x from matrix (keep 20.3.0 min + 24.x LTS)
- Taskfile.yml: Enable Python tests with proper wheel installation

This reduces test jobs from 10 to 8 and fixes .env dependency issues in CI.
…README.md)

The actual file in git is README.MD (uppercase) but pyproject.toml
referenced README.md (lowercase). This works on macOS (case-insensitive)
but fails on Linux CI environments (case-sensitive).

This fixes the 'Readme file not found' error in scikit-build-core.
Fixed case sensitivity issue by renaming to lowercase .md extension.
This is the standard convention and works across all platforms.

Tested locally in Docker - wheel builds successfully.
Changed from set_property with LINK_FLAGS (which produced 68847ORIGIN literal)
to set_target_properties with INSTALL_RPATH (which correctly produces $ORIGIN).

This fixes the 'librtmsdk.so.0: cannot open shared object file' error
when importing the Python module on Linux.

Preserved old implementation as comment for easy reversion if needed.

Tested in Docker: module imports successfully with proper RPATH set.
BREAKING CHANGES:
- Remove onUserUpdate callback - replaced with typed event callbacks
- Remove USER_EVENT_JOIN and USER_EVENT_LEAVE constants

New typed event callbacks that auto-subscribe to events:
- onParticipantEvent(cb) - participant join/leave events
- onActiveSpeakerEvent(cb) - active speaker changes
- onSharingEvent(cb) - screen share start/stop

New event constants:
- EVENT_ACTIVE_SPEAKER_CHANGE, EVENT_PARTICIPANT_JOIN,
  EVENT_PARTICIPANT_LEAVE, EVENT_SHARING_START, EVENT_SHARING_STOP

Events are now delivered via onEventEx as JSON and parsed in the
TypeScript/Python wrapper layers (not C++). Typed callbacks provide
a convenient API while onEventEx remains available for raw access.

Also:
- Bump Node.js package to 1.0.0
- Bump Python package to 1.0.0
- Add .claude/, .vscode/, __pycache__/, .pytest_cache/ to .gitignore
- Update tests for new event system
- Fix Node.js prebuild: use `npx prebuild` instead of direct `prebuild`
  command which wasn't in dependencies (scripts/prebuild.js, scripts/publish.js)

- Fix Python manylinux: update to manylinux_2_34 to match Zoom SDK's
  glibc 2.34 requirement (pthread symbols) (pyproject.toml)

- Update cibuildwheel tasks to run directly instead of via Docker compose,
  allowing cibuildwheel to manage its own manylinux containers (Taskfile.yml)

- Remove unused cibuild-py Docker service and py-cibuild Dockerfile target
  (compose.yaml, Dockerfile)

- Update PUBLISHING.md with new Linux distribution requirements:
  Ubuntu 22.04+, Debian 12+, RHEL 9+, Fedora 35+ (glibc 2.34+)
Call prebuild.js script directly instead of using Tasks
The @zoom/rtms scoped package creates prebuilds in prebuilds/@zoom/
subdirectory. Update artifact upload paths to match this structure.

Changes:
- main.yml: Fix upload paths from prebuilds/*.tar.gz to prebuilds/@zoom/*.tar.gz
- publish.yml: Fix upload path and restore @zoom subd
Prevent pip install failures when dist/py contains wheels from multiple
platforms. build:py now removes existing wheels for the current platform
before building, and manual:py installs only compatible wheels.
- Create CHANGELOG.md with v1.0.0 release notes documenting:
  - Release infrastructure (OIDC, manual approval, cibuildwheel)
  - Breaking changes (event system, minimum version requirements)
  - CI/CD improvements and bug fixes
- Update PUBLISHING.md version examples from 0.0.x to 1.x
- Remove outdated TestPyPI badge from README.md (v1.0.0 goes to PyPI)
- RC/alpha/beta tags (e.g., js-v1.0.0-rc.1) trigger special behavior:
  - Node.js: dry-run mode (no test npm registry exists)
  - Python: publish to TestPyPI instead of PyPI
- Version validation allows prerelease suffix on base version
  (js-v1.0.0-rc.1 validates against 1.0.0 in package.json)
- GitHub Releases marked as prerelease for RC/alpha/beta tags
- Add pypi_target output to control TestPyPI vs PyPI routing
- Python environment URL now shows TestPyPI for prerelease tags
- Linux prebuild job now calls build:js directly instead of Docker-based task
- Fixes 'Error removing directory' by ensuring proper build sequence
- Add verbose: true for better debugging of upload issues
- Add skip-existing: true to handle re-runs without failing on duplicate versions
- Add onUserUpdate callback to C++ core, Node.js, and Python bindings
- Fix segfault caused by missing on_user_update handler in SDK callbacks
- Export USER_JOIN and USER_LEAVE constants for user event handling
- Change default log level from DEBUG to INFO for cleaner output
- Move SDK initialization and server creation logs to DEBUG level
- Keep INFO level for: webhook listening, received events, joining/joined meeting
- Add "Received event" INFO log to Python webhook handler for parity with Node.js
- Update TypeScript definitions with UserUpdateCallback type
- Minor fixes: nvm version bump, task command fix for manual:py:linux
The test assertions used incorrect enum values that didn't match the
C++ RTMS_EVENT_TYPE enum. Updated to include all 14 event types with
their correct values (EVENT_UNDEFINED=0 through EVENT_USER_UNHOLD=13).

Also bumped tar dependency from 7.5.2 to 7.5.6.
@MaxMansfield MaxMansfield self-assigned this Jan 27, 2026
@MaxMansfield MaxMansfield merged commit 8a1a90b into main Jan 27, 2026
18 checks passed
@MaxMansfield MaxMansfield deleted the feat/release-infra branch January 27, 2026 06:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants