@@ -7,6 +7,7 @@ ARG EXCLUDE_PACKAGES=""
77
88# Avoid warnings by switching to noninteractive
99ENV DEBIAN_FRONTEND=noninteractive
10+ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
1011
1112# Update all packages
1213RUN apt-get update && apt-get -y upgrade \
@@ -76,15 +77,16 @@ RUN set -eux; \
7677 echo "Failed to fetch ROS_APT_SOURCE_VERSION" >&2; \
7778 exit 1; \
7879 fi ; \
79- ROS_APT_PACKAGE="https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $VERSION_CODENAME)_all.deb" ; \
80+ OS_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)" ; \
81+ ROS_APT_PACKAGE="https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.${OS_CODENAME}_all.deb" ; \
8082 echo "Downloading and installing ROS apt source package: ${ROS_APT_PACKAGE}" ; \
8183 curl -fL -o /tmp/ros2-apt-source.deb "${ROS_APT_PACKAGE}" ; \
8284 if [ ! -s /tmp/ros2-apt-source.deb ]; then \
8385 echo "Downloaded .deb file is missing or empty" >&2; \
8486 exit 1; \
8587 fi ; \
8688 dpkg-deb -I /tmp/ros2-apt-source.deb > /dev/null || { echo "Invalid .deb file"; exit 1; } ; \
87- apt-get install -y /tmp/ros2-apt-source.deb ; \
89+ apt-get install -y --no-install-recommends /tmp/ros2-apt-source.deb ; \
8890 rm /tmp/ros2-apt-source.deb
8991
9092# setup environment
@@ -143,6 +145,7 @@ RUN \
143145 rm -rf /var/lib/apt/lists/*
144146
145147# rust, needed for zenoh
148+ # hadolint ignore=SC1091
146149RUN \
147150 curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh -s -- -y && \
148151 . "$HOME/.cargo/env" && \
@@ -153,60 +156,71 @@ RUN \
153156ENV ROS2_WS=/opt/ros2_ws
154157WORKDIR $ROS2_WS
155158COPY ros_controls.*.repos /tmp/
156- RUN \
157- : "build dependencies for ros-controls stack from release repos" && \
158- . "$HOME/.cargo/env" && \
159- repo_file=/tmp/ros_controls.${ROS_DISTRO}.repos && \
159+ # hadolint ignore=SC1091
160+ RUN set -ex; \
161+ : "build dependencies for ros-controls stack from release repos"; \
162+ . "$HOME/.cargo/env"; \
163+ repo_file=/tmp/ros_controls.${ROS_DISTRO}.repos; \
160164 if [ ! -f "$repo_file" ]; then \
161165 echo "Missing repos file: $repo_file" >&2; \
162166 exit 1; \
163- fi && \
164- mkdir -p src/imported_pkgs && \
165- vcs import src/imported_pkgs < "$repo_file" && \
166- TARGET_PACKAGES=$(colcon list --base-paths src/imported_pkgs --names-only | tr '\n' ' ') && \
167+ fi; \
168+ mkdir -p src/imported_pkgs; \
169+ vcs import src/imported_pkgs < "$repo_file"; \
170+ TARGET_PACKAGES=$(colcon list --base-paths src/imported_pkgs --names-only | tr '\n' ' '); \
171+ UNRELEASED_PACKAGES=$(rosdep keys --from-path src/imported_pkgs/ros-controls/ros2_control_demos/ | tr '\n' ' '); \
167172 if [ -z "$TARGET_PACKAGES" ]; then \
168173 echo "No packages found in imported repos" >&2; \
169174 exit 1; \
170- fi && \
171- EXCLUDE_ARGS="" && \
172- if [ -n "$EXCLUDE_PACKAGES" ]; then \
173- EXCLUDE_ARGS="--exclude $EXCLUDE_PACKAGES"; \
174- fi && \
175- success=0 && \
175+ fi; \
176+ success=0; \
176177 for i in 1 2 3 4 5; do \
177- if rosinstall_generator $TARGET_PACKAGES --rosdistro $ROS_DISTRO --deps --deps-only --format repos $EXCLUDE_ARGS > deps.repos; then \
178+ if rosinstall_generator $TARGET_PACKAGES --rosdistro $ROS_DISTRO --deps --deps-only --format repos --exclude $EXCLUDE_PACKAGES > deps.repos; then \
178179 success=1; \
179180 break; \
180181 fi; \
181182 echo "retry #${i} .."; \
182183 sleep 60; \
183- done && \
184+ done; \
184185 if [ "$success" -ne 1 ] || [ ! -s deps.repos ]; then \
185186 echo "Failed to generate deps.repos" >&2; \
186187 exit 1; \
187- fi && \
188- rm -rf src/imported_pkgs && \
189- mkdir -p src/generated && \
190- vcs import src/generated < deps.repos && \
191- apt-get update -y -qq && \
192- ROS_PACKAGE_PATH=$ROS2_WS rosdep install -iyr --from-path src/generated || true && \
193- # build generated stack, then build pinocchio with special flags when package is present
188+ fi; \
189+ : > deps_unreleased.repos; \
190+ if [ -n "$UNRELEASED_PACKAGES" ]; then \
191+ success=0; \
192+ for i in 1 2 3 4 5; do \
193+ if rosinstall_generator $UNRELEASED_PACKAGES --rosdistro $ROS_DISTRO --deps --format repos --exclude $EXCLUDE_PACKAGES $TARGET_PACKAGES > deps_unreleased.repos; then \
194+ success=1; \
195+ break; \
196+ fi; \
197+ echo "retry #${i} .."; \
198+ sleep 60; \
199+ done; \
200+ if [ "$success" -ne 1 ] || [ ! -s deps_unreleased.repos ]; then \
201+ echo "Failed to generate deps_unreleased.repos" >&2; \
202+ exit 1; \
203+ fi; \
204+ fi; \
205+ rm -rf src/imported_pkgs; \
206+ mkdir -p src/generated; \
207+ vcs import src/generated < deps.repos; \
208+ vcs import src/generated < deps_unreleased.repos; \
209+ apt-get update -y -qq; \
210+ ROS_PACKAGE_PATH=$ROS2_WS rosdep install -iyr --from-path src/generated || true; \
194211 colcon build \
195212 --mixin build-testing-off \
196213 --cmake-args --no-warn-unused-cli -DCMAKE_CXX_FLAGS="-Wno-maybe-uninitialized" \
197- --packages-skip pinocchio && \
214+ --packages-skip pinocchio; \
198215 if colcon list --base-paths src/generated --names-only | grep -qx pinocchio; then \
199- . install/setup.sh && \
216+ . install/setup.sh; \
200217 colcon build \
201218 --cmake-args --no-warn-unused-cli -DBUILD_EXAMPLES=OFF -DBUILD_PYTHON_INTERFACE=OFF \
202219 -DBUILD_WITH_COLLISION_SUPPORT=OFF -DBUILD_WITH_HPP_FCL_SUPPORT=OFF \
203220 --continue-on-error \
204221 --packages-select pinocchio; \
205- fi && \
206- # cleanup
207- rm -rf log src build *.repos /tmp/ros_controls.*.repos \
208- && \
209- : "remove cache" && \
222+ fi; \
223+ rm -rf -- log src build ./*.repos /tmp/ros_controls.*.repos; \
210224 rm -rf /var/lib/apt/lists/*
211225
212226# add default.yaml to the image
0 commit comments