عنوان:

‫مرور کد محلی با Docker و smollm2 پیش از ارسال به گیت


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۱۳ ۱۰:۴۳
آدرس: www.dntips.ir
این مقاله به معرفی یک رویکرد ابتکاری برای بازبینی کد (code review) با استفاده از هوش مصنوعی (AI) به صورت محلی و پیش از ارسال تغییرات به گیت (Git) می‌پردازد. این روش، فرآیند بازبینی را به طور کامل روی ماشین توسعه‌دهنده و بدون نیاز به اتصال به اینترنت یا کلیدهای API انجام می‌دهد، که بازخورد سریع و خصوصی را تضمین می‌کند. هدف اصلی این مقاله، توانمندسازی توسعه‌دهندگان برای ادغام یک مرحله بازبینی خودکار مبتنی بر مدل‌های زبان بزرگ (LLM) در چرخه توسعه خود است.

ساختار و پیش‌نیازهای پیاده‌سازی
این سیستم بر پایه یک هوک پیش از ارسال (pre-push hook) گیت ساخته شده است. این هوک، اسکریپتی را پیش از هر عملیات git push اجرا می‌کند. برای پیاده‌سازی این سیستم، پیش‌نیازهای زیر لازم است:
  • داکر (Docker) نصب شده با پشتیبانی از اجرای مدل (docker model run).
  • گیت در پروژه شما مقداردهی اولیه شده باشد.
  • دانش پایه در زمینه اسکریپت‌نویسی یونیکس/لینوکس (Unix/Linux shell scripting).

گام به گام: ایجاد هوک Git Pre-Push
نخستین گام، ایجاد هوک pre-push در دایرکتوری پروژه است. این کار با ساخت پوشه scripts و فایل pre-push در مسیر .git/hooks/ انجام می‌شود. فایل pre-push باید دارای مجوز اجرایی (chmod +x) باشد و اسکریپت bash scripts/review_with_model.sh را اجرا کند. این تنظیم تضمین می‌کند که هر بار که توسعه‌دهنده تلاش به git push می‌کند، کد او از طریق فرآیند بازبینی محلی مدل عبور کند. در صورت وجود هرگونه مشکل در بازبینی، فرآیند push متوقف می‌شود و پیام خطا نمایش داده می‌شود.

اسکریپت بازبینی کد با هوش مصنوعی
بخش اصلی این سیستم، اسکریپتی به نام review_with_model.sh است که تعامل با مدل هوش مصنوعی را مدیریت می‌کند. این اسکریپت وظایف زیر را بر عهده دارد:
  • دریافت تغییرات مرحله‌بندی شده (staged changes): با استفاده از دستور git diff --cached، تغییراتی که برای ارسال آماده شده‌اند، استخراج می‌شوند. اگر هیچ تغییری وجود نداشته باشد، اسکریپت با پیامی مبنی بر عدم وجود تغییرات، خاتمه می‌یابد.
  • ایجاد پرامپت (Prompt): یک پرامپت متنی برای مدل هوش مصنوعی ایجاد می‌شود. این پرامپت، مدل را به عنوان یک مهندس نرم‌افزار ارشد (senior software engineer) تعریف می‌کند و از آن می‌خواهد که دیف گیت (git diff) را با دقت بررسی کرده و بهبودها، نگرانی‌های امنیتی یا باگ‌های احتمالی را پیشنهاد دهد.
  • فراخوانی مدل: اسکریپت ابتدا بررسی می‌کند که آیا مدل ai/smollm2:360M-Q4_K_M در دسترس است یا خیر، و در صورت نیاز آن را از طریق docker model pull دریافت می‌کند. سپس، پرامپت ایجاد شده به عنوان ورودی به docker model run ai/smollm2:360M-Q4_K_M ارسال می‌شود تا بازبینی کد انجام شود. مدل smollm2 به دلیل حجم کم (حدود ۳۶۰ مگابایت) و سرعت بالا، برای بازبینی‌های ساده کد مناسب است، اما می‌توان آن را با مدل‌های بزرگ‌تر مانند llama3 یا phi3 جایگزین کرد.

آزمایش و خروجی نمونه
پس از تنظیمات، توسعه‌دهنده می‌تواند با ایجاد یک تغییر کد (مثلاً اضافه کردن print('Hello world!') به یک فایل پایتون)، مرحله‌بندی آن (git add) و سپس تلاش برای git push، سیستم را آزمایش کند. در این مرحله، هوک pre-push فعال شده و مدل شروع به بازبینی تغییرات در ترمینال می‌کند. خروجی نمونه شامل پیشنهاداتی مانند "پیچیدن دستور print در یک تابع main()"، "اضافه کردن خط shebang" یا "استفاده از logging به جای print برای کد تولید" خواهد بود.

مسدودسازی بر اساس مسائل بحرانی
مقاله همچنین یک قابلیت اختیاری را برای مسدود کردن فرآیند push در صورت شناسایی مسائل حیاتی توسط مدل ارائه می‌دهد. این کار با دریافت خروجی مدل (REVIEW_OUTPUT) و سپس اسکن آن برای کلمات کلیدی مانند "bug" (باگ)، "security" (امنیت) یا "vulnerability" (آسیب‌پذیری) انجام می‌شود. در صورت تشخیص چنین کلماتی، اسکریپت با کد خطا خارج شده و push را لغو می‌کند.

محدودیت‌ها و ملاحظات نهایی
با وجود مزایای فراوان، این راه‌اندازی دارای محدودیت‌هایی است:
  • مدل smollm2: به دلیل اندازه کوچک، برای بازبینی‌های سبک مناسب است و نه بازسازی‌های عمیق (deep refactoring).
  • محدودیت زمینه: مدل تنها روی دیف‌ها کار می‌کند و زمینه کامل پروژه را ندارد.
  • حساسیت به کیفیت پرامپت: کیفیت بازبینی به میزان زیادی به کیفیت و دقت پرامپت ارائه شده وابسته است.

این تنظیمات، یک دستیار بازبینی کد (code review assistant) را فراهم می‌کند که حریم خصوصی را حفظ کرده، قابل تکرار است و اولویت با اجرای محلی دارد. این سیستم جایگزین بازبینی انسانی نیست، بلکه مکملی قدرتمند برای شناسایی زودهنگام مشکلات و ایجاد عادت‌های توسعه بهتر است. هسته اصلی این فرآیند ساده است: دیف گیت (Git Diff) ⬅️ پرامپت (Prompt) ⬅️ مدل (Model) ⬅️ بازخورد (Feedback) ⬅️ کد بهتر (Better Code).


مشاهده مطلب اصلی