اگر شما هم در زمینهٔ تولید نرمافزار فعالیت داشته باشید، ممکن است آگهیهای استخدام مهندس DevOps نظر شما را به خود جلب نموده یا حداقل سبب شده باشند تا از خود یا اطرافیان بپرسید که DevOps چیست و یک مهندس DevOps چه کاری انجام میدهد؟ و این همان چیزی است که در این این مقاله قصد داریم به بررسیاش بپردازیم.
براساس تعریف ویکیپدیا:
DevOps یک فرایند تولید نرمافزار است که بر مبنای ارتباط و همکاری هرچه بیشتر میان تیمهای تولید و توسعهٔ نرمافزار و تیمهای اجرایی بنا شده است؛ در طی این فرآیند، عملیاتی مانند Integration ،Testing و Deployment و همچنین اعمال تغییرات زیرساختی بهصورت خودکار درمیآیند و در کل هدف از DevOps، ایجاد فرهنگی است که در آن تولید، تست و انتشار نرمافزار به شیوهای سریع، مداوم و مطمئن انجام شود.
برای درک بهتر این موضوع که مهندسان DevOps دقیقاً چه کاری انجام میدهند، بهتر است به چرخهٔ تولید نرمافزار نگاهی داشته باشیم؛ بهطور کلی، فرآیند تولید نرمافزار را میتوان به ۵ مرحلهٔ اصلی تقسیم کرد که این مراحل عبارتند از Planning ،Development ،Testing ،Deployment و Maintenance که در این میان، ۲ مرحلهٔ Planning و Maintenance بیشترین زمان مهندسین DevOps را به خود اختصاص میدهند.
Planning (طرحریزی)
در این مرحله از کار، تیم (متشکل از دولوپرها، مدیران تولید و …) اهداف پروژه را تعریف و ترسیم نموده و ساختار کلی نرمافزار را تعیین میکنند؛ مهندس DevOps در این مرحله باید از دانش فنی اعضای تیم و تسلط آنها بر پلتفرمهای مورد استفاده بهره بـرده و بررسی نماید که چگونه میتوان در قالب یک سیستم جامع و یکپارچه به تمام اهداف مورد نظر تیم جامهٔ عمل پوشاند (در کل، این مرحله از کار یکی از مراحل زمانبر است).
پس از اینکه این سیستم اولیه پیادهسازی و اجرا شد، مهمترین مسئله هدایت تیم در جهت نحوهٔ افزودن قابلیتها و تکنولوژیهای از قبل تولیدشده به این سیستم اصلی است؛ همچنین در این مرحله ممکن است در مورد هماهنگی بخشهای مختلف نرمافزار با یکدیگر، زیر بار بردن دیتابیس جدید و یا نحوهٔ پشتیبانی از یک میکروسرویس زیرساختی جدید نیز تصمیمگیری شود.
علاوه بر این، در این مرحله باید در مورد نحوهٔ پیادهسازی و اجرای خودکار این موارد نیز راهکاری اندیشیده شود؛ درواقع، مهندس DevOps همواره باید بهدنبال راهکارهایی برای انجام خودکار فرآیندهای مختلف باشد تا بار انجام این کارها تا حد امکان از دوش اعضای تیم برداشته شود. در این مرحله، مهندس DevOps باید پاسخ سؤالات زیر را بیابد:
- دو سرویس مختلف چگونه میتوانند با هم در تعامل باشند؟
- برای مرتبط کردن این دو سرویس، از چه پروتکلی باید استفاده نمود؟
- آیا سختافزاری که در اختیار ما قرار دارد پاسخگوی نیاز ما هست و آیا امکان استفاده از فضای کلود وجود دارد؟
- برای اینکه بتوانم در امر تولید به مهندسان کمک کنم، نیاز به چه مواردی دارم و آنها چه چیزی را باید در اختیار من قرار دهند؟
- سرویس بهاصطلاح Production-Ready چیست؟
- آیا تمام دیپندنسیهای مورد استفاده در نرم افزار، برای ما قابل پایش هستند و آیا درک ما از آنها آنقدر کامل هست که در صورت لزوم قادر به دیباگ کردن آنها باشیم؟
- چه چیزی را لازم است بسازیم و چه چیزی را باید خریداری کنیم؟
- آیا یک تسک خاص را میتوان بهصورت خودکار انجام داد؟
- چهطور میتوان در آینده از این نرمافزار پشتیبانی نمود؟
Development (توسعه)
در این مرحله، ترکیببندی کلی کار مشخص شده و دیگر نوبت دولوپرها است که کد بزنند و قابلیتهای پیشبینی شده را برای نرمافزار ایجاد کنند؛ هدف عمدهٔ مهندس DevOps در این مرحله این است که به دنبال راههایی برای سریعتر انجام شدن کارها باشد؛ منظورمان این است که او باید راهی پیش پای دولوپرها بگذارد که بتوانند بهترین کار را در کمترین زمان ممکن انجام دهند و این دقیقاً با هدف نهایی کار -یعنی تولید نرمافزار- هماهنگ و سازگار است.
مهندس DevOps به دولوپرها میگوید که از چه ابزاری استفاده کنند و همچنین ابزارهای جدید را اختیار آنها قرار میدهد؛ همچنین این مهندس DevOps است که باید بخشهای مختلف کدهایی که توسط دولوپرها و در محیط توسعه نوشته شدهاند را مانند قطعات پازل در کنار هم قرار داده و آنها را با محیط نهایی نرمافزار هماهنگ کند.
این کاری است که هر دولوپری از عهدهٔ آن بر نمیآید و شاید اگر مهندس DevOps نمیبود، بسیاری از نرمافزارها قدرت، جلوه و شکوه امروزی خود نداشتند! سؤالاتی که یک مهندس DevOps در این مرحله ممکن است با آن مواجه شود عبارتند از :
- چگونه میتوانم دولوپرها را در فضایی مشابه فضای محصول نهایی نگه دارم و همزمان به آنها اجازه دهم تا از ابزارهای مورد علاقهٔ خود استفاده کنند؟
- چگونه می توانم بهرهوری و کارایی دولوپرها را افزایش دهم؟
- چهطور باید برای دولوپرها توضیح دهم که برای چه محیطی دارند کد میزنند و محیط نهایی نرمافزار چگونه خواهد بود؟
Testing (تست کردن)
در این مرحله، دولوپرها و مسئولین کنترل کیفیت، کدهای نوشته شده را تست نموده و آنها را برای یکپارچه شدن با سورسکد اصلی آماده میکنند؛ در این مرحله ممکن است از ابزارها و اسکریپتهایی بهمنظور انجام خودکار تستها استفاده شود اما هنوز هم برای اجرای دستی کدها بر روی سیستمهای داخلی شرکت به حضور دولوپرها و مسئولین کنترل کیفیت نیاز است.
از سوی دیگر، ممکن است لازم باشد محصول نهایی مورد تست قرار گیرد یا کدهای نوشته شده در محیطی مشابه محیط محصول نهایی بارها و بارها تست شوند؛ ممکن است تستها خیلی کند اجرا شوند و یا برای اجرای آنها عملاً به کنترل دستگاه میزبان نیاز باشد که در چنین مواردی باید فکری به حال اجرای خودکار تستها نمود.
در اینجا است که دوباره پای مهندس DevOps به میان میآید! در این مرحله وظیفهٔ مهندس DevOps این است که برای تکرار خودکار تستها راهی بیابد؛ او میتواند از ابزارهایی مانند Jenkins ،Bamboo و یا Drone استفاده کند (اینها ابزارهای Continuous Integration یا بهاختصار CI هستند که تست مداوم کدها را آسانتر میکنند). در این مرحله لازم است تا به سؤالات زیر پاسخ داده شود:
- چگونه میتوان محیطهای کاربری (Client Environment) تکرارپذیر ایجاد نمود؟
- از کجا بدانم تست مورد نظر در مورد کدام نسخه از سرویس درحال انجام است؟
- چگونه تاریخچهٔ تستها را دنبال کنم و بااستفاده از آن به روندهای موجود پی ببرم؟
- چگونه پس از تست نمودن کدها، مشکلات احتمالی را به دولوپرها اعلام کنم؟
- دادههای تست را از کجا بهدست آورم؟
Deployment (استقرار)
Deployment بهمعنای استقرار و توزیع کدها در یک محیط است که در اینجا سرور اصلی نرمافزار مد نظر ما است؛ بهطور کلی، این مرحله در مورد این است که کدهای نوشته شده چهطور و با چه نظمی در محصول نهایی قرار بگیرند و کدام کدها در مقابل End-Userها اجرا شوند.
در این مرحله نیز مهندسان DevOps از ابزارهای CI مشابه آنچه که در بخش قبل معرفی شد استفاده میکنند؛ بعضی از مهمترین سؤالاتی که در این مرحله باید پاسخ داده شوند عبارتند از:
- چه زمانی یک نسخهٔ نهایی نشده از نرمافزار آمادهٔ دیپلوی شدن است؟
- چگونه بدون اینکه کاربر متوجه شود، سرویسی را دیپلوی نمایم؟
- چگونه مطمئن شوم که سرویسی که بهتازگی دیپلوی شده، سبب ایجاد اختلال نمیشود؟
- چگونه فرآیند دیپلوی شدن را بهصورت خودکار در آورم؟
- چگونه -درصورت لزوم- در فرآیند دیپلوی خودکار، مراحلی را بهصورت دستی و غیرخودکار انجام دهم؟
- چگونه فرآیند دیپلوی را با روشی تکرارپذیر انجام دهم؟
معمولاً این مرحله زمان زیادی را از مهندسان DevOps نمیگیرد؛ بخشی که مهندسان DevOps باید بیشترین زمان و انرژی خود را صرف آن کنند، مرحلهٔ بعدی یعنی Maintenance است.
Maintenance (نگهداری)
همانطور که قبلاً گفتیم، مرحلهٔ نگهداری از نرمافزار یکی از مراحلی است که بیشترین زمان یک مهندس DevOps در این مرحله صرف میشود؛ بهعنوان مثال، در شرکت بزرگی مانند گوگل، یک جایگاه شغلی فقط و فقط با هدف انجام مرحلهٔ نگهداری و تحت عنوان Site Reliability Engineering درنظر گرفته شده است .
این مهندسان معتقدند که کارشان مشابه کار سریعترین تیمهای تعمیر ماشینهای مسابقه میباشد و مثل این است که در حالی که ماشین مسابقه ۱۵۰ کیلومتر بر ساعت سرعت دارد، بخواهید تایرهای آنرا عوض کنید! این مرحله تماماً در مورد انجام کارهایی است که درنهایت موجب در دسترس قرار گرفتن یک سیستم و حفظ کارایی آن میشوند. در این مرحله سؤالاتی مانند موارد زیر باید پاسخ داده شوند:
- چگونه می توانم از مشکلات و باگهای موجود در محصول یا سرویس آگاه شوم؟
- چگونه باگهای مختلف موجود در محصول یا سرویس را به تیمهای مناسب ارجاع دهم؟
- چگونه باگهای زیرساختی موجود در محصول را برطرف کنم؟
- مهندسان در سرویسهای خود چهطور باگها را برطرف میکنند و من بهعنوان یک مهندس DevOps، چگونه میتوانم از سلامت و کارایی همهٔ سرویسها مطمئن شوم؟
سخن پایانی
DevOps آمیزه و مخلوطی از چندین نقش بوده و هدف نهایی آن در کنار هم قرار دادن دولوپرها و مهندسان اجرایی است؛ فرهنگ DevOps ویژگیها و قابلیتهای جدید محصول را با زیرساختهای آن سازگار مینماید و سبب میشود تا این دو بتوانند در کنار هم بهخوبی عمل کنند. بهمنظور تکمیل آنچه در بالا مورد بررسی قرار گرفت، توجه شما را به تصویر زیر جلب میکنیم:
DevOps درواقع همان حلقهٔ گمشدهٔ میان اجرای کدها به صورت مجزا و اجرای آنها در محصول نهایی است؛ نیاز به توضیح نیست که اصطلاح DevOps از ۲ واژهٔ Development بهمعنی «توسعه» و Operations بهمعنی «عملیات» ساخته شده است و تصویر فوق بهخوبی گویای وظایف هرکدام از این بخشها است.
براساس تعریف ویکیپدیا:
DevOps یک فرایند تولید نرمافزار است که بر مبنای ارتباط و همکاری هرچه بیشتر میان تیمهای تولید و توسعهٔ نرمافزار و تیمهای اجرایی بنا شده است؛ در طی این فرآیند، عملیاتی مانند Integration ،Testing و Deployment و همچنین اعمال تغییرات زیرساختی بهصورت خودکار درمیآیند و در کل هدف از DevOps، ایجاد فرهنگی است که در آن تولید، تست و انتشار نرمافزار به شیوهای سریع، مداوم و مطمئن انجام شود.
برای درک بهتر این موضوع که مهندسان DevOps دقیقاً چه کاری انجام میدهند، بهتر است به چرخهٔ تولید نرمافزار نگاهی داشته باشیم؛ بهطور کلی، فرآیند تولید نرمافزار را میتوان به ۵ مرحلهٔ اصلی تقسیم کرد که این مراحل عبارتند از Planning ،Development ،Testing ،Deployment و Maintenance که در این میان، ۲ مرحلهٔ Planning و Maintenance بیشترین زمان مهندسین DevOps را به خود اختصاص میدهند.
Planning (طرحریزی)
در این مرحله از کار، تیم (متشکل از دولوپرها، مدیران تولید و …) اهداف پروژه را تعریف و ترسیم نموده و ساختار کلی نرمافزار را تعیین میکنند؛ مهندس DevOps در این مرحله باید از دانش فنی اعضای تیم و تسلط آنها بر پلتفرمهای مورد استفاده بهره بـرده و بررسی نماید که چگونه میتوان در قالب یک سیستم جامع و یکپارچه به تمام اهداف مورد نظر تیم جامهٔ عمل پوشاند (در کل، این مرحله از کار یکی از مراحل زمانبر است).
پس از اینکه این سیستم اولیه پیادهسازی و اجرا شد، مهمترین مسئله هدایت تیم در جهت نحوهٔ افزودن قابلیتها و تکنولوژیهای از قبل تولیدشده به این سیستم اصلی است؛ همچنین در این مرحله ممکن است در مورد هماهنگی بخشهای مختلف نرمافزار با یکدیگر، زیر بار بردن دیتابیس جدید و یا نحوهٔ پشتیبانی از یک میکروسرویس زیرساختی جدید نیز تصمیمگیری شود.
علاوه بر این، در این مرحله باید در مورد نحوهٔ پیادهسازی و اجرای خودکار این موارد نیز راهکاری اندیشیده شود؛ درواقع، مهندس DevOps همواره باید بهدنبال راهکارهایی برای انجام خودکار فرآیندهای مختلف باشد تا بار انجام این کارها تا حد امکان از دوش اعضای تیم برداشته شود. در این مرحله، مهندس DevOps باید پاسخ سؤالات زیر را بیابد:
- دو سرویس مختلف چگونه میتوانند با هم در تعامل باشند؟
- برای مرتبط کردن این دو سرویس، از چه پروتکلی باید استفاده نمود؟
- آیا سختافزاری که در اختیار ما قرار دارد پاسخگوی نیاز ما هست و آیا امکان استفاده از فضای کلود وجود دارد؟
- برای اینکه بتوانم در امر تولید به مهندسان کمک کنم، نیاز به چه مواردی دارم و آنها چه چیزی را باید در اختیار من قرار دهند؟
- سرویس بهاصطلاح Production-Ready چیست؟
- آیا تمام دیپندنسیهای مورد استفاده در نرم افزار، برای ما قابل پایش هستند و آیا درک ما از آنها آنقدر کامل هست که در صورت لزوم قادر به دیباگ کردن آنها باشیم؟
- چه چیزی را لازم است بسازیم و چه چیزی را باید خریداری کنیم؟
- آیا یک تسک خاص را میتوان بهصورت خودکار انجام داد؟
- چهطور میتوان در آینده از این نرمافزار پشتیبانی نمود؟
Development (توسعه)
در این مرحله، ترکیببندی کلی کار مشخص شده و دیگر نوبت دولوپرها است که کد بزنند و قابلیتهای پیشبینی شده را برای نرمافزار ایجاد کنند؛ هدف عمدهٔ مهندس DevOps در این مرحله این است که به دنبال راههایی برای سریعتر انجام شدن کارها باشد؛ منظورمان این است که او باید راهی پیش پای دولوپرها بگذارد که بتوانند بهترین کار را در کمترین زمان ممکن انجام دهند و این دقیقاً با هدف نهایی کار -یعنی تولید نرمافزار- هماهنگ و سازگار است.
مهندس DevOps به دولوپرها میگوید که از چه ابزاری استفاده کنند و همچنین ابزارهای جدید را اختیار آنها قرار میدهد؛ همچنین این مهندس DevOps است که باید بخشهای مختلف کدهایی که توسط دولوپرها و در محیط توسعه نوشته شدهاند را مانند قطعات پازل در کنار هم قرار داده و آنها را با محیط نهایی نرمافزار هماهنگ کند.
این کاری است که هر دولوپری از عهدهٔ آن بر نمیآید و شاید اگر مهندس DevOps نمیبود، بسیاری از نرمافزارها قدرت، جلوه و شکوه امروزی خود نداشتند! سؤالاتی که یک مهندس DevOps در این مرحله ممکن است با آن مواجه شود عبارتند از :
- چگونه میتوانم دولوپرها را در فضایی مشابه فضای محصول نهایی نگه دارم و همزمان به آنها اجازه دهم تا از ابزارهای مورد علاقهٔ خود استفاده کنند؟
- چگونه می توانم بهرهوری و کارایی دولوپرها را افزایش دهم؟
- چهطور باید برای دولوپرها توضیح دهم که برای چه محیطی دارند کد میزنند و محیط نهایی نرمافزار چگونه خواهد بود؟
Testing (تست کردن)
در این مرحله، دولوپرها و مسئولین کنترل کیفیت، کدهای نوشته شده را تست نموده و آنها را برای یکپارچه شدن با سورسکد اصلی آماده میکنند؛ در این مرحله ممکن است از ابزارها و اسکریپتهایی بهمنظور انجام خودکار تستها استفاده شود اما هنوز هم برای اجرای دستی کدها بر روی سیستمهای داخلی شرکت به حضور دولوپرها و مسئولین کنترل کیفیت نیاز است.
از سوی دیگر، ممکن است لازم باشد محصول نهایی مورد تست قرار گیرد یا کدهای نوشته شده در محیطی مشابه محیط محصول نهایی بارها و بارها تست شوند؛ ممکن است تستها خیلی کند اجرا شوند و یا برای اجرای آنها عملاً به کنترل دستگاه میزبان نیاز باشد که در چنین مواردی باید فکری به حال اجرای خودکار تستها نمود.
در اینجا است که دوباره پای مهندس DevOps به میان میآید! در این مرحله وظیفهٔ مهندس DevOps این است که برای تکرار خودکار تستها راهی بیابد؛ او میتواند از ابزارهایی مانند Jenkins ،Bamboo و یا Drone استفاده کند (اینها ابزارهای Continuous Integration یا بهاختصار CI هستند که تست مداوم کدها را آسانتر میکنند). در این مرحله لازم است تا به سؤالات زیر پاسخ داده شود:
- چگونه میتوان محیطهای کاربری (Client Environment) تکرارپذیر ایجاد نمود؟
- از کجا بدانم تست مورد نظر در مورد کدام نسخه از سرویس درحال انجام است؟
- چگونه تاریخچهٔ تستها را دنبال کنم و بااستفاده از آن به روندهای موجود پی ببرم؟
- چگونه پس از تست نمودن کدها، مشکلات احتمالی را به دولوپرها اعلام کنم؟
- دادههای تست را از کجا بهدست آورم؟
Deployment (استقرار)
Deployment بهمعنای استقرار و توزیع کدها در یک محیط است که در اینجا سرور اصلی نرمافزار مد نظر ما است؛ بهطور کلی، این مرحله در مورد این است که کدهای نوشته شده چهطور و با چه نظمی در محصول نهایی قرار بگیرند و کدام کدها در مقابل End-Userها اجرا شوند.
در این مرحله نیز مهندسان DevOps از ابزارهای CI مشابه آنچه که در بخش قبل معرفی شد استفاده میکنند؛ بعضی از مهمترین سؤالاتی که در این مرحله باید پاسخ داده شوند عبارتند از:
- چه زمانی یک نسخهٔ نهایی نشده از نرمافزار آمادهٔ دیپلوی شدن است؟
- چگونه بدون اینکه کاربر متوجه شود، سرویسی را دیپلوی نمایم؟
- چگونه مطمئن شوم که سرویسی که بهتازگی دیپلوی شده، سبب ایجاد اختلال نمیشود؟
- چگونه فرآیند دیپلوی شدن را بهصورت خودکار در آورم؟
- چگونه -درصورت لزوم- در فرآیند دیپلوی خودکار، مراحلی را بهصورت دستی و غیرخودکار انجام دهم؟
- چگونه فرآیند دیپلوی را با روشی تکرارپذیر انجام دهم؟
معمولاً این مرحله زمان زیادی را از مهندسان DevOps نمیگیرد؛ بخشی که مهندسان DevOps باید بیشترین زمان و انرژی خود را صرف آن کنند، مرحلهٔ بعدی یعنی Maintenance است.
Maintenance (نگهداری)
همانطور که قبلاً گفتیم، مرحلهٔ نگهداری از نرمافزار یکی از مراحلی است که بیشترین زمان یک مهندس DevOps در این مرحله صرف میشود؛ بهعنوان مثال، در شرکت بزرگی مانند گوگل، یک جایگاه شغلی فقط و فقط با هدف انجام مرحلهٔ نگهداری و تحت عنوان Site Reliability Engineering درنظر گرفته شده است .
این مهندسان معتقدند که کارشان مشابه کار سریعترین تیمهای تعمیر ماشینهای مسابقه میباشد و مثل این است که در حالی که ماشین مسابقه ۱۵۰ کیلومتر بر ساعت سرعت دارد، بخواهید تایرهای آنرا عوض کنید! این مرحله تماماً در مورد انجام کارهایی است که درنهایت موجب در دسترس قرار گرفتن یک سیستم و حفظ کارایی آن میشوند. در این مرحله سؤالاتی مانند موارد زیر باید پاسخ داده شوند:
- چگونه می توانم از مشکلات و باگهای موجود در محصول یا سرویس آگاه شوم؟
- چگونه باگهای مختلف موجود در محصول یا سرویس را به تیمهای مناسب ارجاع دهم؟
- چگونه باگهای زیرساختی موجود در محصول را برطرف کنم؟
- مهندسان در سرویسهای خود چهطور باگها را برطرف میکنند و من بهعنوان یک مهندس DevOps، چگونه میتوانم از سلامت و کارایی همهٔ سرویسها مطمئن شوم؟
سخن پایانی
DevOps آمیزه و مخلوطی از چندین نقش بوده و هدف نهایی آن در کنار هم قرار دادن دولوپرها و مهندسان اجرایی است؛ فرهنگ DevOps ویژگیها و قابلیتهای جدید محصول را با زیرساختهای آن سازگار مینماید و سبب میشود تا این دو بتوانند در کنار هم بهخوبی عمل کنند. بهمنظور تکمیل آنچه در بالا مورد بررسی قرار گرفت، توجه شما را به تصویر زیر جلب میکنیم:
DevOps درواقع همان حلقهٔ گمشدهٔ میان اجرای کدها به صورت مجزا و اجرای آنها در محصول نهایی است؛ نیاز به توضیح نیست که اصطلاح DevOps از ۲ واژهٔ Development بهمعنی «توسعه» و Operations بهمعنی «عملیات» ساخته شده است و تصویر فوق بهخوبی گویای وظایف هرکدام از این بخشها است.