feat: rebuild devel from ros:foxy-ros-base-focal for Jetson (arm64) support#23
Merged
ycpss91255 merged 2 commits intomainfrom Apr 24, 2026
Merged
feat: rebuild devel from ros:foxy-ros-base-focal for Jetson (arm64) support#23ycpss91255 merged 2 commits intomainfrom
ycpss91255 merged 2 commits intomainfrom
Conversation
…m64) support Replace the amd64-only osrf/ros:foxy-ros1-bridge base with multi-arch ros:foxy-ros-base-focal, then install ROS 1 Noetic + ROS 2 Foxy (including ros-foxy-ros1-bridge 0.9.7) from the ROS 1 snapshot apt repo. Matches the upstream docker_images_ros2 generated Dockerfile so the behaviour is unchanged on amd64, and unblocks native builds on Jetson. - ENV ROS1_DISTRO=noetic / ROS2_DISTRO=foxy baked into the image - Add script/ros_entrypoint.sh (osrf-compatible, ROS env only) alongside the existing script/entrypoint.sh (also loads /bridge.yaml via rosparam); default ENTRYPOINT unchanged - Test stage lint COPY switched to script/*.sh glob - Smoke tests extended (+5): ROS1/2_DISTRO env vars, /ros_entrypoint.sh executability + ability to source both ROS envs + expose ros2 - 4-language README, CHANGELOG [Unreleased], TEST.md (24 to 29) updated
- Dockerfile: devel CMD now `bash` (interactive shell only); new `runtime` stage `FROM devel` keeps `CMD ros2 run ros1_bridge parameter_bridge` for production-style auto-bridge deployments. `./run.sh` now lands in a plain shell instead of simultaneously running `parameter_bridge` in the background. USER-VISIBLE BEHAVIOR CHANGE. - .github/workflows/main.yaml: `build_runtime: false` -> `true` so CI builds both stages. - bridge.yaml + config/*.yaml: document the full schema parameter_bridge actually accepts — topics with optional QoS (history/depth/reliability/ durability/deadline/lifespan/liveliness/liveliness_lease_duration), `services_1_to_2` (example_interfaces/AddTwoInts, nav_msgs/GetMap), `services_2_to_1` (rcl_interfaces/GetParameters). config/scan_bridge.yaml and config/release_bridge.yaml now carry sensor-data QoS (BEST_EFFORT for image streams, RELIABLE for camera_info). - Dockerfile: drop `COPY config/ /config/` — entrypoint never reads `/config/` at runtime; `config/*.yaml` remain in the repo as reference examples and can still be consumed via `--build-arg BRIDGE_FILE=config/<file>.yaml`. - Smoke tests: remove `config directory exists` (no longer applicable). - 4 READMEs: update Features (devel/runtime split), Usage (new run modes), YAML Format (topic ROS 2 vs service ROS 1 type asymmetry), Architecture mermaid (runtime node, snapshots.ros.org source), Directory structure (runtime stage listed). - TEST.md: 29 -> 28 tests (Bridge config 6 -> 5). - CHANGELOG [Unreleased]: Changed + Removed entries. Note: `./run.sh runtime` does not yet work because the auto-generated `compose.yaml` only emits `devel` and `test` services. Tracked upstream in template. Invoke runtime for now via `docker build --target runtime` + `docker run`.
ycpss91255
added a commit
that referenced
this pull request
Apr 24, 2026
CI fix: v0.9.11's build.sh/run.sh/exec.sh/stop.sh look up _lib.sh at
`${FILE_PATH}/_lib.sh` in the /lint layout. Dockerfile test stage was
only copying the four top-level scripts, so `bats script_help.bats`
exited with `cannot find _lib.sh`. Add COPY for _lib.sh + i18n.sh.
Entrypoint split: devel now uses /ros_entrypoint.sh (sources ROS1+ROS2
without rosparam load) so `./run.sh` into devel gives an immediately
usable shell; runtime stage keeps /entrypoint.sh (rosparam load
/bridge.yaml + launch parameter_bridge) for production-style auto
bridge. Follow-up to PR #23 which shipped ros_entrypoint.sh but didn't
wire it into the Dockerfile.
ycpss91255
added a commit
that referenced
this pull request
Apr 24, 2026
* Squashed 'template/' changes from e5c123cf..087f26e3
087f26e3 chore: release v0.9.11 (#109)
d672949e feat: Jetson auto-detect for [build] network + dedupe _detect_lang (#102 + #104) (#107)
364ae6f9 test(coverage) + fix(i18n): fill audit gaps, localise _sanitize_lang, close #103 (#105)
13e28b9a chore: release v0.9.10 (#100)
3a2b3578 feat(ci): multi-arch docker build via native matrix runners (#99)
git-subtree-dir: template
git-subtree-split: 087f26e38f4f4bac7eef034d2922f040226a3c39
* chore: bump main.yaml + CHANGELOG for template v0.9.11
Pins call-docker-build / call-release to template@v0.9.11 so the
subtree upgrade actually wires into CI. CHANGELOG [Unreleased] records
the bump + key v0.9.11 features relevant to this repo (Jetson
auto-detect for runtime / build network, arm64 matrix runners).
* fix(test): copy _lib.sh/i18n.sh to /lint; wire ros_entrypoint into devel
CI fix: v0.9.11's build.sh/run.sh/exec.sh/stop.sh look up _lib.sh at
`${FILE_PATH}/_lib.sh` in the /lint layout. Dockerfile test stage was
only copying the four top-level scripts, so `bats script_help.bats`
exited with `cannot find _lib.sh`. Add COPY for _lib.sh + i18n.sh.
Entrypoint split: devel now uses /ros_entrypoint.sh (sources ROS1+ROS2
without rosparam load) so `./run.sh` into devel gives an immediately
usable shell; runtime stage keeps /entrypoint.sh (rosparam load
/bridge.yaml + launch parameter_bridge) for production-style auto
bridge. Follow-up to PR #23 which shipped ros_entrypoint.sh but didn't
wire it into the Dockerfile.
3 tasks
ycpss91255
added a commit
that referenced
this pull request
Apr 24, 2026
* ci: enable arm64 in build matrix (linux/amd64,linux/arm64) PR #23 rebuilt devel from a multi-arch base for Jetson support, but main.yaml never opted in to the template's arm64 build matrix — the build-worker.yaml input defaults to linux/amd64 only. As a result, every PR since #23 has only verified amd64 in CI; arm64 has been validated manually via rsync-to-Jetson. Pass platforms: linux/amd64,linux/arm64 to build-worker.yaml so CI runs both architectures in parallel (template v0.9.11 added the ubuntu-24.04-arm runner support). * ci: bump template @tag to v0.10.0-rc2 for arm64 test-tools fix v0.9.13's release-test-tools.yaml shipped a multi-arch ghcr.io/ycpss91255-docker/test-tools:v0.9.13 with x86_64 shellcheck / hadolint binaries in BOTH manifest variants — the `ARG TARGETARCH=amd64` default in template/dockerfile/Dockerfile.test-tools shadowed BuildKit's per-platform auto-inject (moby/buildkit#3403), so every multi-arch run fell back to amd64. This branch enabled the arm64 matrix but kept pointing at @v0.9.13, so the arm64 shard blew up at `shellcheck: Exec format error` on first run. Template v0.10.0-rc2 (#126 / #127) drops the ARG default. The rc2 GHCR image's arm64 variant contains real aarch64 binaries (verified via `docker cp` + `file`). Bumping build-worker.yaml + release- worker.yaml @tag so this PR's arm64 shard picks up the correct image.
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.
Summary
osrf/ros:foxy-ros1-bridgewith multi-archros:foxy-ros-base-focal+ ROS 1 snapshot apt repo so the image can be built natively on Jetson (arm64). The apt install list mirrors the upstreamdocker_images_ros2generator, so amd64 behavior is unchanged (ROS 1 Noetic + ROS 2 Foxy +ros-foxy-ros1-bridge=0.9.7).script/ros_entrypoint.sh(osrf-compatible: sources both ROS distros only) at/ros_entrypoint.sh, without replacing the existingscript/entrypoint.sh(still the defaultENTRYPOINT, still loads/bridge.yamlviarosparam).ENV ROS1_DISTRO=noetic/ROS2_DISTRO=foxyinto the image;ros_entrypoint.shuses these.script/*.shglob so new scripts get linted automatically.Test plan
./build.sh test— 29/29 smoke tests pass (ShellCheck / Hadolint / Bats) on amd64 host.-S warning:ros_entrypoint.shuses# shellcheck source=/dev/nulldirective for dynamic ROS setup.bash paths.ROS1_DISTRO/ROS2_DISTROenv vars,/ros_entrypoint.shexecutability,/ros_entrypoint.shsources both ROS envs (finalROS_DISTRO=foxy),/ros_entrypoint.shexposesros2on PATH.build-worker.yaml, separate PR).Notes
set -e(notset -euo pipefail) inros_entrypoint.shbecause ROS catkin profile scripts reference unset vars; matches the existingscript/entrypoint.shprecedent.ARG BRIDGE_FILE="bridge.yaml"preserved — documented build-arg stays working.