هدف این مقاله اینه که یاد بگیریم چطور وقتی مجموعهای از تغییرات کد رو push میکنیم، نسخه جدید app ما روی server در اصطلاح deploy و آماده استفادهی کاربرها بشه.
اینجا (با توجه به امکانات من) از Bitbucket به عنوان source control ، از Jenkins به عنوان ابزار CI/CD و از Apache Tomcat به عنوان application server استفاده کردیم.
البته این کار وظیفهی تیم DevOps هست که نقش بسیار مهمی رو در فرآیند توسعهی نرمافزار به عهده داره. DevOps در هر سازمان، در واقع کار دو گروه توسعهدهنده ها(Developers) و عملیات(Operations) رو ساده میکنه.
اگر هنوز jenkins یا tomcat رو نصب نکردید و برای این کار نیاز به راهنمایی دارید، میتونید از مقالههای خوبی که قبلا به زبان فارسی نوشته شدهن استفاده کنید.
اگر از bitbucket به صورت آفلاین (در اصطلاح local) استفاده نمی کنید، قبل از هرچیز نیاز به یک Bitbucket account دارید. از طریق لینک زیر میتونید یک حساب کاربری و در پی اون یک repository برای خودتون بسازید:
بعد از ساخت حساب کاربری و وارد شدن به اون، Create Repository رو کلیک کنید:
طبق تصویر زیر یک repository بسازید و اطلاعات و نامهای مورد نظر رو پر کنید:
حالا در اصطلاح Bitbucket Repo آمادهی استفادهست و البته branch پیشفرض هم master خواهد بود.
من یک پروژهی سادهی spring boot Hello World رو دانلود و به این repository اضافه کردم.
به سرور jenkins که پیش از این نصب و راهاندازی شده، login کنید و از سمت چپ به بخش Manage Jenkins برید:
بعد Manage Plugins رو کلیک کنید:
حالا pluginهای زیر و جستجو کنید، تیک بزنید و بعد با زدن دکمه Install without restart اونها رو نصب کنید:
حالا باید یک job در jenkins بسازیم که اساسا مهمترین و بیشترین وظیفه رو در کل این فرآیند به عهده داره.
برای این کار به صفحه اصلی jenkins برید و از سمت چپ گزینهی New Item رو انتخاب کنید:
بعد از اینکه یک اسم مناسب برای job در نظر گرفتید، گزینهی FreeStyle Project رو انتخاب کنید و در پایین صفحه، دکمهی OK رو کلیک کنید:
در صفحه پیش رو، به بخش Source Code Management برید و گزینهی Git رو انتخاب کنید:
اینجا در قسمت Repository URL آدرس repository خودتون رو که قبلا در bitbucket ایجاد کردید وارد کنید.
این آدرس در واقع همون آدرسیست که برای clone کردن پروژه استفاده میکنید.
بعد برای اعتبارسنجی دسترسی، در بخش Credentials با زدن دکمه Add و بعد Jenkins برای ورود اطلاعات نام کاربری و گذرواژه آماده بشید:
در صفحه بعد و در محلهای مربوط، Username و Password دسترسی به repository رو وارد کنید.
انتظار داریم که در صورت درست بودن اطلاعات وارد شده، بدون هیچ error یا اخطاری بتونیم به قسمت بعد بریم :
حالا در بخش Build Triggers گزینهی Build when a change is pushed to BitBucket رو انتخاب کنید.
با این انتخاب در واقع jenkins رو اصطلاحا "گوش به زنگ" میکنیم تا هربار با دریافت یک سیگنال از طرف bitbucket مبنی بر push شدن تغییرات جدید، نسخهی جدید رو build کنه و برای app server (در اینجا tomcat) ارسال کنه.
ضمنا فراموش نکنید که در قسمت Override Repository URL باید مجددا آدرس repository خودتون رو وارد کنید:
حالا به بخش Build میریم و با زدن دکمه Add build step، گزینهی Invoke top-level Maven targets رو انتخاب می کنیم:
در قسمت باز شده (Goals) عبارت "clean install" رو وارد میکنیم:
حالا در بخش Post-build Actions روی دکمه Add post-build Actions کلیک میکنیم و در نهایت گزینهی "Deploy war/ear to a container" رو انتخاب میکنیم:
در این قسمت در بخش Containers و با زدن دکمه Add container، میتونیم container مناسب رو(که برای من Tomcat 9.x هست) انتخاب کنیم:
بعد مثل مرحله اضافه کردن credentials مربوط به سرور bitbucket، اینجا هم با زدن دکمه Add > Jenkins، اطلاعات Username و Password مربوط به سرور Tomcat رو وارد میکنیم. توجه داشته باشید که مشخصات کاربری رو وارد کنید که حداقل نقش manager-script داشته باشه(اگه manager-gui هم داشته باشه که چه بهتر).
بعد در قسمت WAR/EAR files، عبارت **/*.war و در قسمت Context path مسیر publish شدن war/ear fileتون رو وارد کنید:
در نهایت با زدن دکمهی Save، این تنظیمات رو ذخیره میکنیم:
حالا باید در bitbucket و در repository که قبلا ساختیم یک hook برای اعلام تغییرات کد به jenkins بسازیم.
برای این کار از طریق منوی سمت چپ به صفحهی Repository settings > Webhooks میریم:
در این صفحه با زدن دکمه Add webhook یک hook جدید اضافه میکنیم. در صفحه باز شده در قسمت Title یک نام برای hook انتخاب میکنیم و در قسمت URL آدرس سرور jenkins رو وارد میکنیم.
توجه کنید که syntax مورد نظر برای وارد کردن URL به شکل زیر هست:
IP-address/bitbucket-hook/
در نهایت با انتخاب گزینههای Active و Skip certificate verification، در بخش Triggers هم گزینهی Push رو انتخاب میکنیم و دکمه Save رو کلیک میکنیم:
۵-۱ـ اول به jenkins مراجعه میکنیم و بررسی میکنیم که آیا ارتباط از jenkins به bitbucket و tomcat برقرار هست یا نه!
برای این کار در Jenkins dashboard و برای job تازه ساخته شدهمون فرمان Build Now رو اجرا میکنیم:
روند اجرای job رو میتونیم در بخش Build History و در قسمت Console Output مشاهده کنیم:
اگر همه چیز موفقیتآمیز بود نشوندهندهی ارتباط صحیح jenkins و bitbucket هست.
۵-۲ـ حالا با توجه به آدرس app server به url پروژه مراجعه میکنیم تا deploy شدن پروژه و ارتباط jenkins و tomcat رو بررسی کنیم:
حالا به bitbucket میریم و در صفحهی Source فایل HelloWorldController.java رو برای تغییر انتخاب میکنیم. من برای تست، جملهی "Hello World" رو تغییر میدم و بعد تغییرات رو commit میکنم:
با بازگشت به jenkins و بررسی output در dashboard صحت عملکرد hook ساختهشده رو مشاهده میکنیم:
و مجددا به url پروژه مراجعه میکنیم تا ببینیم تغییرات اعمال شدهی ما به درستی deploy شدن یا نه:
خب، میتونیم بگیم که ما همین الان یک فرآیند سادهی CI/CD رو تکمیل کردیم. یک تغییر در کدمون ایجاد کردیم و بدون دخالت انسانی، این تغییرات در اصطلاح build شدن و نسخه ما ساخته شد و باز بدون دخالت کسی این نسخه روی app server ما deploy شد.
مقالههای خوب زیادی در اینترنت راجع به مفاهیم devops وجود دارن ولی من سعی کردم یک راهنمای گام به گام برای پیاده سازی یکی از این مفاهیم به طور خیلی ساده بسازم. طبیعتا همین نوشته هم وابسته به ابزارهاییه که من ازشون استفاده کردم ولی فکر میکنم میتونه یه نمای کلی و دیدگاه مناسبی از چگونگی عملکرد یک فرآیند ci/cd به مخاطب نشون بده.
اگر اشکال یا خطایی وجود داره خوشحال میشم که بهم اطلاع بدید.