یکپارچه‌ سازی Bamboo با SonarQube

در این مقاله، به‌طور جامع مراحل یکپارچه‌سازی SonarQube با Bamboo را بررسی کرده‌ایم.

یکپارچه‌ سازی Bamboo با SonarQube

در دنیای توسعه نرم‌افزار، تضمین کیفیت کد (Code Quality) یکی از ارکان اساسی موفقیت پروژه‌ها محسوب می‌شود. با توجه به پیچیدگی‌های موجود در پروژه‌های نرم‌افزاری، نیاز به ابزارهایی که بتوانند به‌صورت خودکار کیفیت کد (Code Quality) را ارزیابی کنند، بیش از پیش احساس می‌شود. یکی از ابزارهای برجسته در این زمینه، SonarQube است که با ارائه تحلیل‌های جامع از کد، نقاط ضعف و قوت آن را مشخص می‌کند. در این مقاله از آراد آرپانت، قصد داریم تا به بررسی چگونگی یکپارچه‌سازی SonarQube با Bamboo بپردازیم. Bamboo، به عنوان یکی از ابزارهای قدرتمند در زمینه CI/CD، به ما این امکان را می‌دهد تا فرآیندهای ساخت و استقرار نرم‌افزار را به‌صورت خودکار انجام دهیم. با این یکپارچه‌سازی، می‌توانیم کیفیت کد خود را در هر مرحله از توسعه به‌طور مستمر ارزیابی کرده و بهبود دهیم. مراحل مختلف این مقاله شامل بررسی پیش‌نیازها، نصب و پیکربندی ابزارها، تنظیمات سرور SonarQube، نصب SonarScanner CLI بر روی Agent‌ های Bamboo، اضافه کردنTask  به پلنbuild  با ارزیابی code coverage  و پیاده سازی Quality Gate است. با دنبال کردن این مراحل، شما قادر خواهید بود تا به‌صورت جامع و کامل کیفیت کد پروژه‌های خود را مدیریت کنید و از بهبود مستمر آن اطمینان حاصل کنید. بیایید با هم این سفر هیجان‌انگیز برای ارتقاء کیفیت کدهای خود را شروع کنیم.

بررسی پیش نیازها

قبل از اینکه به یکپارچه‌سازی SonarQube و Bamboo بپردازیم، بیایید مطمئن شویم که پیش‌نیازهای لازم آماده است.

  • SonarQube: نسخه 6.7 یا بالاتر
  • Bamboo: ترجیحاً نسخه‌های جدید و بروز
  • Bitbucket: نسخه 7.0 یا جدیدتر (اختیاری) (bitbucket چیست؟)

پس از آماده‌سازی این موارد، می‌توانید بقیه مراحل را گام به گام ادامه دهید.

نصب برنامه "Include Code Quality for Bamboo"

گام بعدی نصب برنامه"Include Code Quality for Bamboo"روی سرور Bamboo شماست. شما چند گزینه برای این کار دارید.

ابتدا، می‌توانید در نوار جستجوی اطلسیان Atlassian Marketplace به دنبال "sonarqube" بگردید، پس از پیدا کردن برنامه، به بخش منابع (Resources) بروید و فایل JAR را دانلود کنید.
پس از اتمام دانلود، به بخش مدیریت 
Bamboo بروید. از اینجا، گزینه 'Manage apps' را انتخاب کنید و سپس روی 'Upload app' کلیک کنید. فایل JAR که همین الان دانلود کرده‌ ایم را انتخاب کنید و دکمه upload را بزنید.

پس از نصب و فعال‌سازی این برنامه، می‌توانید با سایر مراحل ادامه دهید.

پیکربندی سرور SonarQube

حالا، بیایید به پیکربندی سرور SonarQube بپردازیم تا با Bamboo ارتباط برقرار کند. که فرآیند گام به گام آن به صورت زیر خواهد بود:

ابتدا، به تنظیمات حساب کاربری سرور SonarQube خود بروید. معمولاً می‌توانید این کار را با کلیک روی آیکون حساب کاربری خود، سپس انتخاب 'My Account' و رفتن به تب 'security' پیدا کنید. در اینجا، یک توکن ایجاد می‌کنیم. نامی معنادار مانند 'bamboo' برای آن اختصاص دهید، نوع را 'User Token' انتخاب کنید و تاریخ انقضا را مشخص کنید. من معمولاً برای راحتی 'no expiration' (بدون انقضا) را انتخاب می‌کنم. پس از ایجاد توکن، حتماً آن را برای استفاده در سمت سرور Bamboo ذخیره کنید.

