Scotty: جایگزین مدرن Laravel Envoy از Spatie
خلاصهٔ کاملتر
Spatie که به خاطر پکیجهای محبوبش در اکوسیستم لاراول شناخته شده، در ۳۰ مارس ۲۰۲۶ ابزار جدیدی به اسم Scotty منتشر کرد. Scotty یه SSH task runner هست که همون کاری رو میکنه که Laravel Envoy میکنه، یعنی اجرای اسکریپتهای دیپلوی روی سرورهای ریموت. ولی با دو تفاوت مهم: سینتکس plain bash به جای قالبهای Blade، و خروجی ترمینال خیلی بهتر.
مشکل اصلی Laravel Envoy اینه که فایل Envoy.blade.php یه فرمت ترکیبی نهPHP-نهbash داره. ادیتور شما اون رو نه بهدرستی PHP میبینه نه shell. ابزارهایی مثل shellcheck نمیتونن lintاش کنن و autocompletion درست کار نمیکنه. از طرفی، خروجی Envoy حین اجرا فقط یه جریان ساده از متنه؛ بدون شمارنده مرحله، بدون زمان هر تسک، بدون خلاصه نهایی.
Scotty هر دو این مشکلها رو حل میکنه. فایل اسکریپت شما یه Scotty.sh معمولیه با shebang مخصوص. تسکها همون توابع bash هستن و تنظیمات سرور و ماکروها با کامنتهای annotation مشخص میشن:
#!/usr/bin/env scotty
# @servers [email protected]
# @macro deploy pullCode runComposer runMigrations clearCaches restartWorkers
APP_DIR="/var/www/my-app"
BRANCH="${BRANCH:-main}"
# @task on:remote
pullCode() {
cd $APP_DIR
git pull origin $BRANCH
}
# @task on:remote
runComposer() {
cd $APP_DIR
composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev
}همونطور که میبینی، BRANCH="${BRANCH:-main}" خالص bash هست. نه interpolation بلیدی، نه سینتکس عجیب. ادیتور درستش highlight میکنه و shellcheck میتونه lintاش کنه.
از نظر خروجی ترمینال هم Scotty حین اجرا اسم هر تسک، شماره مرحله، زمان سپریشده و دستور جاری رو نشون میده. وقتی همه چیز تموم شد یه جدول خلاصه میگیری که مدت هر مرحله رو نشون میده. این برای دیپلویهای دو دقیقهای خیلی مهمه.
یه ویژگی جالب دیگه اینه که میتونی حین اجرا دکمه p بزنی و Scotty بعد از اتمام تسک جاری صبر میکنه. با Enter دوباره ادامه میده. این pause/resume موقع دیپلوی hotfix ساعت ۱۱ شب که یه چیز مشکوک میبینی، واقعاً مفیده.
دستور scotty doctor هم یه پیشاز-دیپلوی چک کامل انجام میده: فایل Scotty.sh رو validate میکنه، SSH به هر سرور رو تست میکنه، و بررسی میکنه که PHP، Composer و Git روی ماشین ریموت نصبن. حالت --pretend هم بدون اینکه واقعاً به چیزی وصل بشه، تمام دستورات SSH رو چاپ میکنه تا منطق اسکریپتت رو تأیید کنی.
برای مهاجرت از Envoy هم جالبه بدونی که Scotty فایلهای Envoy.blade.php رو out of the box میخونه. پس نیازی نیست فوری همه چیز رو بازنویسی کنی. وقتی آماده شدی، مهاجرت سادهست: @servers میشه کامنت، @story میشه @macro، و هر @task تبدیل به یه تابع bash میشه.
یکی از بهترین کاربردهای Scotty، دیپلوی zero-downtime هست. الگویی که Spatie در داکیومنتیشن کامل ارائه داده اینه که هر release در یه دایرکتوری timestamped جدید کپی میشه و در پایان فقط یه symlink بهصورت atomic جابجا میشه. اگه Composer خطا بده یا migration خراب بشه، symlink current هنوز به آخرین release سالم اشاره میکنه و کاربرا هیچ چیزی نمیبینن.
نکات کلیدی:
- Scotty جایگزین Laravel Envoy هست ولی با سینتکس plain bash به جای Blade
- فایل Scotty.sh با ابزارهای معمول مثل shellcheck قابل lint و توسط ادیتور قابل highlightه
- خروجی ترمینال شامل شمارنده مرحله، زمان هر تسک و جدول خلاصه نهایی میشه
- قابلیت pause/resume حین اجرای دیپلوی با دکمه p وجود داره
- scotty doctor پیش از دیپلوی اتصال SSH و ابزارهای ریموت رو چک میکنه
- حالت --pretend بدون اتصال واقعی، دستورات رو شبیهسازی میکنه
- Scotty فایلهای Envoy موجود رو هم میخونه، پس مهاجرت تدریجیه
- الگوی zero-downtime با symlink اتمیک در داکیومنتیشن رسمی وجود داره




