Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions scripts/RADI/Dockerfile.humble.offline
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# RoboticsAcademy
FROM jderobot/robotics-applications:dependencies-humble AS academy-src
COPY --from=local-academy . /RoboticsAcademy

FROM academy-src AS academy-src-trimmed
RUN rm -rf /RoboticsAcademy/.git \
/RoboticsAcademy/compose_cfg \
/RoboticsAcademy/docs \
/RoboticsAcademy/scripts \
/RoboticsAcademy/tests \
/RoboticsAcademy/react_frontend \
/RoboticsAcademy/common

# RoboticsInfrasctructure Repository
FROM jderobot/robotics-applications:dependencies-humble AS infra-src
COPY --from=local-infra . /opt/jderobot

FROM infra-src AS infra-src-trimmed
# Launchers/, Scenes/, Universes/ are intentionally retained in /opt/jderobot (hardcoded in all launch files).
RUN mkdir -p /home/ws/src && \
mv /opt/jderobot/CustomRobots /opt/jderobot/jderobot_drones /opt/jderobot/jderobot_drones_cpp /opt/jderobot/Industrial /opt/jderobot/common_interfaces_cpp /home/ws/src/ && \
mv /opt/jderobot/resources /resources && \
mkdir -p /opt/root-files && \
mv -t /opt/root-files /opt/jderobot/scripts/.env /opt/jderobot/scripts/entrypoint.sh /opt/jderobot/scripts/ram_entrypoint.py /opt/jderobot/scripts/test/check_device.py /opt/jderobot/scripts/set_dri_name.sh /opt/jderobot/scripts/check_ram_version.sh && \
chmod +x /opt/root-files/entrypoint.sh /opt/root-files/set_dri_name.sh && \
mkdir -p /opt/openbox-rc/etc/xdg/openbox/LXDE && \
mv -f /opt/jderobot/scripts/rc.xml /opt/openbox-rc/etc/xdg/openbox/LXDE/rc.xml && \
rm -rf /opt/jderobot/.git \
/opt/jderobot/.github \
/opt/jderobot/database \
/opt/jderobot/deprecated_assets \
/opt/jderobot/Docs \
/opt/jderobot/scripts \
/opt/jderobot/test \
/opt/jderobot/Universes \
/opt/jderobot/utils \
&& rm -f /opt/jderobot/Scenes/*.glb


FROM node:24 AS ra-base

RUN apt-get update && apt-get install -y zip
RUN mkdir -p /tmp/dev
COPY --from=academy-src /RoboticsAcademy /tmp/app
WORKDIR /tmp/app
RUN cd common && cd console_interfaces && zip -r ../common.zip console_interfaces/ && cd .. && cd gui_interfaces && zip -r -u ../common.zip gui_interfaces/ && cd .. && cd hal_interfaces && zip -r -u ../common.zip hal_interfaces/ && cd ../.. && mv common/common.zip react_frontend/src/common.zip
WORKDIR /tmp/app/react_frontend
RUN yarn install && yarn run build


FROM jderobot/robotics-applications:dependencies-humble

WORKDIR /

# RoboticsInfrasctructure Repository
COPY --from=infra-src-trimmed /opt/jderobot /opt/jderobot
COPY --from=infra-src-trimmed /home/ws/src /home/ws/src
COPY --from=infra-src-trimmed /resources /resources
COPY --from=infra-src-trimmed /opt/root-files/ /
COPY --from=infra-src-trimmed /opt/openbox-rc/ /

ARG IMAGE_TAG
ENV IMAGE_TAG=${IMAGE_TAG}

# Clone the RoboticsApplicationManager repository into the src folder inside RoboticsAcademy
RUN python3 -m pip install --no-cache-dir robotics_application_manager

# Build react_fronted and create commons
COPY --from=academy-src-trimmed /RoboticsAcademy /RoboticsAcademy

COPY --from=ra-base /tmp/app/react_frontend/static /RoboticsAcademy/react_frontend/static
COPY --from=ra-base /tmp/app/react_frontend/webpack-stats.json /RoboticsAcademy/react_frontend/webpack-stats.json

# Compiling and sourcing the workspace
WORKDIR /home/ws
RUN /bin/bash -c "source /opt/ros/humble/setup.bash; colcon build --symlink-install --packages-ignore gz_ros2_control gz_ros2_control_demos"

# Django server
EXPOSE 7164

# Manager websocket
EXPOSE 7163

# Tools ports
EXPOSE 6080-6090

#PostgreSQL Database
EXPOSE 5432

WORKDIR /

# Setting environment in both interactive or non-interactive shells
ENV BASH_ENV=/.env
ENTRYPOINT ["./entrypoint.sh"]
136 changes: 136 additions & 0 deletions scripts/RADI/build-offline.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#!/bin/bash

# Default values if not specified
ROS_DISTRO="humble"
IMAGE_TAG="test"
FORCE_BUILD=false
FORCE_BUILD_NO_CACHE=false

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOCAL_ACADEMY_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
LOCAL_INFRA_DIR="$LOCAL_ACADEMY_DIR/RoboticsInfrastructure"

Help()
{
echo "Syntax: build-offline.sh [options]"
echo
echo "Builds the RoboticsBackend image from the local checkouts on disk:"
echo " RoboticsAcademy: $LOCAL_ACADEMY_DIR"
echo " RoboticsInfrastructure: $LOCAL_INFRA_DIR"
echo "Includes uncommitted edits to files git already tracks; a brand new"
echo "file needs 'git add' first (no commit needed) to be picked up."
echo
echo "Options:"
echo " -h Print this Help."
echo " -f Force creation of the base image. If omitted, the base image is created only if it doesn't exist."
echo " -F Force creation of the base image without using docker cache."
echo " -r, --ros <value> ROS Distro (humble). Default: humble"
echo " -t, --tag <value> Tag name of the image. Default: test"
echo
echo "Example:"
echo " ./build-offline.sh -t my_image"
echo
}

stage_local_repo()
{
local repo_dir="$1"
local label="$2"

if [ ! -d "$repo_dir/.git" ]; then
echo "Error: $label ($repo_dir) is not a git checkout, can't build offline from it." >&2
exit 1
fi

local stage_dir
stage_dir="$(mktemp -d)"
STAGE_DIRS+=("$stage_dir")
git -C "$repo_dir" ls-files -z | tar -cf - --null -C "$repo_dir" -T - | tar -xf - -C "$stage_dir"
echo "$stage_dir"
}

STAGE_DIRS=()
cleanup_stage_dirs()
{
for d in "${STAGE_DIRS[@]}"; do
rm -rf "$d"
done
}
trap cleanup_stage_dirs EXIT

while [[ $# -gt 0 ]]; do
case "$1" in
-r | --ros)
ROS_DISTRO="$2"
shift 2
;;
-t | --tag)
IMAGE_TAG="$2"
shift 2
;;
-f | --force)
FORCE_BUILD=true
shift
;;
-F | --force-no-cache)
FORCE_BUILD_NO_CACHE=true
shift
;;
-h | --help)
Help
exit 0
;;
*)
echo "Invalid Option: $1"
Help
exit 1
;;
esac
done

echo "ROBOTICS_ACADEMY:-------------:local checkout ($LOCAL_ACADEMY_DIR)"
echo "ROBOTICS_INFRASTRUCTURE:------:local checkout ($LOCAL_INFRA_DIR)"
echo "ROS_DISTRO:-------------------:$ROS_DISTRO"
echo "IMAGE_TAG:--------------------:$IMAGE_TAG"
echo

if [[ $ROS_DISTRO == "humble" ]]; then
DOCKERFILE_BASE="Dockerfile.dependencies_humble"
DOCKERFILE="Dockerfile.humble.offline"
else
echo "Error: Unknown ROS_DISTRO ($ROS_DISTRO). Please set it to 'humble'."
exit 1
fi

if $FORCE_BUILD_NO_CACHE; then
NO_CACHE="--no-cache"
else
NO_CACHE=""
fi

if $FORCE_BUILD_NO_CACHE || $FORCE_BUILD || [[ "$(docker images -q jderobot/robotics-applications:dependencies-$ROS_DISTRO 2> /dev/null)" == "" ]]; then
echo "===================== BUILDING $ROS_DISTRO BASE IMAGE ====================="
echo "Building base using $DOCKERFILE_BASE for ROS $ROS_DISTRO"
docker build $NO_CACHE -f $DOCKERFILE_BASE \
--build-arg TARGETARCH=$(uname -m | sed 's/x86_64/amd64/;s/arm64/arm64/') \
-t jderobot/robotics-applications:dependencies-$ROS_DISTRO .
fi

if [ $? -eq 0 ]; then
echo "Docker Base Image Build Successful"
else
echo "Docker Base Image Build FAILED...exiting"
exit
fi

echo "===================== BUILDING $ROS_DISTRO RoboticsBackend (offline) ====================="
echo "Building RoboticsBackend using $DOCKERFILE for ROS $ROS_DISTRO"

academy_stage_dir="$(stage_local_repo "$LOCAL_ACADEMY_DIR" "RoboticsAcademy")"
infra_stage_dir="$(stage_local_repo "$LOCAL_INFRA_DIR" "RoboticsInfrastructure")"

docker build --no-cache -f $DOCKERFILE \
--build-arg IMAGE_TAG=$IMAGE_TAG \
--build-context local-academy="$academy_stage_dir" \
--build-context local-infra="$infra_stage_dir" \
-t jderobot/robotics-academy:$IMAGE_TAG .
Loading