سپس، به بخش مدیریت Bamboo بروید. می‌توانید با کلیک روی آیکون چرخ دنده و انتخاب 'Global Variables' به این بخش دسترسی پیدا کنید. در اینجا، یک متغیر جدید اضافه می‌کنیم. نامی مانند 'sonarqube_token.password' به آن اختصاص دهید و توکنی که از SonarQube به دست آورده‌ایم را وارد کنید.

 حالا، به بخش مدیریت Bamboo بازگردید و به 'Manage Apps' بروید. روی 'Include Code Quality for Bamboo' کلیک کنید و سپس دکمه 'configure' را بزنید. در اینجا، پیکربندی سرور SonarQube خود را تنظیم می‌کنیم. روی 'Add a new SonarQube Server Configuration'  کلیک کنید و یک نام برای آن اختصاص دهید. آدرس میزبان سرور SonarQube خود را وارد کنید، و برای 'Bamboo variable of service account token' ، متغیری که قبلاً ایجاد کرده‌ ایم – در این مورد 'sonarqube_token.password' – را انتخاب کنید. در حالی که گزینه 'Use plain service account token for authentication' وجود دارد، به دلایل امنیتی معمولاً توصیه نمی‌شود.

 سپس، Bamboo user را برای اتصال به Bitbucket را انتخاب کنید. من معمولاً Bamboo-Admin را انتخاب می‌کنم، اما می‌توانید هر کاربر مناسبی را انتخاب کنید. اطمینان حاصل کنید که 'Allow override of quality gate build breaker in Sonar tasks' فعال است – این در مراحل بعدی برای ما کاربردی خواهد بود. شما می‌توانید هر تنظیم دیگری را بر اساس ترجیحات خود اعمال کنید و در آخر روی 'ذخیره' کلیک کنید.

 با پیکربندی صحیح سرور SonarQube، شما آماده‌ اید تا با فرآیند یکپارچه‌ سازی ادامه دهید. بیایید به مراحل بعدی برویم!

نصب و پیکربندی SonarScanner CLI بر روی ایجنت‌های Bamboo

حالا، بیایید به گام مهم نصب و پیکربندی SonarScanner CLI بر روی یکی از Agentهای Bamboo بپردازیم. این به ما اجازه می‌دهد تا تحلیل کد را مستقیماً از داخلی

پایپلاین Bamboo انجام دهیم. بیایید شروع کنیم.

ابتدا باید به یکی از Agentهای Bamboo خود دسترسی پیدا کنیم، معمولاً یک ماشین مبتنی بر لینوکس در تنظیمات ما. من به Agent اختصاص داده شده Bamboo که در آن SonarScanner CLI را نصب خواهیم کرد، SSH می‌کنم.

پس از ورود، بیایید با جستجوی SonarScanner CLI شروع کنیم. ما به سادگی 'SonarScanner CLI' را در گوگل جستجو می‌کنیم و روی لینک مستندات رسمی SonarQube کلیک می‌کنیم که ما را به صفحه دانلود هدایت می‌کند.

در اینجا، گزینه‌‌‌ هایی برای سیستم عامل‌ های مختلف خواهید یافت. از آنجا که ما با یک Agent مبتنی بر لینوکس کار می‌کنیم، نسخه 'Linux 64-bit' را انتخاب می‌کنیم. لینک دانلود ارائه شده را کپی کنید.

حالا، در ترمینال خود، از 'wget' برای دانلود پکیج SonarScanner CLI استفاده می‌کنیم.

پس از دانلود، بسته را unzip کرده و به دایرکتوری مورد نظر خود منتقل می‌کنیم. ما ترجیح می‌دهیم دایرکتوری "/opt " را استفاده کنیم، اما شما می‌توانید هر دایرکتوری که با پیکربندی شما سازگار است را انتخاب کنید. با نصب SonarScanner CLI، باید دایرکتوری آن را به متغیر PATH سیستم خود اضافه کنیم تا از هر جایی قابل دسترسی باشد. مهم است که این تغییر PATH را دائمی کنید، معمولاً با به‌ روز رسانی تنظیمات پروفایل سیستم خود. مطمئن شوید که دستورالعمل‌های خاص سیستم خود را برای این مرحله دنبال کنید. برای اطمینان از موفقیت‌ آمیز بودن نصب، دستور 'sonar-scanner -h' را اجرا می‌کنیم. این باید منوی راهنمای SonarScanner CLI را نمایش دهد و تأیید کند که به درستی نصب شده است.

عالی!

  SonarScanner CLI اکنون بر روی Agent Bamboo ما نصب شده است.

با این حال، برای اطمینان از اینکه Bamboo SonarScanner CLI را شناسایی می‌کند، ممکن است نیاز به پیکربندی دستی داشته باشیم. بیایید به بخش مدیریت Bamboo برگردیم.

به بخش Agentها بروید و Agent Bamboo که SonarScanner CLI را بر روی آن نصب کرده‌‌ایم را انتخاب کنید. در تب 'Capabilities' روی 'Add Executable' کلیک کنید. نوع 'Sonar Scanner Home' را انتخاب کنید و tag مانند 'sonar-scanner' وارد کنید. مسیر دایرکتوری SonarScanner CLI را وارد کنید، که در مورد ما 'opt/sonar-scanner/' است.

برای ذخیره پیکربندی، روی 'Add' کلیک کنید.

و حالا، SonarScanner CLI توسط Bamboo شناسایی شده و آماده استفاده در پایپ لاین continuous integration است

با این تنظیمات، یک گام دیگر به یکپارچه‌ سازی SonarQube با Bamboo برای تحلیل کیفیت کد نزدیک‌تر هستیم. بیایید با گام‌های بعدی در سفر یکپارچه‌ سازی خود ادامه دهیم.

پوش کردن ریپو به BitBucket برای اسکن

حالا که Agentهای Bamboo و سرور SonarQube خود را پیکربندی کرده‌‌ایم، زمان آن رسیده که تنظیمات code quality خود را آزمایش کنیم. اما قبل از اینکه به جزئیات فنی بپردازیم، اجازه دهید لحظه‌‌ای پروژه شخصی و کمی عجیب خودم را معرفی کنم؛  - WAYD، مخفف ""What Are You Doing این برنامه شخصی مدیریت زمان من است. برای آن لحظاتی که از خودم می‌پرسیم، 'چگونه روزم را گذراندم؟' که اگر کنجکاو هستید، می‌توانید آن را در آدرس faresi.pythonanywhere.com مشاهد فرمایید. 

برای شروع، بیایید فایل ZIP ریپوی خود را از GitHub دانلود کرده و آن را از حالت فشرده خارج کنیم (من از پروژه WAYD خودم استفاده می‌کنم که در صورت تمایل شما نیز می‌توانید آن را دانلود کرده و بقیه مراحل را با من ادامه دهید). اما قبل از اینکه آن را به سرور Bitbucket خود push کنیم، بیایید در مورد فایل"sonar-project.properties " صحبت کنیم. این فایل برای پیکربندی property های تحلیل SonarQube بسیار مهم است. در حالی که می‌توانید این properties را مستقیماً در تسک SonarScanner در Bamboo تعریف یا تغییر دهید، اما در این مقاله از فایل"sonar-project.properties" استفاده می‌کنیم.  در فایل  'sonar-project.properties' ما، propertyهایی مانند "sonar.projectKey" و "sonar.projectNam" را برای شناسایی پروژه‌مان در سرور SonarQube تعریف کرده‌ایم. علاوه بر این، نسخه پایتون مورد استفاده در پروژه‌مان را با "sonar.python.version" مشخص شده است.

حالا، بیایید به سرور Bitbucket خود برویم و ریپویی به نام WAYD ایجاد کنیم. وقتی این کار انجام شد، پروژه خود را با استفاده از دستورات گفته شده در همان صفحه به Bitbucket پوش می‌کنیم.

افزودن تسک به build Plan و اجرای اولین اسکن Sonar

ابتدا، یک پروژه در بامبو ایجاد کنید و اطمینان حاصل کنید که Agent environment که روی آن SonarScanner

  • در بخش 'SonarQube Scanner executable'، می‌توانید مسیر SonarQube Scanner را مشخص کنید. ما نیازی به پیکربندی این نداریم چون که قبلاً مسیر نصب SonarScanner را پیکربندی کرده‌ایم.
  • 'Environment variables' به شما اجازه می‌دهند تا پارامترهای اضافی را تنظیم کنید
  • با استفاده از 'Working subdirectory' می‌توانید یک دایرکتوری جایگزین برای این تسک مشخص کنید.
  • 'Additional parameters' به شما اجازه می‌دهد تا پارامترهای اضافی را به SonarScanner ارسال کنید و برای 'SonarQube Server'، همان‌طور که توصیه شده است ما از سرور مشترک SonarQube استفاده می‌کنیم.

