Skip to content

feat: rebuild devel from ros:foxy-ros-base-focal for Jetson (arm64) support#23

Merged
ycpss91255 merged 2 commits intomainfrom
feat/jetson-arm64-support
Apr 24, 2026
Merged

feat: rebuild devel from ros:foxy-ros-base-focal for Jetson (arm64) support#23
ycpss91255 merged 2 commits intomainfrom
feat/jetson-arm64-support

Conversation

@ycpss91255
Copy link
Copy Markdown
Contributor

Summary

  • Replace amd64-only osrf/ros:foxy-ros1-bridge with multi-arch ros: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 upstream docker_images_ros2 generator, so amd64 behavior is unchanged (ROS 1 Noetic + ROS 2 Foxy + ros-foxy-ros1-bridge=0.9.7).
  • Add script/ros_entrypoint.sh (osrf-compatible: sources both ROS distros only) at /ros_entrypoint.sh, without replacing the existing script/entrypoint.sh (still the default ENTRYPOINT, still loads /bridge.yaml via rosparam).
  • Bake ENV ROS1_DISTRO=noetic / ROS2_DISTRO=foxy into the image; ros_entrypoint.sh uses these.
  • Test stage lint COPY switched to script/*.sh glob so new scripts get linted automatically.

Test plan

  • ./build.sh test — 29/29 smoke tests pass (ShellCheck / Hadolint / Bats) on amd64 host.
  • ShellCheck -S warning: ros_entrypoint.sh uses # shellcheck source=/dev/null directive for dynamic ROS setup.bash paths.
  • New smoke assertions: ROS1_DISTRO/ROS2_DISTRO env vars, /ros_entrypoint.sh executability, /ros_entrypoint.sh sources both ROS envs (final ROS_DISTRO=foxy), /ros_entrypoint.sh exposes ros2 on PATH.
  • Jetson (arm64) native build — requires Jetson device to verify end-to-end. Follow-up: CI multi-arch matrix (requires template-side change to build-worker.yaml, separate PR).

Notes

  • set -e (not set -euo pipefail) in ros_entrypoint.sh because ROS catkin profile scripts reference unset vars; matches the existing script/entrypoint.sh precedent.
  • ARG BRIDGE_FILE="bridge.yaml" preserved — documented build-arg stays working.

…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 ycpss91255 merged commit f00d335 into main Apr 24, 2026
2 checks passed
@ycpss91255 ycpss91255 deleted the feat/jetson-arm64-support branch April 24, 2026 02:26
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.
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.
@ycpss91255 ycpss91255 mentioned this pull request Apr 24, 2026
3 tasks
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.

1 participant