مسیر یادگیری ROS 2  ·  کتاب آموزشی تصویری

فصل پانزدهم: Docker و CI/CD برای ROS 2

از «روی لپ‌تاپ من کار می‌کند» تا یک محصول قابل‌استقرار
پیش‌نیاز: فصل ۲ (Workspace/Package)
پروژه پیوسته: ناوگان ARCHO
ابزار: Docker، GitHub Actions
زمان مطالعه: ۱۰۰ تا ۱۲۰ دقیقه
در این فصل چه می‌خوانیم ۱۵.۱چرا Docker: «روی لپ‌تاپ من کار می‌کند» ۱۵.۲Dockerfile برای ARCHO ۱۵.۳مشکل GUI: RViz و Gazebo داخل Container ۱۵.۴Docker Compose برای اجرای کامل ۱۵.۵CI/CD: تست خودکار در هر تغییر کد ۱۵.۶پایپ‌لاین GitHub Actions کامل ۱۵.۷چه نوع تست‌هایی لازم است ۱۵.۸جمع‌بندی، واژه‌نامه و تمرین‌ها

۱۵.۱چرا Docker: «روی لپ‌تاپ من کار می‌کند»

تا اینجا هرچه برای ARCHO ساختیم، روی یک سیستم توسعه مشخص با نسخه مشخصی از Jazzy نصب شده تست شد. اما وقتی همکار دیگری بخواهد همان پروژه را اجرا کند، یا بخواهی همان کد را روی ده ARCHO مختلف مستقر کنی، یک مشکل کلاسیک ظاهر می‌شود.

⚠️ مشکل کلاسیک نرم‌افزار

«روی لپ‌تاپ من کار می‌کند» ولی «روی سیستم تو خراب است» — چون نسخه ROS، نسخه پکیج‌ها، یا حتی نسخه سیستم‌عامل فرق دارد.

📖 Docker چیست

Docker یعنی بسته‌بندی کامل محیط نرم‌افزاری پروژه — نسخه ROS، Dependencyها، Packageها و متغیرهای محیطی — داخل یک Container قابل تکرار. با Docker، محیط اجرای ARCHO دقیقاً همان است، چه روی لپ‌تاپ تو اجرا شود، چه روی کامپیوتر همکار، چه روی خود ربات.

۱۵.۲Dockerfile برای ARCHO

# Dockerfile
FROM ros:jazzy-ros-base
SHELL ["/bin/bash", "-c"]

RUN apt-get update && apt-get install -y \
    python3-colcon-common-extensions \
    ros-jazzy-navigation2 \
    ros-jazzy-nav2-bringup \
    ros-jazzy-slam-toolbox \
    ros-jazzy-robot-localization \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /archo_ws
COPY src /archo_ws/src

RUN source /opt/ros/jazzy/setup.bash && \
    colcon build --symlink-install

COPY docker/entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["bash"]
#!/bin/bash
# docker/entrypoint.sh
set -e
source /opt/ros/jazzy/setup.bash
if [ -f /archo_ws/install/setup.bash ]; then
  source /archo_ws/install/setup.bash
fi
exec "$@"

۱۵.۳مشکل GUI: RViz و Gazebo داخل Container

RViz و Gazebo (فصل ۶ و ۷) به یک Display واقعی نیاز دارند و Containerها به‌طور پیش‌فرض هیچ رابط گرافیکی ندارند. چند روش رایج برای حل این مشکل:

روشمناسب برای
X11 Forwardingلینوکس، سریع برای توسعه محلی
Wayland Forwardingدیستروهای جدیدتر لینوکس
VNCدسترسی از راه دور یا سیستم‌عامل‌های غیر لینوکس
Gazebo روی Host، Nodeها داخل Containerشروع تدریجی و ساده‌ترین حالت
🔧 توصیه برای شروع

بهترین نقطه شروع این است که Gazebo و RViz مستقیماً روی Ubuntu اجرا شوند و فقط Nodeهای پردازشی (Nav2، SLAM، Controllers) داخل Docker باشند. بعد از این‌که این ترکیب پایدار شد، می‌توانی کل سیستم را به‌تدریج کاملاً Containerized کنی — مثلاً با Dev Container در VS Code.

۱۵.۴Docker Compose برای اجرای کامل

# docker-compose.yml
services:
  archo:
    build: .
    network_mode: host
    privileged: true
    volumes:
      - /dev:/dev
    environment:
      - ROS_DOMAIN_ID=20
⚠️ network_mode: host با احتیاط

این تنظیم ارتباط DDS بین Nodeها را بسیار ساده می‌کند (چون Containerها مستقیم روی شبکه Host قرار می‌گیرند)، اما از نظر امنیت و جداسازی محیط باید آگاهانه استفاده شود — به‌خصوص روی رباتی که به شبکه بیرونی هم متصل است.

📖 جمله طلایی این بخش

Docker خود ربات را شبیه‌سازی نمی‌کند؛ محیط نرم‌افزاری آن را قابل‌تکرار، قابل‌تحویل و قابل‌استقرار می‌کند.

۱۵.۵CI/CD: تست خودکار در هر تغییر کد

