Skip to content

Commit 8ed850a

Browse files
fix(debian): Install dependencies of unreleased demos (#721)
1 parent 87c1a81 commit 8ed850a

2 files changed

Lines changed: 90 additions & 60 deletions

File tree

ros2_debian/Dockerfile.debian11

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ ARG EXCLUDE_PACKAGES=""
88

99
# Avoid warnings by switching to noninteractive
1010
ENV DEBIAN_FRONTEND=noninteractive
11+
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
1112

1213
# Update all packages
1314
RUN apt-get update && apt-get -y upgrade \
@@ -72,15 +73,16 @@ RUN set -eux; \
7273
echo "Failed to fetch ROS_APT_SOURCE_VERSION" >&2; \
7374
exit 1; \
7475
fi ; \
75-
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" ; \
76+
OS_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)" ; \
77+
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" ; \
7678
echo "Downloading and installing ROS apt source package: ${ROS_APT_PACKAGE}" ; \
7779
curl -fL -o /tmp/ros2-apt-source.deb "${ROS_APT_PACKAGE}" ; \
7880
if [ ! -s /tmp/ros2-apt-source.deb ]; then \
7981
echo "Downloaded .deb file is missing or empty" >&2; \
8082
exit 1; \
8183
fi ; \
8284
dpkg-deb -I /tmp/ros2-apt-source.deb > /dev/null || { echo "Invalid .deb file"; exit 1; } ; \
83-
apt-get install -y /tmp/ros2-apt-source.deb ; \
85+
apt-get install -y --no-install-recommends /tmp/ros2-apt-source.deb ; \
8486
rm /tmp/ros2-apt-source.deb
8587

8688
# setup environment
@@ -136,7 +138,7 @@ RUN \
136138
# install cmake 3.22.1 (the same version as Ubuntu Jammy default). Needed for RSL
137139
WORKDIR /usr
138140
RUN \
139-
wget --progress=dot:giga https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz && \
141+
curl -fL --progress-bar -o cmake-3.22.1-linux-x86_64.tar.gz https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz && \
140142
tar --strip-components=1 -xzf cmake-3.22.1-linux-x86_64.tar.gz && \
141143
rm cmake-3.22.1-linux-x86_64.tar.gz
142144

@@ -145,47 +147,61 @@ RUN \
145147
ENV ROS2_WS=/opt/ros2_ws
146148
WORKDIR $ROS2_WS
147149
COPY ros_controls.*.repos /tmp/
148-
RUN \
149-
: "build dependencies for ros-controls stack from release repos" && \
150-
repo_file=/tmp/ros_controls.${ROS_DISTRO}.repos && \
150+
# hadolint ignore=SC2086
151+
RUN set -ex; \
152+
: "build dependencies for ros-controls stack from release repos"; \
153+
repo_file=/tmp/ros_controls.${ROS_DISTRO}.repos; \
151154
if [ ! -f "$repo_file" ]; then \
152155
echo "Missing repos file: $repo_file" >&2; \
153156
exit 1; \
154-
fi && \
155-
mkdir -p src/imported_pkgs && \
156-
vcs import src/imported_pkgs < "$repo_file" && \
157-
TARGET_PACKAGES=$(colcon list --base-paths src/imported_pkgs --names-only | tr '\n' ' ') && \
157+
fi; \
158+
mkdir -p src/imported_pkgs; \
159+
vcs import src/imported_pkgs < "$repo_file"; \
160+
TARGET_PACKAGES=$(colcon list --base-paths src/imported_pkgs --names-only | tr '\n' ' '); \
161+
UNRELEASED_PACKAGES=$(rosdep keys --from-path src/imported_pkgs/ros-controls/ros2_control_demos/ | tr '\n' ' '); \
158162
if [ -z "$TARGET_PACKAGES" ]; then \
159163
echo "No packages found in imported repos" >&2; \
160164
exit 1; \
161-
fi && \
162-
EXCLUDE_ARGS="" && \
163-
if [ -n "$EXCLUDE_PACKAGES" ]; then \
164-
EXCLUDE_ARGS="--exclude $EXCLUDE_PACKAGES"; \
165-
fi && \
166-
success=0 && \
165+
fi; \
166+
success=0; \
167167
for i in 1 2 3 4 5; do \
168-
if rosinstall_generator $TARGET_PACKAGES --rosdistro $ROS_DISTRO --deps --deps-only --format repos $EXCLUDE_ARGS > deps.repos; then \
168+
if rosinstall_generator $TARGET_PACKAGES --rosdistro $ROS_DISTRO --deps --deps-only --format repos --exclude $EXCLUDE_PACKAGES > deps.repos; then \
169169
success=1; \
170170
break; \
171171
fi; \
172172
echo "retry #${i} .."; \
173173
sleep 60; \
174-
done && \
174+
done; \
175175
if [ "$success" -ne 1 ] || [ ! -s deps.repos ]; then \
176176
echo "Failed to generate deps.repos" >&2; \
177177
exit 1; \
178-
fi && \
179-
rm -rf src/imported_pkgs && \
180-
mkdir -p src/generated && \
181-
vcs import src/generated < deps.repos && \
182-
apt-get update -y -qq && \
183-
ROS_PACKAGE_PATH=$ROS2_WS rosdep install -iyr --from-path src/generated || true && \
184-
# build generated stack
178+
fi; \
179+
: > deps_unreleased.repos; \
180+
if [ -n "$UNRELEASED_PACKAGES" ]; then \
181+
success=0; \
182+
for i in 1 2 3 4 5; do \
183+
if rosinstall_generator $UNRELEASED_PACKAGES --rosdistro $ROS_DISTRO --deps --format repos --exclude $EXCLUDE_PACKAGES $TARGET_PACKAGES > deps_unreleased.repos; then \
184+
success=1; \
185+
break; \
186+
fi; \
187+
echo "retry #${i} .."; \
188+
sleep 60; \
189+
done; \
190+
if [ "$success" -ne 1 ] || [ ! -s deps_unreleased.repos ]; then \
191+
echo "Failed to generate deps_unreleased.repos" >&2; \
192+
exit 1; \
193+
fi; \
194+
fi; \
195+
rm -rf src/imported_pkgs; \
196+
mkdir -p src/generated; \
197+
vcs import src/generated < deps.repos; \
198+
vcs import src/generated < deps_unreleased.repos; \
199+
apt-get update -y -qq; \
200+
ROS_PACKAGE_PATH=$ROS2_WS rosdep install -iyr --from-path src/generated || true; \
185201
colcon build \
186-
--mixin release build-testing-off \
187-
--cmake-args --no-warn-unused-cli && \
188-
rm -rf log src build *.repos /tmp/ros_controls.*.repos
202+
--mixin release build-testing-off \
203+
--cmake-args --no-warn-unused-cli; \
204+
rm -rf -- log src build ./*.repos /tmp/ros_controls.*.repos
189205

190206
# add default.yaml to the image
191207
COPY ros2_debian/defaults.yaml /root/.colcon/defaults.yaml

ros2_debian/Dockerfile.debian12

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ ARG EXCLUDE_PACKAGES=""
77

88
# Avoid warnings by switching to noninteractive
99
ENV DEBIAN_FRONTEND=noninteractive
10+
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
1011

1112
# Update all packages
1213
RUN 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
146149
RUN \
147150
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh -s -- -y && \
148151
. "$HOME/.cargo/env" && \
@@ -153,60 +156,71 @@ RUN \
153156
ENV ROS2_WS=/opt/ros2_ws
154157
WORKDIR $ROS2_WS
155158
COPY 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

Comments
 (0)