CI + Android + GitLab (CI-CD - Part 1)

یکی از مصائب در تولید یک برنامه ، یکپارچه سازی و انسجام کدهاست ، مطمئنا شما هم توی توسعه‌تون با کابوسِ "conflict" بارها مواجه شدید ! برای حل این گونه مسائل از CI استفاده می‌کنیم !این کلمه مخفف Continuous integration هست که ویکیپدیا اونو "یکپارچه سازیِ مداوم" ترجمه کرده ، اگه تعریف ویکیپدیا (فارسی که راحت باشیم) رو ملاک قرار بدیم میشه این :به مجموعه‌ای از روش‌ها می‌گویند که باعث حفظ انسجام کد می‌شود و از به‌هم‌ریختگی کد جلوگیری می‌کند. این روش‌ها مبتنی بر build کردن مداوم پروژه پس از هر تغییر در کد توسط برنامه‌نویسان و اجرای تست کیس‌های برنامه است. به عنوان مثال هر زمان که یک commit توسط توسعه‌دهنده بر روی مخزن پروژه push شود همهٔ تست‌ها اجرا می‌شود تا بتوان اطمینان حاصل نمود که همهٔ قسمت‌های پیشین کد و قسمت‌های تازه نوشته‌شده با یک‌دیگر سازگاری دارد و درست کار می‌کندبذارید با یه شکل این مساله رو بهتر بیان کنیم :شمای کلی CI-CD (از سایت گیت لب)همون طور که توی شکل می‌بینید ما بعد از توسعه و ... کدمون رو commit می‌کنیم و به محض commit میایم سلسله مراتبی از دستورات رو (که بهش pipeline (تونل یا لوله) میگیم) اجرا می‌کنیم ، در این سلسله مراحل ما میاییم پروژه رو Build می‌کنیم ، تست‌هایی که نوشتیم رو اجرا و بررسی می‌کنیم و در نهایت اون رو به مرحله CD (که در موردش این مقاله رو نوشتم و بعد از این حتما بخونید) میریم .کاری که الان توی این مقاله انجام میدیم اینه که یه پروژه بسازیم و pipeline اونو که شامل سه مرحله است اجرا کنیم : build و test و deploy . برای این کار میتونیم از ابزارهای مختلف استفاده کنیم که برای Android بهترین ابزار GitLab هستش .قدم اول - ساخت پروژهتوضیحی نداره ، پروژه رو بسازید و یک ریپازیتوری توی GitLab درست کنید و اونو اونجا کامیت و پوش کنیدقدم دوم - ایجاد کانفیگ CI-CDگیت لب خودش ابزارِ کامل CI-CD رو برای ما تهیه میکنه ، این گزینه رو انتخاب کنیدایجادِ CI-CDبا این کلیک فایلی با فرمت yml برای ما تولید میشه که کانفیگ ci ما اونجا انجام میشه ، پس باید این صفحه رو به روتون باشه :.gitlab-ci.ymlخب ، ما تو این فایل یک سری اسکریپت خواهیم نوشت و بعد نشون میدیم که چطوری قراره این اسکریپت ها به صورت سلسله مراتب یا همون pipeline اجرا بشن ، ما در این فایل یک سری stage تعریف میکنیم ، این stage ها در واقع همون مراحلِ pipeline ما هستند که در مثالی که میزنیم سه مرحله داریم (بالاتر گفتیم) ، ما با دستوراتی که yml داره اونا رو به کارای خاصی متصل می‌کنیم (من شروع میکنم به تیکه تیکه گذاشتن اسکریپت و بعد کلشو با هم برای دانلودِ شما میذارم ، یک سری از اسکریپت رو اینجا قرار نمیدم برای همین اگه خواستید کپی کنید سراغ فایل انتهای مقاله برید که مشکلی براتون پیش نیاد) :قبل از همه چیز باید image مورد نظر که دارای کامند های اندروید استدیو و fastlane باشهimage: vratislav/gitlab-ci-fastlane-androidبعد از اون باید مراحل رو تعریف کنیم :stages: - build - test - deployاین قسمت هم قبل از انجام عملیات باید اجرا بشه :before_script:- export GRADLE_USER_HOME=$(pwd)/.gradle- chmod +x ./gradlewسه stage بالا رو داریم ، باید دونه دونه اونها رو تعریف کنیم ، از build شروع می‌کنیم :build: stage: build script: - ./gradlew assembleDebug artifacts: paths: - app/build/outputs/apk/app-debug.apkمی‌بینید که ما عمل assembleDebug رو به stage شماره 1 یعنی همون build میدیم و بعد میاییم دستور لازم برای تهیه نسخه debug رو وارد می‌کنیم (در واقع یه دستور کنسولیه که شما تو همون ترمینال اندروید استدیو هم دارید و چیز خاصی نیست) ، مرحله بعدی اینه که unit test ها رو اجرا کنید :debugTests: stage: test script: - ./gradlew testاگه دقت کنید این هم خیلی ساده است ، در واقع همون command های اندروید استدیو هست که توی ترمینال یا cmd یا هرجای دیگه استفاده می‌کنیم ، به سیستم گفته میشه بیاد فایل های test رو اجرا کنه ، مرحله آخر کمی فرق می‌کنه که توی یه مقاله دیگه توضیح دادم و اینجا فقط اسکریپتشو می‌نویسم :deploy_internal: stage: deploy only: - master script: - fastlane slack_buildقضیه اسکریپت بالا اینه ، ما برای CD (فعلا این طور در نظر بگیریم ، "رساندن نسخه به دست دیگران") ابزاری به اسم fastlane داریم ، کلمه کلیدی when مشخص می‌کنه این stage کی باید اجرا بشه ، و کلمه only اینو میگه که هر وقت ما از master عملیاتِ commit و push رو انجام دادیم بیا این مرحله deploy رو برای ما انجام بده وگرنه اگه از branch های دیگه بودیم کاری نداشته باش ! (برای فهم fastlane این مقاله رو بخونید که قبلا نوشتم) .و همین ! الان شما سیستم رو با سه مرحله راه اندازی کردید و به ازای هر commit از master میاد سه مرحله و از branch های دیگه میاد دو مرحله دیگه رو انجام میده ، شما می‌تونید از این قسمت روالِ کارو ببینید :سلسله مراتبِ CI فایلِ yml رو می‌تونید از اینجا بگیرید : http://s7.picofile.com/file/8390666126/gitlab.yml.html