Add GitHub Actions CI with a headless rendering smoke test#880
Open
j-rivero wants to merge 1 commit into
Open
Conversation
Bootstrap GitHub Actions CI for vrx4. A single job builds the workspace in the ros:lyrical-ros-base container with Gazebo Jetty (ros-gz from the ros2-testing repo) and runs a headless smoke test under Xvfb + Mesa software GL: it launches the real production launch, confirms /clock is advancing, and measures the frame rate of an observation camera. The observation camera is test-only and is not part of any shipped world. smoke_test.sh waits for the sim to come up (rclpy /clock detection), spawns the camera into the running world via ros_gz_sim create, and bridges its image just for the duration of the test, so the production world, launch, and bridge config carry no CI scaffolding. Also caches the Gazebo Fuel assets for faster, less network-dependent reruns, adds the checker's test deps to vrx_bringup, and updates the README requirement from ROS 2 Rolling to ROS 2 Lyrical. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Jose Luis Rivero <jrivero@honurobotics.com>
db3640e to
00fde6e
Compare
caguero
reviewed
Jun 2, 2026
caguero
left a comment
Collaborator
There was a problem hiding this comment.
This code mostly feels generic. How do you feel about moving it to its own GitHub composite action? The VRX repo will stay cleaner and more projects can benefit from it.
| with: | ||
| path: src/vrx | ||
|
|
||
| # open_water.sdf pulls the Portuguese Ledge tile from Gazebo Fuel on first |
Collaborator
There was a problem hiding this comment.
Nit: I'd remove the concrete references to an sdf world or model, as this might change in the future.
| @@ -0,0 +1,144 @@ | |||
| #!/usr/bin/env python3 | |||
Collaborator
There was a problem hiding this comment.
Can you include a license header in this file?
| @@ -0,0 +1,121 @@ | |||
| #!/usr/bin/env bash | |||
Collaborator
There was a problem hiding this comment.
Should we add a license header?
| @@ -0,0 +1,121 @@ | |||
| #!/usr/bin/env bash | |||
| # Headless smoke test for vrx4: GLX rendering under a virtual X server (Xvfb) | |||
Collaborator
There was a problem hiding this comment.
Nit: I'd remove the reference to the specific branch and Gazebo/ROS versions, in case we change it in the future.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add GitHub Actions CI with a headless rendering smoke test
Bootstraps continuous integration for
vrx4. There was no CI before; this builds the workspace and verifies the simulation actually comes up and renders on every push and PR.CI workflow (
.github/workflows/ci.yml)A single
smokejob that runs onpush,pull_requestagainstvrx4, andworkflow_dispatch:ros:lyrical-ros-basecontainer.ros-gzpackages (ros-lyrical-ros-gz-sim,ros-lyrical-ros-gz-bridge) from theros2-testingrepo, then resolves the remaining workspace deps withrosdep.colcon build --merge-install, and explicitly asserts thatvrx_bringupwas installed (colcon exits 0 even when it builds nothing)./github/home/.gz/fuelto match the containerHOME).Headless smoke test (
tools/smoke_test.sh+tools/check_render.py)Exercises the real production launch (
vrx_bringup simulation.launch.xml,gazebo_gui:=false) under a virtual X server (Xvfb) with Mesa software GL (llvmpipe), so rendering is validated without a GPU. The flow:/clockdetection (check_render.py --wait-only)./clockis advancing (physics is stepping, not paused) and the camera is publishing frames — reporting the achieved frame rate.It isolates its ROS graph per run, fails fast on launch crashes, and dumps the launch log on any failure.
Test-only observation camera
The observation camera is deliberately not part of any shipped world. It lives in
tools/observation_camera.sdfand is spawned into the running sim at test time viaros_gz_sim create(the world already loads the Sensors system, so it renders). The production world, launch file, and bridge config carry no CI scaffolding.Verification
Green end-to-end in CI. The smoke step confirms the runtime-spawned camera renders under software GL: