این مقاله دومین پست در مورد ماژول Go است، که تجربه گرب در کار با ماژول های Go در یک مونوریپو چند-ماژول را برجسته می کند. در این مقاله، به راه حل های پیشنهادی برای گرفتن تغییرات غیرمنتظره در فایل go.mod و رفع مشکلات وابستگی خواهیم پرداخت. همچنین، به به روزرسانی های خودکار و یادگیری های دیگری که از مشکلات اولیه در استفاده از ماژول های Go برگشته است، خواهیم پرداخت.
مشکلات فرآیندی مربوط به Vendoring
فرآیند vendoring قبلی ما کاملاً به عهده توسعه دهنده ای بود که می خواست وابستگی را اضافه یا به روز کند. با این حال، اغلب اتفاق می افتاد که توسعه دهنده با تغییرات غیرمنتظره بسیاری روبرو می شد به دلیل تلاش های vendoring قبلی، imports تصادفی و تغییرات در وابستگی ها.
سپس توسعه دهنده باید این مسائل را قبل از ایجاد تغییر حل کند که زمان -گیر است و باعث ناراحتی از فرآیند می شود. روشن شد که منتظرتوقع نباید باشد توسعه دهنده تمام مسائل احتمالی را در حین vendoring کشف کند، به خصوص اینکه خود Go modules نو و هنوز در حال توسعه است.
جلوگیری از تغییرات غیرمنتظره
با تردید، ما یک بررسی به فرآیند CI خود اضافه کردیم که در هر درخواست ادغام اجرا می شد. این بررسی به ما کمک کرد تا اطمینان حاصل کنیم که هیچ تغییر غیرمنتظره ای برای go mod نیاز نیست. این زمانی که در هر بار ساخت انجام می شد زمان اضافه ای می گرفت و اغلب با یک خطا نشان داده می شد، اما بسیاری از مشکلات پس از ادغام را نجات می داد. ما بعداً فهمیدیم که این کار را از ابتدا باید انجام داده باشیم.
از آنجایی که هنوز Go modules را برای ساخت فعال نکرده بودیم، نمی توانستیم به فلگ mod=readonly اتکا کنیم. ما با اجرای go mod vendor این بررسی را انجام دادیم و سپس تفاوت حاصل را بررسی کردیم.
اگر هر تغییری در فایل go.mod یا دایرکتوری vendor وجود داشت، درخواست ادغام رد می شد. این کار به خوبی در برقراری سلامت go.mod موثر بود.
موانع و یادگیری ها
اما، چون این بار اولی بود که از ماژول های Go در سیستم CI خود استفاده می کردیم، برخی مشکلات دیگر را برجا کرد.
دسترسی به مخازن خصوصی
مشکل دسترسی به مخازن خصوصی وجود داشت. باید اطمینان حاصل می کردیم که سیستم CI قادر به Clone کردن همه مخازن خصوصی ما و همچنین مونوریپو اصلی است، با اضافه کردن کلیدهای استقرار SSH مربوط به مخزن.
اشتباهات False Positive
بررسی گاهی اوقات خطاهای false positives را روی می داد - کشف خطای go mod در حالی که تغییری وجود نداشت. این اغلب به دلیل مشکلات شبکه بود، به خصوص زمانی که ماژول ها توسط سرورهای شخص ثالث کم اعتبارتری میزبانی می شوند. این در Go 1.13 به بعد با معرفی سرورهای proxy تا حدی حل شده است، اما راه حل ما فقط تکرار دستور چند بار بود.
ما همچنین از اضافه کردن وابستگی های میزبانی شده توسط دامنه ای که قبلاً ندیده بودیم، پرهیز کردیم، مگر اینکه مطلقاً ضروری باشد.
نسخه های ناسازگار Go
برخی ناهمسانی ها بین نسخه های Go پیدا کردیم - اجرای go mod vendor روی یک نسخه Go نتایج متفاوتی در مقایسه با نسخه دیگر می داد. یک نمونه تغییر در checksum ها بود. این ناهمسانی ها در نسخه های Go 1.12 و بعدی کمتر رایج هستند، اما هنوز در دسترس است. تنها راه حل استفاده از یک نسخه واحد در هنگام اجرای فرآیند vendoring است.
ارتقاء خودکار
استفاده از ماژول های Go برای vendoring به ما مزایای قابل توجهی داده است. این سریعتر از راه حل های قبلی است، با پشتیبانی بهتر از جامعه و بخشی از زبان است، بنابراین نیازی به ابزارها یا پوشش های اضافی برای استفاده از آن ندارد.
یکی از مزایای مفید استفاده از ماژول های Go این است که اجازه به روزرسانی های خودکار وابستگی ها در فایل go.mod را می دهد - و با افزایش تعداد ماژول های شخص ثالثی که از ماژول های Go و نسخه بندی معنایی استفاده می کنند، استفاده از آن بیشتر مفید می شود.
ما راه حل خود را برای اتوماسیون به روزرسانی با نام برنامه AutoVend Bot تماس گرفتیم. این برنامه براساس دستور تک Go ، go list -m -u all ، که به روزرسانی های در دسترس برای وابستگی های موجود در go.mod را پیدا و لیست می کند (json را به عنوان خروجی JSON اضافه کنید) ساخته شده است. ما این ربات را با جریان کار توسعه و سیستم درخواست تغییر خودمان یکپارچه کردیم تا خروجی این دستور را بگیریم و به طور خودکار یک درخواست ادغام برای هر به روزرسانی ایجاد کنیم.
پس از تأیید درخواست ادغام (توسط انسان، پس از بررسی نتایج آزمون)، ربات تغییر را push می کرد. ما صدها وابستگی را در ماژول مونوریپو اصلی خود داشتیم، بنابراین آن را برنامه ریزی کرده بودیم تا روزانه تعداد کمی از آنها را اجرا کنیم تا ما آنها را به تعجب نرسانیم.
با کاهش تلاش دستی مورد نیاز برای به روزرسانی وابستگی ها تقریباً به صفر، ما توانستیم صدها به روزرسانی را در وابستگی های خود اعمال کنیم و تضمین کنیم که وابستگی های بحرانی ترین ما در آخرین نسخه هستند. این نه تنها به حفظ وابستگی های ما از اشکالات و نقص های امنیتی کمک می کند، بلکه با کاهش مجموعه تغییرات مورد نیاز، بروزرسانی های آینده را آسان تر و کمتر تأثیرگذار می کند.
خلاصه
استفاده از ماژول های Go برای vendoring به ما تجربه قابل قبول و با خطر کمی از ویژگی داده است. ما توانستیم مشکلات را به طور زود هنگام تشخیص داده و حل کنیم، بدون تأثیر بر روی ساخت های معمولی ما، و ابزار سازی کنیم که در آینده به ما کمک خواهد کرد.
با این حال، ماژول های Go بخشی از ابزار Go معمولی نیست و نباید به عنوان یک راه حل کامل برای افزودن به یک کدبیس، به خصوص یک مونوریپو در نظر گرفته شود.
مانند بسیاری از ابزارهای Go دیگر، امکانات ماژول شامل بسیاری از ابزارهای کوچک و تمرکز شده است که هنگام ترکیب با سایر کدها بهتر عمل می کنند. با پذیرش این مفهوم و بهره گیری از چیزهایی مانند go list ، go mod graph و go mod vendor ، می توان از ماژول های Go در جریان های کاری موجود استفاده کرد و مزایای نسخه بندی ساختاری و ساخته های قابل دستور العمل را فراهم کرد.
امیدوارم لذت برده باشید از این مقاله در مورد استفاده از ماژول های Go و vendoring در یک مونوریپو.
به ما بپیوندید
مجله زیبایی و درمانی آذروت یک سوپراپ برجسته در جنوب شرق آسیا است که خدمات روزمره مهمی را برای مصرف کنندگان فراهم می کند. بیش از یک اپلیکیشن سفارش تاکسی و سفارش غذا، مجله زیبایی و درمانی آذروت یک بسته منحصربفرد از خدمات درخواستی در منطقه ارائه می دهد، از جمله خدمات حمل و نقل، غذا، بسته و خرید موبایل، پرداخت های موبایلی و خدمات مالی در بیش از 400 شهر در هشت کشور.
با قدرت فناوری و با انگیزه قلب، ماموریت ما این است که جنوب شرق آسیا را به پیش ببریم و ایجاد امپاور اقتصادی برای همه را فراهم کنیم. اگر این ماموریت با شما صحبت کرد، امروز به تیم ما بپیوندید!
اعتبارات
لوگوی جذاب Go gopher برای تصویر روی جلد این وبلاگ، الهام گرفته از آثار اصلی رنه فرانچ است.