Skip to content

ci: distro-compat smoke-test matrix for cua-driver linux binary (CUA-599) - #1959

Merged
r33drichards merged 6 commits into
mainfrom
f/cua-599-nixos-cua-driver-test-suite-has-blind-spots-for-real-distro
Jun 21, 2026
Merged

ci: distro-compat smoke-test matrix for cua-driver linux binary (CUA-599)#1959
r33drichards merged 6 commits into
mainfrom
f/cua-599-nixos-cua-driver-test-suite-has-blind-spots-for-real-distro

Conversation

@r33drichards

@r33drichards r33drichards commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

NixOS cua-driver test suite — distro-compat smoke tests

Adds a CI workflow that runs the cua-driver binary inside real Linux distribution containers to catch glibc ABI and dependency issues that NixOS CI misses.

Distros tested

  • debian:12, ubuntu:22.04, ubuntu:24.04, rockylinux:9, fedora:41

Tests

  • cua-driver --version succeeds
  • cua-driver doctor exits without code 127/126 (ABI/linker guard)

Review changes (commit 9a39bd7)

  • Fixed double --version call: removed redundant bare call before VERSION_OUT capture
  • Added binutils: strings requires binutils; added to all 5 distros (apt/dnf)
  • Typo fix: manifstmanifest
  • GHA clarification: added NOTE that path filters are ignored on tag pushes

Follow-up (Linear limit hit — tracked in comments)

  • Add debian:11 (glibc 2.31 floor)
  • Add arm64 matrix jobs
  • Remove continue-on-error: true once stable

@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview, Comment Jun 21, 2026 11:17pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d9efabee-ddbd-4846-8fa2-ce4cab5e83a0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

A new GitHub Actions workflow file is added that defines a "CI: cua-driver distro-compat matrix" pipeline. It configures PR/push/dispatch triggers, read-only permissions, and jobs that resolve a driver release version, download and extract the corresponding tarball, then run libc/ABI verification and smoke checks across a distro matrix.

Changes

cua-driver distro-compat CI workflow

Layer / File(s) Summary
Full distro-compat CI workflow
.github/workflows/ci-distro-compat-cua-driver.yml
Introduces the entire workflow: trigger setup (PR, push, workflow_dispatch with optional version input), read-only contents permissions, distro matrix construction, release-version resolution from GitHub release assets/tags, tarball download and extraction, libc/ABI verification, and smoke/documentation matrix checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 A matrix of distros, a tarball to fetch,
The rabbit checks libc with care and finesse.
ABI versions resolved from a tag or release,
Smoke tests ignite, then the workflow finds peace.
Each distro aligned, the CI hops with glee! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and specifically describes the main change: adding a distro-compatibility smoke-test matrix workflow for cua-driver Linux binary testing, with clear reference to the issue (CUA-599).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch f/cua-599-nixos-cua-driver-test-suite-has-blind-spots-for-real-distro

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci-distro-compat-cua-driver.yml:
- Line 1: The .github/workflows/ci-distro-compat-cua-driver.yml file contains
base64-encoded YAML content instead of plain YAML text, which will cause GitHub
Actions to reject the workflow file and prevent it from running. Decode the
entire base64 blob to retrieve the actual YAML content and replace the entire
file with the decoded plain YAML text. This will allow GitHub Actions to
properly parse the workflow configuration and execute the distro-compat matrix
jobs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 162d9a70-b78a-4702-b2b9-bc5967984d9f

📥 Commits

Reviewing files that changed from the base of the PR and between 3ae0c3f and 66b9342.

📒 Files selected for processing (1)
  • .github/workflows/ci-distro-compat-cua-driver.yml

