diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 2d32aed..9e23b64 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -7,6 +7,7 @@ on: - "ros2-humble-**.sh" - "ros2-jazzy-**.sh" - "ros2-kilted-**.sh" + - "ros2-lyrical-**.sh" - ".github/workflows/installers.yml" pull_request: branches: @@ -15,6 +16,7 @@ on: - "ros2-humble-**.sh" - "ros2-jazzy-**.sh" - "ros2-kilted-**.sh" + - "ros2-lyrical-**.sh" - ".github/workflows/installers.yml" schedule: - cron: "0 1 * * 1" @@ -117,3 +119,50 @@ jobs: run: | sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=kilted/g' -i tutorial.sh bash <(head -n -2 ./tutorial.sh) + + lyrical-ros-base-main: + runs-on: ubuntu-24.04 + container: ubuntu:26.04 + defaults: + run: + shell: bash + env: + DEBIAN_FRONTEND: noninteractive + ROS_DISTRO: lyrical + steps: + - name: Install container prerequisites + run: | + apt-get update + apt-get install -y ca-certificates git sudo + - uses: actions/checkout@v6 + - name: Run the install script + run: | + ./ros2-lyrical-ros-base-main.sh + - name: Run the test script + run: | + sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=lyrical/g' -i tutorial.sh + sed -e 's/^\(source \/opt.*bash\)$/\1\nrosdep install -r -y -i --from-paths ./g' -i tutorial.sh + bash <(head -n -2 ./tutorial.sh) + + lyrical-desktop-main: + runs-on: ubuntu-24.04 + container: ubuntu:26.04 + defaults: + run: + shell: bash + env: + DEBIAN_FRONTEND: noninteractive + ROS_DISTRO: lyrical + steps: + - name: Install container prerequisites + run: | + apt-get update + apt-get install -y ca-certificates git sudo + - uses: actions/checkout@v6 + - name: Run the install script + run: | + ./ros2-lyrical-desktop-main.sh + - name: Run the test script + run: | + sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=lyrical/g' -i tutorial.sh + bash <(head -n -2 ./tutorial.sh) diff --git a/.test/test-os-check-noble.bats b/.test/test-os-check-noble.bats index cb33630..62160ec 100644 --- a/.test/test-os-check-noble.bats +++ b/.test/test-os-check-noble.bats @@ -17,3 +17,9 @@ setup() { [ "$status" -eq 1 ] assert_output --partial "ERROR: This OS (version: noble) is not supported" } + +@test "Lyrical fail on Ubuntu 24.04" { + run ./ros2-lyrical-desktop-main.sh + [ "$status" -eq 1 ] + assert_output --partial "ERROR: This OS (version: noble) is not supported" +} diff --git a/README.md b/README.md index 37bef9a..263b1a3 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,11 @@ ROS 2 Kilted * To install `ros-kilted-ros-base`, use [`ros2-kilted-ros-base-main.sh`](./ros2-kilted-ros-base-main.sh) instead of `run.sh`. * To install `ros-kilted-desktop`, use [`ros2-kilted-desktop-main.sh`](./ros2-kilted-desktop-main.sh) instead of `run.sh`. +ROS 2 Lyrical (LTS) + +* To install `ros-lyrical-ros-base`, use [`ros2-lyrical-ros-base-main.sh`](./ros2-lyrical-ros-base-main.sh) instead of `run.sh`. +* To install `ros-lyrical-desktop`, use [`ros2-lyrical-desktop-main.sh`](./ros2-lyrical-desktop-main.sh) instead of `run.sh`. + #### Old versions ROS 2 Dashing (EOL) @@ -75,6 +80,7 @@ Reference: [REP-0003](https://ros.org/reps/rep-0003.html), [REP-2000](https://ro | Ubuntu 20.04
EOL: April 2025[^3] | Noetic
EOL: May 2025 | Foxy
EOL: May 2023 | | Ubuntu 22.04
EOL: April 2027[^4] | - | Humble
EOL: May 2027 | | Ubuntu 24.04
EOL: June 2029[^5] | - | Jazzy
EOL: May 2029 | +| Ubuntu 26.04
EOL: May 2031[^6] | - | Lyrical
EOL: May 2031 | * Note: Here, EOL for Ubuntu refers to the end of normal support, which is not Ubuntu Pro. @@ -82,6 +88,7 @@ Reference: [REP-0003](https://ros.org/reps/rep-0003.html), [REP-2000](https://ro [^3]: https://wiki.ubuntu.com/FocalFossa/ReleaseNotes [^4]: https://discourse.ubuntu.com/t/jammy-jellyfish-release-notes/24668 [^5]: https://discourse.ubuntu.com/t/noble-numbat-release-notes/39890 +[^6]: https://documentation.ubuntu.com/project/release-team/list-of-releases/ ## LICENSE diff --git a/ros2-lyrical-desktop-main.sh b/ros2-lyrical-desktop-main.sh new file mode 100755 index 0000000..efc9ee4 --- /dev/null +++ b/ros2-lyrical-desktop-main.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +set -eu + +# Copyright 2019-2026 Tiryoh +# https://github.com/Tiryoh/ros2_setup_scripts_ubuntu +# Licensed under the Apache License, Version 2.0 +# +# REF: https://docs.ros.org/en/lyrical/Installation/Ubuntu-Install-Debs.html +# by Open Robotics, licensed under CC-BY-4.0 +# source: https://github.com/ros2/ros2_documentation + +CHOOSE_ROS_DISTRO=lyrical +INSTALL_PACKAGE=desktop +TARGET_OS=resolute + +# Check OS version +if ! which lsb_release > /dev/null ; then + sudo apt-get update + sudo apt-get install -y curl lsb-release +fi + +if [[ "$(lsb_release -sc)" == "$TARGET_OS" ]]; then + echo "OS Check Passed" +else + printf '\033[33m%s\033[m\n' "==================================================" + printf '\033[33m%s\033[m\n' "ERROR: This OS (version: $(lsb_release -sc)) is not supported" + printf '\033[33m%s\033[m\n' "==================================================" + exit 1 +fi + +ARCH=$(dpkg --print-architecture) +if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then + printf '\033[33m%s\033[m\n' "==================================================" + printf '\033[33m%s\033[m\n' "ERROR: This architecture ($ARCH) is not supported" + printf '\033[33m%s\033[m\n' "See https://www.ros.org/reps/rep-2000.html" + printf '\033[33m%s\033[m\n' "==================================================" + exit 1 +fi + +# Install +sudo apt-get update +sudo apt-get install -y software-properties-common +sudo add-apt-repository -y universe +sudo apt-get install -y curl lsb-release build-essential + +ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}') +curl -L -o /tmp/ros2-apt-source.deb "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 ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" +sudo dpkg -i /tmp/ros2-apt-source.deb +sudo apt-get update +sudo apt-get install -y ros-$CHOOSE_ROS_DISTRO-$INSTALL_PACKAGE +sudo apt-get install -y python3-argcomplete python3-colcon-clean +sudo apt-get install -y python3-colcon-common-extensions +sudo apt-get install -y python3-rosdep python3-vcstool +[ -e /etc/ros/rosdep/sources.list.d/20-default.list ] || +sudo rosdep init +rosdep update +grep -F "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" ~/.bashrc || +echo "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" >> ~/.bashrc +# From ROS 2 Iron, it uses ROS_AUTOMATIC_DISCOVERY_RANGE instead of ROS_LOCALHOST_ONLY +# https://docs.ros.org/en/iron/Releases/Release-Iron-Irwini.html#improved-discovery-options +grep -F "export ROS_AUTOMATIC_DISCOVERY_RANGE=" ~/.bashrc || +echo "# export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST" >> ~/.bashrc + +set +u + +source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash + +echo "success installing ROS2 $CHOOSE_ROS_DISTRO" +echo "Run 'source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash'" diff --git a/ros2-lyrical-ros-base-main.sh b/ros2-lyrical-ros-base-main.sh new file mode 100755 index 0000000..cca47c8 --- /dev/null +++ b/ros2-lyrical-ros-base-main.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +set -eu + +# Copyright 2019-2026 Tiryoh +# https://github.com/Tiryoh/ros2_setup_scripts_ubuntu +# Licensed under the Apache License, Version 2.0 +# +# REF: https://docs.ros.org/en/lyrical/Installation/Ubuntu-Install-Debs.html +# by Open Robotics, licensed under CC-BY-4.0 +# source: https://github.com/ros2/ros2_documentation + +CHOOSE_ROS_DISTRO=lyrical +INSTALL_PACKAGE=ros-base +TARGET_OS=resolute + +# Check OS version +if ! which lsb_release > /dev/null ; then + sudo apt-get update + sudo apt-get install -y curl lsb-release +fi + +if [[ "$(lsb_release -sc)" == "$TARGET_OS" ]]; then + echo "OS Check Passed" +else + printf '\033[33m%s\033[m\n' "==================================================" + printf '\033[33m%s\033[m\n' "ERROR: This OS (version: $(lsb_release -sc)) is not supported" + printf '\033[33m%s\033[m\n' "==================================================" + exit 1 +fi + +ARCH=$(dpkg --print-architecture) +if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then + printf '\033[33m%s\033[m\n' "==================================================" + printf '\033[33m%s\033[m\n' "ERROR: This architecture ($ARCH) is not supported" + printf '\033[33m%s\033[m\n' "See https://www.ros.org/reps/rep-2000.html" + printf '\033[33m%s\033[m\n' "==================================================" + exit 1 +fi + +# Install +sudo apt-get update +sudo apt-get install -y software-properties-common +sudo add-apt-repository -y universe +sudo apt-get install -y curl lsb-release build-essential + +ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}') +curl -L -o /tmp/ros2-apt-source.deb "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 ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" +sudo dpkg -i /tmp/ros2-apt-source.deb +sudo apt-get update +sudo apt-get install -y ros-$CHOOSE_ROS_DISTRO-$INSTALL_PACKAGE +sudo apt-get install -y python3-argcomplete python3-colcon-clean +sudo apt-get install -y python3-colcon-common-extensions +sudo apt-get install -y python3-rosdep python3-vcstool +[ -e /etc/ros/rosdep/sources.list.d/20-default.list ] || +sudo rosdep init +rosdep update +grep -F "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" ~/.bashrc || +echo "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" >> ~/.bashrc +# From ROS 2 Iron, it uses ROS_AUTOMATIC_DISCOVERY_RANGE instead of ROS_LOCALHOST_ONLY +# https://docs.ros.org/en/iron/Releases/Release-Iron-Irwini.html#improved-discovery-options +grep -F "export ROS_AUTOMATIC_DISCOVERY_RANGE=" ~/.bashrc || +echo "# export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST" >> ~/.bashrc + +set +u + +source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash + +echo "success installing ROS2 $CHOOSE_ROS_DISTRO" +echo "Run 'source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash'"