معنی
CI (Continuous Integration)هر بار کد تغییر کرد: Build، Test، Lint به‌صورت خودکار اجرا شوند
CD (Continuous Delivery/Deployment)پس از تأیید CI: Package، Deploy، Release
📖 جمله طلایی این بخش

در یک ربات حرفه‌ای، تست فقط قبل از تحویل نهایی انجام نمی‌شود؛ با هر تغییر کد به‌صورت خودکار تکرار می‌شود.

۱۵.۶پایپ‌لاین GitHub Actions کامل

# .github/workflows/ros2-ci.yml
name: ROS 2 CI
on:
  push:
  pull_request:

jobs:
  build-and-test:
    runs-on: ubuntu-24.04
    container:
      image: ros:jazzy-ros-base
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        shell: bash
        run: |
          apt-get update
          apt-get install -y python3-colcon-common-extensions
          rosdep update
          rosdep install \
            --from-paths src \
            --ignore-src \
            -r -y

      - name: Build
        shell: bash
        run: |
          source /opt/ros/jazzy/setup.bash
          colcon build --event-handlers console_direct+

      - name: Test
        shell: bash
        run: |
          source /opt/ros/jazzy/setup.bash
          source install/setup.bash
          colcon test

      - name: Test results
        shell: bash
        run: |
          colcon test-result --verbose
flowchart LR A["Build موفق؟"] --> B["Test موفق؟"] --> C["Lint موفق؟"] --> D["Security Scan موفق؟"] --> E["اجازه Merge"] style E fill:#eafaf3,stroke:#0e9e6e

توجه: فایل YAML بالا فقط مراحل Build و Test را پیاده‌سازی کرده؛ مراحل Lint و Security Scan در این نمودار به‌عنوان بخش کامل یک Quality Gate واقعی نشان داده شده‌اند و اضافه‌کردنشان (مثلاً با ament_lint یا ابزارهای اسکن امنیتی) به‌عنوان تمرین باقی مانده است.

۱۵.۷چه نوع تست‌هایی لازم است

نوع تستچه چیزی را بررسی می‌کند
Unit Testیک تابع یا کلاس کوچک و مجزا
Integration Testارتباط صحیح چند Node با هم
Launch Testآیا کل سیستم بدون خطا Launch می‌شود؟
Simulation Testآیا ARCHO در Gazebo مسیر مشخص را درست طی می‌کند؟
Regression Testآیا تغییر جدید قابلیتی که قبلاً کار می‌کرد را خراب کرده؟
dev@archo:~$ docker build -t archo:jazzy . Successfully built 4a1e2c9b8f3d Successfully tagged archo:jazzy dev@archo:~$ docker compose up archo-1 | [INFO] [archo_bringup]: All nodes started successfully

۱۵.۸جمع‌بندی فصل پانزدهم

کد ARCHO حالا در یک Container قابل‌تکرار بسته‌بندی شده و هر تغییر کد به‌صورت خودکار Build، Test و بررسی می‌شود قبل از این‌که اجازه Merge بگیرد. این یعنی از این به بعد، تحویل نسخه جدید نرم‌افزار به یک ARCHO واقعی دیگر یک فرآیند دستی و پرخطا نیست.

✅ نقطه بازبینی یادگیری
  • می‌توانم توضیح دهم Docker چه مشکلی را دقیقاً حل می‌کند.
  • می‌دانم چرا اجرای RViz و Gazebo داخل Container چالش‌برانگیز است و چند راه‌حل رایج آن را نام ببرم.
  • می‌توانم تفاوت CI و CD را توضیح دهم.
  • می‌دانم پنج نوع تست رایج در پروژه‌های ROS 2 حرفه‌ای چیست.
🌍 ارتباط با پروژه اصلی

پروژه ARCHO اکنون یک Dockerfile و Docker Compose کامل برای بسته‌بندی نرم‌افزار دارد و هر Commit جدید به‌طور خودکار در GitHub Actions Build و Test می‌شود.

فصل بعد چه چیزی اضافه می‌کند

در فصل شانزدهم از دنیای نرم‌افزار خارج می‌شویم و به سراغ سخت‌افزار کامپیوتری خود ARCHO می‌رویم: Jetson، Raspberry Pi و ESP32 — و این‌که هرکدام برای چه نوع پردازشی مناسب‌اند.

واژه‌نامه فصل پانزدهم

Docker
ابزار بسته‌بندی محیط نرم‌افزاری در قالب Containerهای قابل تکرار.
Container
محیط اجرای ایزوله و سبک‌وزن که شامل تمام Dependencyهای لازم برنامه است.
Dockerfile
فایل متنی که مراحل ساخت یک Image داکر را تعریف می‌کند.
Docker Compose
ابزاری برای تعریف و اجرای هم‌زمان چند Container مرتبط.
CI (Continuous Integration)
فرآیند خودکار Build و Test کد با هر تغییر.
CD (Continuous Delivery/Deployment)
فرآیند خودکار بسته‌بندی و انتشار نسخه جدید پس از تأیید CI.
Quality Gate
مجموعه شرایطی (Build، Test، Lint، Security) که باید قبل از Merge برقرار باشند.

خطاهای رایج فصل پانزدهم — جمع‌بندی