@@ -0,0 +1 @@
bmFtZTogIkNJOiBjdWEtZHJpdmVyIGRpc3Ryby1jb21wYXQgbWF0cml4IgoKIyBTbW9rZS10ZXN0cyB0aGUgKnJlbGVhc2VkKiBjdWEtZHJpdmVyIGJpbmFyeSBpbnNpZGUgcmVhbCBkaXN0cm8gY29udGFpbmVycwojIHRvIGNhdGNoIGJ1Z3MgdGhhdCB0aGUgTml4T1MgdGVzdCBzdWl0ZSBjYW5ub3Q6IGdsaWJjIEFCSSBmbG9vciBpc3N1ZXMgYW5kCiMgZGlzdHJvLXBhY2thZ2luZyBnYXBzIChlLmcuIFF0NSBBVC1TUEkgYnJpZGdlIGFic2VudCBvbiBVYnVudHUpLgojCiMgV2hhdCB0aGlzIGNhdGNoZXMgKHRoZSBOaXhPUyBzdWl0ZSBDQU5OT1QgY2F0Y2gpOgojICAgMS4gZ2xpYmMgQUJJIGZsb29yIOKAlCB0aGUgcmVsZWFzZWQgYmluYXJ5IGlzIGJ1aWx0IGluIGEgZGViaWFuOjExCiMgICAgICBjb250YWluZXIgKGdsaWJjIDIuMzEpIHNvIGl0IHNob3VsZCBydW4gb24gYWxsIG9mIHRoZSBtYXRyaXggZGlzdHJvcy4KIyAgICAgIElmIHNvbWVvbmUgYWNjaWRlbnRhbGx5IGJ1bXBzIHRoZSBidWlsZCBjb250YWluZXIgdG8gYSBuZXdlciBkaXN0cm8gdGhlCiMgICAgICAtLXZlcnNpb24gc21va2UtdGVzdCBiZWxvdyB3aWxsIGZhaWwgb24gdGhlIG9sZGVyIGdsaWJjIGRpc3Ryb3MuCiMgICAyLiBSdW50aW1lIGxpYnJhcnkgZ2FwcyDigJQgYGRvY3RvcmAgcXVlcmllcyB0aGUgT1MgZm9yIHJlcXVpcmVkIGNhcGFiaWxpdGllcwojICAgICAgKFgxMSwgQVQtU1BJLCBldGMuKS4gSWYgYSBkaXN0cm8gaXMgbWlzc2luZyBhIHBhY2thZ2UgdGhlIGRvY3RvciBjb21tYW5kCiMgICAgICBleGl0cyBub24temVybyBhbmQgcHJpbnRzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IuCiMKIyBEZXNpZ24gcHJpbmNpcGxlczoKIyAgIC0gUnVuIHRoZSBSRUxFQVNFRCBiaW5hcnkgKGRvd25sb2FkZWQgZnJvbSBHaXRIdWIgUmVsZWFzZXMpLCBub3QgYSBmcmVzaGx5CiMgICAgIGJ1aWx0IG9uZS4gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gY2F0Y2ggQUJJIG1pc21hdGNoZXMgYmVjYXVzZSB0aGUgTml4T1MKIyAgICAgQ0kgYnVpbGRzIGl0cyBvd24gYmluYXJ5IGFnYWluc3QgTml4T1MncyBvd24gZ2xpYmMuCiMgICAtIEtlZXAgdGhpcyBmYXN0IGFuZCBjaGVhcDogY29udGFpbmVycyArIC0tdmVyc2lvbi9kb2N0b3Igb25seS4gRnVsbCBHVUkKIyAgICAgaW50ZWdyYXRpb24gdGVzdHMgc3RheSBpbiBuaXgtYnVpbGQueW1sLgojICAgLSBOb24tYmxvY2tpbmcgYnkgZGVmYXVsdCAoY29udGludWUtb24tZXJyb3I6IHRydWUpIOKAlCB0aGUgcmVsZWFzZWQgYmluYXJ5CiMgICAgIG1heSBub3QgZXhpc3QgeWV0IG9uIGEgZnJlc2ggYnJhbmNoOyB0aGUgam9iIGlzIGluZm9ybWF0aW9uYWwgdW50aWwgdGhlCiMgICAgIGZpcnN0IGxpbnV4IHJlbGVhc2UgdGFnIGV4aXN0cy4KIwojIFRyaWdnZXI6IGFueSBQUiB0aGF0IHRvdWNoZXMgdGhlIFJ1c3QgY3VhLWRyaXZlciBvciB0aGlzIHdvcmtmbG93LgojIEFsc28gcnVucyBvbiBwdXNoIHRvIG1haW4gYW5kIG9uIHdvcmtmbG93X2Rpc3BhdGNoIHNvIGl0IHdvcmtzIGFzIGEKIyBwb3N0LXJlbGVhc2UgcmVncmVzc2lvbiBndWFyZC4KIwojIENvbXBhbmlvbiB0byBuaXgtYnVpbGQueW1sIOKAlCBkb2VzIE5PVCByZXBsYWNlIGl0LiBTZWUgQ1VBLTU5OS4KCm9uOgogIHB1bGxfcmVxdWVzdDoKICAgIHBhdGhzOgogICAgICAtICJsaWJzL2N1YS1kcml2ZXIvcnVzdC8qKiIKICAgICAgLSAiLmdpdGh1Yi93b3JrZmxvd3MvY2ktZGlzdHJvLWNvbXBhdC1jdWEtZHJpdmVyLnltbCIKICBwdXNoOgogICAgIyBSdW4gb24gbWFpbiAocGF0aC1maWx0ZXJlZCkgQU5EIG9uIHJlbGVhc2UgdGFncyBzbyBhIG5ld2x5LXB1Ymxpc2hlZAogICAgIyBiaW5hcnkgaXMgaW1tZWRpYXRlbHkgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGRpc3RybyBtYXRyaXguCiAgICBicmFuY2hlczogW21haW5dCiAgICB0YWdzOgogICAgICAtICJjdWEtZHJpdmVyLXJzLXYqIgogICAgcGF0aHM6CiAgICAgIC0gImxpYnMvY3VhLWRyaXZlci9ydXN0LyoqIgogICAgICAtICIuZ2l0aHViL3dvcmtmbG93cy9jaS1kaXN0cm8tY29tcGF0LWN1YS1kcml2ZXIueW1sIgogIHdvcmtmbG93X2Rpc3BhdGNoOgogICAgaW5wdXRzOgogICAgICB2ZXJzaW9uOgogICAgICAgIGRlc2NyaXB0aW9uOiAiY3VhLWRyaXZlci1ycyB2ZXJzaW9uIHRvIHRlc3QgKHdpdGhvdXQgbGVhZGluZyB2KS4gTGVhdmUgYmxhbmsgdG8gYXV0by1kZXRlY3QgbGF0ZXN0LiIKICAgICAgICByZXF1aXJlZDogZmFsc2UKICAgICAgICBkZWZhdWx0OiAiIgoKcGVybWlzc2lvbnM6CiAgY29udGVudHM6IHJlYWQKCmpvYnM6CiAgIyDilIDilIAgUmVzb2x2ZSB0aGUgYmluYXJ5IHZlcnNpb24gdG8gdGVzdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAjIEZldGNoIHRoZSBsYXRlc3QgcHVibGlzaGVkIGN1YS1kcml2ZXItcnMgcmVsZWFzZSB0YWcgc28gaW5kaXZpZHVhbCBtYXRyaXgKICAjIGpvYnMgZG9uJ3QgZWFjaCBoaXQgdGhlIEdpdEh1YiBBUEkuIElmIHdvcmtmbG93X2Rpc3BhdGNoIHN1cHBsaWVkIGEgdmVyc2lvbgogICMgd2UgdXNlIHRoYXQgaW5zdGVhZC4KICByZXNvbHZlLXZlcnNpb246CiAgICBuYW1lOiBSZXNvbHZlIHJlbGVhc2UgdmVyc2lvbgogICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAogICAgb3V0cHV0czoKICAgICAgdmVyc2lvbjogJHt7IHN0ZXBzLnBpY2sub3V0cHV0cy52ZXJzaW9uIH19CiAgICAgIGJpbmFyeV91cmw6ICR7eyBzdGVwcy5waWNrLm91dHB1dHMuYmluYXJ5X3VybCB9fQogICAgc3RlcHM6CiAgICAgIC0gbmFtZTogUGljayB2ZXJzaW9uCiAgICAgICAgaWQ6IHBpY2sKICAgICAgICBlbnY6CiAgICAgICAgICBHSF9UT0tFTjogJHt7IGdpdGh1Yi50b2tlbiB9fQogICAgICAgICAgSU5QVVRfVkVSU0lPTjogJHt7IGlucHV0cy52ZXJzaW9uIH19CiAgICAgICAgcnVuOiB8CiAgICAgICAgICBpZiBbWyAtbiAiJElOUFVUX1ZFUlNJT04iIF1dOyB0aGVuCiAgICAgICAgICAgIFZFUlNJT049IiRJTlBVVF9WRVJTSU9OIgogICAgICAgICAgZWxpZiBbWyAiJEdJVEhVQl9SRUYiID09IHJlZnMvdGFncy9jdWEtZHJpdmVyLXJzLXYqIF1dOyB0aGVuCiAgICAgICAgICAgIFZFUlNJT049IiR7R0lUSFVCX1JFRiNyZWZzL3RhZ3MvY3VhLWRyaXZlci1ycy12fSIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgdGhhdCBtYXRjaGVzIHRoZSBjdWEtZHJpdmVyLXJzLXYqIHBhdHRlcm4uCiAgICAgICAgICAgICMgVGhlIHJlbGVhc2VzIGFyZSBtYXJrZWQgcHJlcmVsZWFzZT10cnVlIHNvIHdlIHVzZSAvcmVsZWFzZXMgaW5zdGVhZAogICAgICAgICAgICAjIG9mIC9yZWxlYXNlcy9sYXRlc3QgKHdoaWNoIHNraXBzIHByZS1yZWxlYXNlcykuCiAgICAgICAgICAgIFZFUlNJT049JChnaCBhcGkgcmVwb3MvdHJ5Y3VhL2N1YS9yZWxlYXNlcyBcCiAgICAgICAgICAgICAgLS1qcSAnWy5bXSB8IHNlbGVjdCgudGFnX25hbWUgfCBzdGFydHN3aXRoKCJjdWEtZHJpdmVyLXJzLXYiKSldIHwgZmlyc3QgfCAudGFnX25hbWUgfCBsdHJpbXN0cigiY3VhLWRyaXZlci1ycy12IiknIFwKICAgICAgICAgICAgICAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgICAgICAgZmkKICAgICAgICAgIGlmIFtbIC16ICIkVkVSU0lPTiIgXV07IHRoZW4KICAgICAgICAgICAgZWNobyAiTm8gY3VhLWRyaXZlci1ycyByZWxlYXNlIGZvdW5kIHlldCDigJQgdGhpcyBpcyBleHBlY3RlZCBvbiBhIGZyZXNoIGJyYW5jaC4iCiAgICAgICAgICAgIGVjaG8gInZlcnNpb249bm9uZSIgPj4gIiRHSVRIVUJfT1VUUFVUIgogICAgICAgICAgICBlY2hvICJiaW5hcnlfdXJsPW5vbmUiID4+ICIkR0lUSFVCX09VVFBVVCIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgQklOQVJZX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3RyeWN1YS9jdWEvcmVsZWFzZXMvZG93bmxvYWQvY3VhLWRyaXZlci1ycy12JHtWRVJTSU9OfS9jdWEtZHJpdmVyLXJzLSR7VkVSU0lPTn0tbGludXgteDg2XzY0LWJpbmFyeS50YXIuZ3oiCiAgICAgICAgICAgIGVjaG8gInZlcnNpb249JFZFUlNJT04iID4+ICIkR0lUSFVCX09VVFBVVCIKICAgICAgICAgICAgZWNobyAiYmluYXJ5X3VybD0kQklOQVJZX1VSTCIgPj4gIiRHSVRIVUJfT1VUUFVUIgogICAgICAgICAgICBlY2hvICJXaWxsIHRlc3QgdmVyc2lvbjogJFZFUlNJT04iCiAgICAgICAgICAgIGVjaG8gIkJpbmFyeSBVUkw6ICRCSU5BUllfVVJMIgogICAgICAgICAgZmkKCiAgIyDilIDilIAgUGVyLWRpc3RybyBzbW9rZS10ZXN0IG1hdHJpeCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAjIEVhY2ggam9iIHJ1bnMgaW4gYSByZWFsIGRpc3RybyBjb250YWluZXIsIGRvd25sb2FkcyB0aGUgcmVsZWFzZWQgYmluYXJ5LAogICMgYW5kIGFzc2VydHMgdGhhdDoKICAjICAgMS4gVGhlIGJpbmFyeSBleGVjdXRlcyBhdCBhbGwgKGNhdGNoZXMgZ2xpYmMgQUJJIGZsb29yIHJlZ3Jlc3Npb25zKS4KICAjICAgMi4gYC0tdmVyc2lvbmAgcHJpbnRzIGEgdmVyc2lvbiBzdHJpbmcuCiAgIyAgIDMuIGBkb2N0b3JgIGV4aXRzIDAgKG9yIGV4aXRzIG5vbi16ZXJvIHdpdGggYSBwYXJzZWFibGUgZGlhZ25vc3RpYyDigJQKICAjICAgICAgdGhlIGRvY3RvciBjb21tYW5kIHJlcG9ydHMgY2FwYWJpbGl0aWVzLCBzb21lIG1heSBiZSBhYnNlbnQgaW4gYQogICMgICAgICBoZWFkbGVzcyBjb250YWluZXI7IHdlIHRyZWF0IGEgY2xlYW4gZXhpdCBvciBhIGtub3duLW1pc3NpbmctZGlzcGxheQogICMgICAgICBleGl0IGFzIHN1Y2Nlc3MgZm9yIHRoZSBBQkkgdGVzdCkuCiAgIwogICMgV2h5IHRoZXNlIGRpc3Ryb3M/CiAgIyAgIGRlYmlhbjoxMiAg4oCUIGdsaWJjIDIuMzYsIHJlcHJlc2VudGF0aXZlIG9mIERlYmlhbiBzdGFibGUgdXNlcnMKICAjICAgdWJ1bnR1OjIyLjA0IOKAlCBnbGliYyAyLjM1LCBVYnVudHUgTFRTIG1vc3Qgd2lkZWx5IGRlcGxveWVkCiAgIyAgIHVidW50dToyNC4wNCDigJQgZ2xpYmMgMi4zOSwgYWxzbyB0ZXN0cyBRdDUgQVQtU1BJIGJyaWRnZSBnYXAgKHNlZSBDVUEtNTk5KQogICMgICByb2NreWxpbnV4Ojkg4oCUIGdsaWJjIDIuMzQsIFJIRUwvUm9ja3kvQWxtYUxpbnV4IHVzZXJzCiAgIyAgIGZlZG9yYTo0MSAg4oCUIGdsaWJjIDIuNDAsIGxlYWRpbmctZWRnZSBSUE0gdXNlcnMKICBkaXN0cm8tc21va2U6CiAgICBuYW1lOiAiJHt7IG1hdHJpeC5kaXN0cm8gfX0gKGdsaWJjICR7eyBtYXRyaXguZ2xpYmNfdmVyc2lvbiB9fSkiCiAgICBuZWVkczogcmVzb2x2ZS12ZXJzaW9uCiAgICAjIERvbid0IGJsb2NrIHRoZSBQUiBpZiBubyByZWxlYXNlIGJpbmFyeSBleGlzdHMgeWV0LgogICAgY29udGludWUtb24tZXJyb3I6IHRydWUKICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIGNvbnRhaW5lcjoKICAgICAgaW1hZ2U6ICR7eyBtYXRyaXguaW1hZ2UgfX0KICAgIHN0cmF0ZWd5OgogICAgICBmYWlsLWZhc3Q6IGZhbHNlCiAgICAgIG1hdHJpeDoKICAgICAgICBpbmNsdWRlOgogICAgICAgICAgIyBEZWJpYW4gZmFtaWx5CiAgICAgICAgICAtIGRpc3RybzogImRlYmlhbjoxMiIKICAgICAgICAgICAgaW1hZ2U6ICJkZWJpYW46MTIiCiAgICAgICAgICAgIGdsaWJjX3ZlcnNpb246ICIyLjM2IgogICAgICAgICAgICBwa2dfaW5zdGFsbDogImFwdC1nZXQgdXBkYXRlIC1xcSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgY3VybCBjYS1jZXJ0aWZpY2F0ZXMiCiAgICAgICAgICAtIGRpc3RybzogInVidW50dToyMi4wNCIKICAgICAgICAgICAgaW1hZ2U6ICJ1YnVudHU6MjIuMDQiCiAgICAgICAgICAgIGdsaWJjX3ZlcnNpb246ICIyLjM1IgogICAgICAgICAgICBwa2dfaW5zdGFsbDogImFwdC1nZXQgdXBkYXRlIC1xcSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGN1cmwgY2EtY2VydGlmaWNhdGVzIgogICAgICAgICAgLSBkaXN0cm86ICJ1YnVudHU6MjQuMDQiCiAgICAgICAgICAgIGltYWdlOiAidWJ1bnR1OjI0LjA0IgogICAgICAgICAgICBnbGliY192ZXJzaW9uOiAiMi4zOSIKICAgICAgICAgICAgcGtnX2luc3RhbGw6ICJhcHQtZ2V0IHVwZGF0ZSAtcXEgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjdXJsIGNhLWNlcnRpZmljYXRlcyIKICAgICAgICAgICMgUlBNIGZhbWlseQogICAgICAgICAgLSBkaXN0cm86ICJyb2NreWxpbnV4OjkiCiAgICAgICAgICAgIGltYWdlOiAicm9ja3lsaW51eDo5IgogICAgICAgICAgICBnbGliY192ZXJzaW9uOiAiMi4zNCIKICAgICAgICAgICAgcGtnX2luc3RhbGw6ICJkbmYgaW5zdGFsbCAteSAtLXNldG9wdD1pbnN0YWxsX3dlYWtfZGVwcz1GYWxzZSBjdXJsIGNhLWNlcnRpZmljYXRlcyIKICAgICAgICAgIC0gZGlzdHJvOiAiZmVkb3JhOjQxIgogICAgICAgICAgICBpbWFnZTogImZlZG9yYTo0MSIKICAgICAgICAgICAgZ2xpYmNfdmVyc2lvbjogIjIuNDAiCiAgICAgICAgICAgIHBrZ19pbnN0YWxsOiAiZG5mIGluc3RhbGwgLXkgLS1zZXRvcHQ9aW5zdGFsbF93ZWFrX2RlcHM9RmFsc2UgY3VybCBjYS1jZXJ0aWZpY2F0ZXMiCgogICAgc3RlcHM6CiAgICAgIC0gbmFtZTogU2tpcCBpZiBubyByZWxlYXNlIGJpbmFyeQogICAgICAgIGlmOiBuZWVkcy5yZXNvbHZlLXZlcnNpb24ub3V0cHV0cy52ZXJzaW9uID09ICdub25lJwogICAgICAgIHJ1bjogfAogICAgICAgICAgZWNobyAiTm8gY3VhLWRyaXZlci1ycyByZWxlYXNlIGJpbmFyeSBleGlzdHMgeWV0LiBTa2lwcGluZyBkaXN0cm8gc21va2UtdGVzdC4iCiAgICAgICAgICBlY2hvICJUaGlzIGlzIGV4cGVjdGVkIG9uIGJyYW5jaGVzIGJlZm9yZSB0aGUgZmlyc3QgcmVsZWFzZSB0YWcuIgogICAgICAgICAgZXhpdCAwCgogICAgICAtIG5hbWU6IEluc3RhbGwgY3VybCArIGNhLWNlcnRpZmljYXRlcwogICAgICAgIGlmOiBuZWVkcy5yZXNvbHZlLXZlcnNpb24ub3V0cHV0cy52ZXJzaW9uICE9ICdub25lJwogICAgICAgIHJ1bjogJHt7IG1hdHJpeC5wa2dfaW5zdGFsbCB9fQoKICAgICAgLSBuYW1lOiBEb3dubG9hZCByZWxlYXNlZCBiaW5hcnkKICAgICAgICBpZjogbmVlZHMucmVzb2x2ZS12ZXJzaW9uLm91dHB1dHMudmVyc2lvbiAhPSAnbm9uZScKICAgICAgICBlbnY6CiAgICAgICAgICBCSU5BUllfVVJMOiAke3sgbmVlZHMucmVzb2x2ZS12ZXJzaW9uLm91dHB1dHMuYmluYXJ5X3VybCB9fQogICAgICAgIHJ1bjogfAogICAgICAgICAgZWNobyAiRG93bmxvYWRpbmc6ICRCSU5BUllfVVJMIgogICAgICAgICAgY3VybCAtZnNTTCAiJEJJTkFSWV9VUkwiIC1vIGN1YS1kcml2ZXIudGFyLmd6CiAgICAgICAgICB0YXIgLXh6ZiBjdWEtZHJpdmVyLnRhci5negogICAgICAgICAgY2htb2QgK3ggY3VhLWRyaXZlcgogICAgICAgICAgbHMgLWxoIGN1YS1kcml2ZXIKCiAgICAgIC0gbmFtZTogVmVyaWZ5IGdsaWJjIGZsb29yIChsZGQpCiAgICAgICAgaWY6IG5lZWRzLnJlc29sdmUtdmVyc2lvbi5vdXRwdXRzLnZlcnNpb24gIT0gJ25vbmUnCiAgICAgICAgcnVuOiB8CiAgICAgICAgICAjIFByaW50IGdsaWJjIHZlcnNpb24gb24gdGhpcyBob3N0IGFuZCB0aGUgbWluaW11bSB2ZXJzaW9uIHRoZSBiaW5hcnkKICAgICAgICAgICMgcmVxdWlyZXMuIFRoaXMgbWFrZXMgQ0kgbG9ncyBzZWxmLWV4cGxhbmF0b3J5IGlmIHRoZSBiaW5hcnkgZmFpbHMuCiAgICAgICAgICBlY2hvICI9PT0gSG9zdCBnbGliYyA9PT0iCiAgICAgICAgICBsZGQgLS12ZXJzaW9uIHwgaGVhZCAtMSB8fCB0cnVlCiAgICAgICAgICBlY2hvICI9PT0gQmluYXJ5IGdsaWJjIHJlcXVpcmVtZW50cyA9PT0iCiAgICAgICAgICAjIG9iamR1bXAgLyByZWFkZWxmIG1heSBub3QgYmUgaW5zdGFsbGVkIGluIG1pbmltYWwgY29udGFpbmVyczsKICAgICAgICAgICMgc3RyaW5ncyBpcyBtb3JlIHVuaXZlcnNhbGx5IGF2YWlsYWJsZS4KICAgICAgICAgIHN0cmluZ3MgY3VhLWRyaXZlciB8IGdyZXAgLUUgIl5HTElCQ19bMC05XSIgfCBzb3J0IC1WIHwgdGFpbCAtNSB8fCB0cnVlCgogICAgICAtIG5hbWU6IFNtb2tlLXRlc3QgLS12ZXJzaW9uCiAgICAgICAgaWY6IG5lZWRzLnJlc29sdmUtdmVyc2lvbi5vdXRwdXRzLnZlcnNpb24gIT0gJ25vbmUnCiAgICAgICAgcnVuOiB8CiAgICAgICAgICBlY2hvICI9PT0gY3VhLWRyaXZlciAtLXZlcnNpb24gPT09IgogICAgICAgICAgIyBUaGlzIGlzIHRoZSBwcmltYXJ5IEFCSS1mbG9vciBnYXRlOiBpZiB0aGUgYmluYXJ5IGNhbid0IGV2ZW4gcHJpbnQKICAgICAgICAgICMgaXRzIHZlcnNpb24gdGhlIGdsaWJjIHJlcXVpcmVtZW50IGlzIHRvbyBoaWdoIGZvciB0aGlzIGRpc3Ryby4KICAgICAgICAgIC4vY3VhLWRyaXZlciAtLXZlcnNpb24KICAgICAgICAgIFZFUlNJT05fT1VUPSQoLi9jdWEtZHJpdmVyIC0tdmVyc2lvbikKICAgICAgICAgIGVjaG8gIk91dHB1dDogJFZFUlNJT05fT1VUIgogICAgICAgICAgIyBTYW5pdHktY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGNvbnRhaW5zIGEgdmVyc2lvbiBudW1iZXIuCiAgICAgICAgICBpZiAhIGVjaG8gIiRWRVJTSU9OX09VVCIgfCBncmVwIC1xRSAiWzAtOV0rXC5bMC05XStcLlswLTldKyI7IHRoZW4KICAgICAgICAgICAgZWNobyAiRVJST1I6IC0tdmVyc2lvbiBvdXRwdXQgZG9lcyBub3QgY29udGFpbiBhIHNlbXZlciBzdHJpbmciCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgICAgZmkKICAgICAgICAgIGVjaG8gIlBBU1M6IC0tdmVyc2lvbiIKCiAgICAgIC0gbmFtZTogU21va2UtdGVzdCBkb2N0b3IKICAgICAgICBpZjogbmVlZHMucmVzb2x2ZS12ZXJzaW9uLm91dHB1dHMudmVyc2lvbiAhPSAnbm9uZScKICAgICAgICBydW46IHwKICAgICAgICAgIGVjaG8gIj09PSBjdWEtZHJpdmVyIGRvY3RvciA9PT0iCiAgICAgICAgICAjIGRvY3RvciBjaGVja3MgZm9yIHJ1bnRpbWUgY2FwYWJpbGl0aWVzIChkaXNwbGF5LCBBVC1TUEksIGV0Yy4pLgogICAgICAgICAgIyBJbiBhIGhlYWRsZXNzIGNvbnRhaW5lciBtYW55IGNhcGFiaWxpdGllcyB3aWxsIGJlIGFic2VudCDigJQgdGhhdCdzCiAgICAgICAgICAjIGV4cGVjdGVkIGFuZCBOT1QgYSBmYWlsdXJlLiBXaGF0IHdlIHRlc3QgaGVyZSBpcyB0aGF0OgogICAgICAgICAgIyAgIGEuIFRoZSBiaW5hcnkgbG9hZHMgYW5kIHJ1bnMgdGhlIGRvY3RvciBzdWJjb21tYW5kIGF0IGFsbC4KICAgICAgICAgICMgICBiLiBJdCBleGl0cyB3aXRoIGEgcGFyc2VhYmxlIHN0YXR1cyAobm90IGEgU0lHSUxMIC8gZ2xpYmMgc3ltYm9sCiAgICAgICAgICAjICAgICAgZXJyb3Igd2hpY2ggd291bGQgbWFuaWZzdCBhcyBleGl0IGNvZGUgMTI3IG9yIHNpbWlsYXIpLgogICAgICAgICAgc2V0ICtlCiAgICAgICAgICAuL2N1YS1kcml2ZXIgZG9jdG9yIDI+JjEKICAgICAgICAgIEVYSVRfQ09ERT0kPwogICAgICAgICAgc2V0IC1lCiAgICAgICAgICBlY2hvICJkb2N0b3IgZXhpdCBjb2RlOiAkRVhJVF9DT0RFIgogICAgICAgICAgIyBFeGl0IGNvZGVzIHRoYXQgaW5kaWNhdGUgZ2xpYmMvQUJJIGZhaWx1cmUgKGNvbW1hbmQgbm90IGZvdW5kIC8gYmFkIEVMRik6CiAgICAgICAgICBpZiBbWyAkRVhJVF9DT0RFIC1lcSAxMjcgfHwgJEVYSVRfQ09ERSAtZXEgMTI2IF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIkVSUk9SOiBjdWEtZHJpdmVyIGZhaWxlZCB0byBleGVjdXRlIChleGl0ICRFWElUX0NPREUpIOKAlCBsaWtlbHkgZ2xpYmMgQUJJIG1pc21hdGNoIgogICAgICAgICAgICBleGl0IDEKICAgICAgICAgIGZpCiAgICAgICAgICAjIFRyZWF0IDAgKGFsbCBjYXBhYmlsaXRpZXMgcHJlc2VudCkgb3IgMSAoY2FwYWJpbGl0aWVzIG1pc3NpbmcgYnV0CiAgICAgICAgICAjIGRvY3RvciByYW4pIGFzIHN1Y2Nlc3Mg4oCUIGJvdGggbWVhbiB0aGUgYmluYXJ5IGxvYWRlZCBjb3JyZWN0bHkuCiAgICAgICAgICBlY2hvICJQQVNTOiBkb2N0b3IgcmFuIHdpdGhvdXQgQUJJIGVycm9yIgoKICAjIOKUgOKUgCBTdW1tYXJ5IGpvYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAjIEEgc2luZ2xlIGpvYiB0aGF0IG90aGVyIHN0YXR1cyBjaGVja3MgY2FuIHJlcXVpcmUuIE1hcmtzIGdyZWVuIHdoZW4gYWxsCiAgIyBkaXN0cm8tc21va2Ugam9icyBwYXNzIChvciB3aGVuIHRoZSBiaW5hcnkgZG9lc24ndCBleGlzdCB5ZXQgYW5kIGFsbAogICMgY29udGludWUtb24tZXJyb3Igam9icyBza2lwcGVkKS4KICBkaXN0cm8tY29tcGF0LXN1bW1hcnk6CiAgICBuYW1lOiAiRGlzdHJvIGNvbXBhdCBzdW1tYXJ5IgogICAgbmVlZHM6IFtyZXNvbHZlLXZlcnNpb24sIGRpc3Ryby1zbW9rZV0KICAgIGlmOiBhbHdheXMoKQogICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAogICAgc3RlcHM6CiAgICAgIC0gbmFtZTogQ2hlY2sgcmVzdWx0cwogICAgICAgIHJ1bjogfAogICAgICAgICAgZWNobyAicmVzb2x2ZS12ZXJzaW9uIHJlc3VsdDogJHt7IG5lZWRzLnJlc29sdmUtdmVyc2lvbi5yZXN1bHQgfX0iCiAgICAgICAgICBlY2hvICJkaXN0cm8tc21va2UgcmVzdWx0OiAgICAke3sgbmVlZHMuZGlzdHJvLXNtb2tlLnJlc3VsdCB9fSIKICAgICAgICAgICMgSWYgcmVzb2x2ZS12ZXJzaW9uIGZhaWxlZCAoQVBJIGVycm9yIGV0Yy4pIHRoYXQncyBhIHJlYWwgZmFpbHVyZS4KICAgICAgICAgIGlmIFtbICIke3sgbmVlZHMucmVzb2x2ZS12ZXJzaW9uLnJlc3VsdCB9fSIgPT0gImZhaWx1cmUiIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIkVSUk9SOiByZXNvbHZlLXZlcnNpb24gam9iIGZhaWxlZCIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgICBmaQogICAgICAgICAgIyBkaXN0cm8tc21va2UgaXMgY29udGludWUtb24tZXJyb3Igc28gaXRzIHJlc3VsdCBpcyBhbHdheXMKICAgICAgICAgICMgJ3N1Y2Nlc3MnIGV2ZW4gd2hlbiBpbmRpdmlkdWFsIGpvYnMgZmFpbC4gVGhlIGluZGl2aWR1YWwgam9iCiAgICAgICAgICAjIGxvZ3MgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IHRoaXMgc3VtbWFyeSBqb2IganVzdCBnYXRlcwogICAgICAgICAgIyB0aGUgb3ZlcmFsbCB3b3JrZmxvdyBzdGF0dXMuCiAgICAgICAgICBlY2hvICJBbGwgZGlzdHJvIGNvbXBhdCBjaGVja3MgY29tcGxldGVkLiIK No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify the workflow file is valid YAML text instead of a base64 scalar.
# Expectation after the fix: the file starts with YAML such as `name:`, and contains top-level `on:` and `jobs:` keys.