CLI نصب کردیم را در بخش 'Run this job in' انتخاب کرده‌ باشید و سپس روی 'save and continue' کلیک کنید.

به تب 'Repositories' بروید و ریپوی مد نظر خود را انتخاب کنید. ما در این مقاله از گزینه 'Bitbucket Server / Stash' استفاده می‌کنیم و ترجیح می‌دهیم کدهای خود را روی سرور Bitbucket خودمان میزبانی کنیم، اما شما می‌توانید میزبان‌های دیگر مانند GitHub را نیز انتخاب کنید. پس از انتخاب، ریپویی را که به Bitbucket ارسال کرده‌ایم انتخاب کرده و روی 'save repository' کلیک کنید.

بعد، به تب 'Stages' بروید. در 'Default Job'، ابتدا 'Source Checkout' را اضافه کنید تا ریپوی مد نظر را دریافت کنید. اطمینان حاصل کنید که ریپوی صحیح را در بخش Repository انتخاب کنید.

حالا وقت آن است که تسک 'Sonar Scanner' را اضافه کنیم. به سادگی آن را جستجو کرده و روی 'Sonar Scanner' کلیک کنید و یک نام مانند 'Code Quality Scan for WAYD project' به آن بدهید.

"بیایید نگاهی سریع به برخی از گزینه‌های مهم بیندازیم:

فعلاً بیایید با گزینه‌های پیش‌فرض ادامه دهیم و بعد از فعال سازی plan، آن را اجرا کنیم.

بعد از اجرای build روی نام پروژه در بخشSonar analysis result  کلیک کنید تا به سرورSonarQube  برای اطلاعات بیشتر هدایت شوید.

افزودن گزارش Code Coverage و تنظیم Quality Gate

خُب، بیایید کمی هیجان به فرآیند CI/CD خود اضافه کنیم! در این بخش قصد دارم شرطی را تنظیم کنیم که بر اساس آن، بیلد ما تنها در صورتی موفقیت‌آمیز خواهد بود که درصد code coverage حداقل 80 درصد باشد. اما قبل از این که وارد جزئیات فنی شویم، بیایید کمی در مورد code coverage صحبت کنیم.

به زبان ساده، code coverage آن درصد کدهایی هستند که در طول تست‌ها اجرا می‌شوند، مانند چک‌لیستی است که اگر یک خط کد در طول تست اجرا شود، علامت زده می‌شود و اگر نه، بدون علامت باقی می‌ماند.

حالا، چرا این مهم است؟ خوب،  code coverage یک معیار کلیدی در توسعه نرم‌افزار است زیرا به ما کمک می‌کند کیفیت تست‌های خود را ارزیابی کنیم و بخش‌هایی از کد را که ممکن است تست‌های کافی نداشته باشند، شناسایی کنیم.

برای پیاده‌سازی این، باید گزارش‌های code coverage را به ریپو خود اضافه کنیم. من قصد دارم از پکیچ coverage در پایتون برای این کار استفاده کنم، زیرا همان‌طور که می‌دانید، SonarQube خود به‌تنهایی code coverage را محاسبه نمی‌کند.

ما قبلاً پروژه خود را داکرایز کردیم و فایل docker-compose.yaml آن نیز آماده می‌باشد که با دستور 'docker compose up -d' می‌توانیم پروژه را با کانتینرهای Docker راه‌اندازی کنیم.

بعد از اجرا شدن کانتینرها با دستور 'docker container exec -it وارد کانتینر اپلیکیشن خود می‌شویم و تست‌های خود را با 'coverage run manage.py test' اجرا می‌کنیم. چند لحظه صبر کنید تا کارش را انجام دهد و بعد از اتمام اجرای تست‌ها باید یک گزارش XML از coverage تولید می‌کنیم که از دستور 'coverage xml' و فلگ '-o' برای مشخص کردن نام فایل خروجی به عنوان 'coverage-reports/coverage-0.xml'، طبق مستندات SonarQube استفاده می‌کنیم.

