لینیر چطور CI رو از حالت گلوگاه درآورد
خلاصهٔ کاملتر
Mufeez Amjad از تیم لینیر تعریف میکنه که اوایل امسال CTO شرکت یه تسک به اسم «هزینهٔ CI بالاست» بهش داده و در ضمن خواسته CI سریعتر هم بشه. حرف اصلی مقاله اینه که ایجنتها سرعت نوشتن کد رو چند برابر کردن ولی هر PR هنوز باید از CI رد بشه، پس CI تبدیل به گلوگاه میشه. تیم روی دو تا معیار تمرکز کرد: هر PR چقدر منتظر CI میمونه و چقدر runner-time مصرف میکنه.
اولین بردها تقریباً بدون دست زدن به خود CI به دست اومد. جابهجا شدن از GitHub Actions به رانرهای شخص ثالث با CPU سریعتر و کش بهتر، جابها رو بهطور میانگین ۳۴٪ سریعتر کرد و tsc رو ۵۲٪. سوییچ به tsgo، یعنی کامپایلر نیتیو تایپاسکریپت، میانهٔ هفتگی چک tsc رو ۷۳٪ پایین آورد. بازنویسی رولهای لینت روی AST تا دیگه به اطلاعات تایپ نیاز نداشته باشن، لینت API رو ۶۸٪ و لینت کل ریپو رو ۵۵٪ کم کرد و مهاجرت بعدی به Oxlint رو هم راحت کرد.
بعد نوبت به جابهای کوچیکی رسید که جلوی بقیه وایمیستادن. جابهای change-detection کل working tree رو چکاوت میکردن درحالیکه فقط به بخش کوچیکی ازش نیاز داشتن؛ با محدود کردن fetch depth، کندترینشون از ۹۴ ثانیه به ۲۰ ثانیه رسید. actions/checkout هم با یه اکشن خودشون جایگزین شد که با backoff دوباره تلاش میکنه و با GIT_HTTP_LOW_SPEED_LIMIT و GIT_HTTP_LOW_SPEED_TIME کانکشن گیرکرده رو بعد حدود ۳۰ ثانیه قطع میکنه بهجای اینکه تا آخر هنگ بمونه.
قدم بعدی حذف راهاندازی تکراری بود. کلاینت Postgres بهجای نصب با apt تو هر شارد، رفت داخل ایمیج پایهٔ CI. نصب pnpm هم بهجای کل monorepo فقط محدود شد به پکیج API و وابستههاش و از ۴۴ تا ۷۳ ثانیه رسید به ۱۶ تا ۱۸ ثانیه. کش کردن node_modules رو هم کلاً کنار گذاشتن، چون حتی وقتی کش میخورد ۲۸ ثانیه طول میکشید ولی نصب فیلترشده حدود ۷.۵ ثانیه بود. جمع این سه تا، setup هر شارد رو حدود ۴۴٪ کم کرد و از ۱۱۰-۱۴۰ ثانیه رسوندش به ۶۷-۷۳ ثانیه.
بزرگترین صرفهجوییها هم از همین جنس بود: بهجای ریپلی کل تاریخچهٔ مایگریشن دیتابیس تو هر ران، یه اسنپشات اسکیما لود میشه و راهاندازی دیتابیس از حدود ۱۲ ثانیه به ۱ تا ۲ ثانیه رسید. هفت تا چک کوچیک که هرکدوم جدا رانر میگرفتن هم تو دو تا جاب ادغام شدن و بهصورت همزمان اجرا میشن، که بر اساس مصرف ژوئن ماهی حدود ۸۷٬۰۰۰ دقیقهٔ رانر یعنی ۱۱.۸٪ کل مصرف CI رو آزاد کرد.
آخرین بخش، خود اجرای تستهاست. Vitest کار رو بر اساس فایل پخش میکنه نه مدت تکتک تستها، پس چند فایل بزرگ کل یه شارد رو عقب میانداختن؛ تیم اون فایلها رو شکست و از چهار شارد به هشت رفت، که جاب بحرانی رو حدود ۱۹٪ سریعتر و ارزونتر کرد. بزرگترین تکبهبود اما isolate: false تو vitest بود که به فایلهای امن اجازه میده module registry مشترک داشته باشن: کندترین شارد از ۳۰۰-۳۷۹ ثانیه به حدود ۱۹۵ ثانیه رسید. ریسکش بالا بود، پس هر فایل باید با کامنت opt-in کنه و skill ایجنتها هم آپدیت شد.
نکات کلیدی:
- مهاجرت از GitHub Actions به رانرهای شخص ثالث جابها رو بهطور میانگین ۳۴٪ سریعتر کرد
- کامپایلر نیتیو tsgo میانهٔ هفتگی چک tsc رو ۷۳٪ کم کرد
- محدود کردن نصب pnpm به پکیج API، نصب رو از ۴۴-۷۳ ثانیه به ۱۶-۱۸ ثانیه رسوند
- ادغام هفت چک کوتاه تو دو جاب ماهی حدود ۸۷٬۰۰۰ دقیقهٔ رانر، معادل ۱۱.۸٪ مصرف کل، صرفهجویی کرد
- isolate: false تو Vitest حدود ۱۷٪ صرفهجویی ماهانه آورد و پرریسکترین تغییر هم بود
- لینیر هفتهای حدود ۲٬۰۰۰ تست جدید اضافه میکنه؛ بدون این کارها تستها الان حدود ۱۱ دقیقه طول میکشید