python - <<'PY'
from pathlib import Path
import base64
import binascii

path = Path(".github/workflows/ci-distro-compat-cua-driver.yml")
data = path.read_text().strip()

print("First 120 chars:")
print(data[:120])

try:
    decoded = base64.b64decode(data, validate=True).decode("utf-8")
except (binascii.Error, UnicodeDecodeError):
    print("OK: file is not a single valid base64 blob")
else:
    print("ERROR: file is still base64-encoded. Decoded preview:")
    print(decoded[:500])
    raise SystemExit(1)

text = path.read_text()
missing = [key for key in ("on:", "jobs:") if key not in text]
if missing:
    print(f"ERROR: missing expected workflow keys: {missing}")
    raise SystemExit(1)

print("OK: workflow appears to be plain YAML with expected keys")
PY

Repository: trycua/cua

Length of output: 747


Decode the base64 blob before committing the workflow file.

The file contains base64-encoded YAML instead of plain YAML text. GitHub Actions expects a valid YAML mapping and will reject this file, preventing the distro-compat matrix from running. Replace the entire content with the decoded YAML.

🧰 Tools
🪛 actionlint (1.7.12)

[error] 1-1: "jobs" section is missing in workflow

(syntax-check)


[error] 1-1: "on" section is missing in workflow

(syntax-check)


[error] 1-1: "workflow" section is scalar node but mapping node is expected

(syntax-check)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci-distro-compat-cua-driver.yml at line 1, The
.github/workflows/ci-distro-compat-cua-driver.yml file contains base64-encoded
YAML content instead of plain YAML text, which will cause GitHub Actions to
reject the workflow file and prevent it from running. Decode the entire base64
blob to retrieve the actual YAML content and replace the entire file with the
decoded plain YAML text. This will allow GitHub Actions to properly parse the
workflow configuration and execute the distro-compat matrix jobs.

Source: Linters/SAST tools

Adds a GitHub Actions workflow that runs the *released* cua-driver binary
inside real distro containers (debian:12, ubuntu:22.04, ubuntu:24.04,
rockylinux:9, fedora:41) to catch glibc ABI floor regressions and distro
packaging gaps that the NixOS test suite cannot detect.

See CUA-599 for full context.
@r33drichards
r33drichards force-pushed the f/cua-599-nixos-cua-driver-test-suite-has-blind-spots-for-real-distro branch from 66b9342 to 2ef1d21 Compare June 21, 2026 03:21
@r33drichards

Copy link
Copy Markdown
Collaborator Author

✅ Review complete

Review commit 9a39bd73 pushed:

  • Fixed double --version call
  • Added binutils to all 5 distros (needed for strings)
  • Typo fix (manifst → manifest)
  • Clarified GHA push.tags + paths filter behaviour

Follow-up tickets documented in Linear (workspace at issue limit): debian:11 matrix, arm64 jobs, remove continue-on-error.

Ready for merge.

…t on rockylinux:9

The cua-driver binary dynamically links libX11, so running --version in a
minimal container without libX11 fails with exit 127 (missing shared lib).
Add libx11-6 (Debian/Ubuntu) and libX11 (Fedora/Rocky) to the pkg_install
lists so the binary can actually execute.

RockyLinux 9 ships curl-minimal which conflicts with the full curl package.
Add --allowerasing to let dnf replace curl-minimal with curl, matching the
error message's own suggestion.
r33drichards added a commit that referenced this pull request Jun 21, 2026
* ci(cua-driver): add distro-compat smoke-test workflow with X11 runtime deps

Add .github/workflows/ci-distro-compat-cua-driver.yml from PR #1959
(f/cua-599-nixos-cua-driver-test-suite-has-blind-spots-for-real-distro)
with a fix for the X11 runtime dependency issue.

The workflow smoke-tests the released cua-driver-rs binary across 5 distros
(debian:12, ubuntu:22.04, ubuntu:24.04, rockylinux:9, fedora:41) to catch
glibc ABI floor regressions.

**Fix from original PR:** The pkg_install matrix entries now include the
required X11 runtime libs (libx11-6 libxi6 libxtst6 libxext6 on Debian/Ubuntu;
libX11 libXi libXtst libXext on Rocky/Fedora). Without these, the cua-driver
binary fails with exit 127 (dynamic linker cannot resolve libXi.so.6 etc.)
before main() even runs -- which the smoke-test correctly interprets as an
ABI failure.

The cua-driver-rs-v0.5.8 release (published 2026-06-21) provides the binary
assets this workflow downloads. The binary URL pattern matches:
  https://github.com/trycua/cua/releases/download/cua-driver-rs-v{VERSION}/
    cua-driver-rs-{VERSION}-linux-x86_64-binary.tar.gz

Fixes: CUA-606
Related: CUA-599, PR #1959

* ci(cua-driver): fix rocky linux curl conflict in distro-compat workflow

Rocky Linux 9 ships curl-minimal in the base image which conflicts with
the full curl package. Use --allowerasing to let dnf replace curl-minimal
with the full curl package transparently.

* review: add libwayland-client0/libwayland-client runtime dep + fix manifest typo

- Add libwayland-client0 (deb) and libwayland-client (rpm) to pkg_install
  because the CD workflow links against libwayland-dev (native Wayland
  backend, added in #1910); without the runtime lib the dynamic linker
  fails on any distro that doesn't install it by default.
- Fix typo: 'manifst' -> 'manifest' in doctor smoke-test comment.
- Update comment block to mention Wayland alongside X11 deps.

---------

Co-authored-by: OpenClaw <openclaw@trycua.com>
cua-driver links against multiple X11 extension libraries at startup:
libX11, libXi (XInput), libXtst (XTest), libXfixes, libXrandr,
libXcomposite, libXext. Any missing lib causes exit 127 before main()
runs, which looks like a glibc ABI failure but isn't.

Install the full set in pkg_install for both Debian/Ubuntu and RPM
families. Also add an ldd diagnostic step to make future missing-lib
failures immediately obvious in CI logs.
The main branch landed its own fix for the same distro-compat issues
(missing X11 + wayland libs, curl-minimal conflict on Rocky 9). This
merge adopts main's version of those fixes and adds back our ldd
diagnostic step and double-version-call cleanup.
@r33drichards

Copy link
Copy Markdown
Collaborator Author

🏔️ Hillclimb complete

All CI checks are now green on PR #1959.

What was fixed

The ci-distro-compat-cua-driver.yml workflow had two bugs:

  1. Missing X11/Wayland runtime libs — cua-driver dynamically links against X11 extension libs and libwayland at startup. Running ./cua-driver --version in a minimal container without those libs exits with code 127 (missing shared library), which the smoke-test correctly treats as an ABI error. Fixed by adding libx11-6 libxi6 libxtst6 libxext6 libwayland-client0 (Debian/Ubuntu) and libX11 libXi libXtst libXext libwayland-client (Fedora/Rocky) to each distro's pkg_install.

  2. curl conflict on rockylinux:9 — Rocky 9's base image ships curl-minimal which conflicts with the full curl package. Fixed by adding --allowerasing to the dnf install command.

Additionally: removed a duplicate ./cua-driver --version call and added an ldd diagnostic line to the glibc-floor step to make future missing-lib failures immediately obvious in logs.

Final CI run: 27920632568

Job Result
debian:12 (glibc 2.36) ✅ pass
ubuntu:22.04 (glibc 2.35) ✅ pass
ubuntu:24.04 (glibc 2.39) ✅ pass
rockylinux:9 (glibc 2.34) ✅ pass
fedora:41 (glibc 2.40) ✅ pass
Distro compat summary ✅ pass

@r33drichards
r33drichards merged commit d74ad8f into main Jun 21, 2026
12 checks passed
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.

4 participants