و بله در نهایت گزارش code coverage خود را آماده داریم و چون من از mount point volume در فایل docker-compose برای این کانتینر استفاده کردم، آن را نیز در سیستم لوکال خود داریم؛ اما قبل از این که تغییرات خود را به Bitbucket ارسال کنیم، بیایید به SonarQube برویم و آن را پیکربندی کنیم تا Gate Quality را در صورتی که coverage بیش از 80 درصد باشد، پاس کند.

پیاده‌سازی Quality Gate بر اساس Code Coverage

اگر به خاطر داشته باشید که هدف این بود که براساس code coverage بیلد مربوطه Pass یا Fail شود که در این بخش نحوه پیکربندی آن را توضیح خواهم داد.

ابتدا به تب Quality Gates در SonarQube بروید. از اینجا روی 'Create' کلیک کنید و به  Quality Gate جدید خود یک نام بدهید. به‌صورت پیش‌فرض، شرط هایی برای New Code تنظیم شده است که برای اضافه کردن شرط های خود نیاز خواهید داشت که اول ویرایش unlock و یک شرط اضافی اضافه کنیم. متریک 'Coverage' را از تب 'Conditions on New Code' حذف کنید. سپس روی 'Add Condition' کلیک کنید، 'On Overall Code' را انتخاب کنید، 'Coverage' را برای 'Quality Gate fails when' انتخاب کنید و مقدار را به 80 درصد ست کنید.

سپس به تب پروژه‌ها بروید، پروژه خود را انتخاب کنید و روی تنظیمات پروژه کلیک کنید. گزینه 'Always use a specific Quality Gate' را فعال کنید و Quality Gate که تازه ایجاد کرده‌ایم را انتخاب کنید.

حالا، بیایید به تنظیمات پلن خود برگردیم و برای تسک Sonar Scanner در قسمت 'Quality gates options' گزینه 'Show and break build on broken quality gates' را انتخاب کنیم.

همه چیز برای تست نهایی آماده است ولی قبل از اینکه تغییرات را به Bitbucket پوش کنیم، بیاید بیلد خود را یک بار اجرا کنیم تا ببینیم که به دلیل نبود فایل code coverage بیلد Fail می‌شود.

برای اضافه کردن فایل گزارش code coverage به ترمینال برگردید و گزارش coverage-0.xml که ساخته‌ایم را پوش کنید. 

git add -A

git commit -m “Added coverage report”

git push

حالا به Bamboo برگردید و بعد از اجرای و اتمام بیلد، نتایج را در SonarQube مشاهد کنید که اگر تمام مراحل را به درستی و طبق این مقاله انجام داشته باشید بیلد شما باید Pass شده باشد.

سخن پایانی

در این مقاله، به‌طور جامع مراحل یکپارچه‌سازی SonarQube با Bamboo را بررسی کردیم. از بررسی پیش‌نیازها و نصب ابزارهای لازم تا تنظیمات سرور SonarQube، پیکربندی SonarScanner CLI بر روی  Agent‌های Bamboo و مراحل مورد نیاز برای تحلیل و ارزیابی خودکار کیفیت کد (Code Quality) را پوشش دادیم.

با دنبال کردن این مراحل، شما قادر خواهید بود تا کیفیت کد (Code Quality) پروژه‌های خود را به‌طور مستمر ارزیابی و بهبود دهید. همچنین، با استفاده از Quality Gate و گزارش‌هایCode Coverage، می‌توانید اطمینان حاصل کنید که کد شما به استانداردهای مطلوبی دست یافته و نقاط ضعف آن شناسایی و رفع شده است.

این یکپارچه‌سازی نه تنها به افزایش کیفیت کد کمک می‌کند، بلکه فرآیند توسعه و استقرار نرم‌افزار را نیز بهبود می‌بخشد. با استفاده از ابزارهای قدرتمندی مانند SonarQube و Bamboo، شما می‌توانید از مزایای CI/CD بهره‌مند شده و نرم‌افزارهای خود را با کیفیت بالا و به‌صورت سریع‌تر و کارآمدتر به مشتریان ارائه دهید.

امیدواریم این مقاله برای شما مفید بوده باشد و توانسته باشیم شما را در مسیر بهبود کیفیت کدهای خود یاری دهیم. در نهایت، موفقیت در دنیای توسعه نرم‌افزار نیازمند توجه به جزئیات و استفاده از ابزارهای مناسب است. بیایید با تلاش مستمر و استفاده از این ابزارها، بهترین نسخه‌های ممکن از نرم‌افزارهای خود را بسازیم.

این مقاله را اشتراک گذاری کن: