اپ های موبایلی و CI/CD

دائما ادغام کردن یا (Continuous Integration) به مراحل ادغام کد برنامه نویسان بر روی کد اصلی گفته میشود. این امکان به برنامه نویسان کمک میکند که بتوانند به سهولت مشکلات خود را پیدا و رفع کنند.مارتین فاولر در مورد CI میگوید: CI ما را از خطاها خلاص نمیکند، اما یافتن و حل آن ها را به صورت چشمگیری آسان میکند.CI بازخورد یا فیدبک ها را با سرعتی بالا مشخص و سرعت توسعه را بالا میبرد. برای راه اندازی و توسعه ی اپ این نکته که "هر چه مشکلات زودتر حل شود، هزینه های کمتری خواهد داشت"، بسیار حائز اهمیت است.کارهایی که در بخش CI انجام می شود:دسترسی به سورس کنترل هایی شبیه gitlab و دریافت سورس.آنالیزهای استاتیک بر روی کد انجام میگیرد تا مشکلات مربوط به syntax را استخراج کند.عملیات build و کامپایل را انجام میدهد.تست های مختلف مثل Unit test, UI Test, Smoke test را اجرا میکند.موارد و مشکلات را به تیم گزارش می دهد.تحویل مدام یا (Continuous Delivery) افزونه ای برای CI می باشد. به عبارت دیگر، ارائه به کاربر نهایی در هر زمانی را محقق می سازد. مراحلی که در این بخش انجام خواهد شد به موارد بخش CI اضافه خواهد شد که عبارتند از:ساخت package اپلیکیشناگر نیاز به code sign داشته باشد، در این مرحله انجام خواهد شد.عرضه اپ در استورها و محیط های قابل انتشار.اگر مرحله CD به تیم نرم افزاری اضافه شود، کلیه مراحل تولید به صورت خودکار انجام خواهد شد و این یعنی ریسک پایین و همچنین هزینه کمتر در اجرا و نهایی سازی محصول. در واقع شما با یک کلیک میتوانید محصول نهایی را در اختیار کاربر قرار دهید. اگرچه به طور معمول همیشه تغییراتی به صورت دستی برای عرضه نهایی محصول بایستی صورت گیرد، ولی در CD هیچ تغییری به صورت دستی انجام نمیشود، بلکه بعد از commit شدن سورس کد و اجرای مراحل CI، در مسیر تعریف شده یا استراتژی مجموعه، تا عرضه نهایی محصول مراحل طی خواهند شد.اصطلاحی در این تکنولوژی وجود دارد به نام CI/CD Pipelines. اجرای مراحل CI و CD به وسیله ی یکسری دستورات انجام می شود که در این بخش به آنها خواهیم پرداخت. CI/CD pipelines در اپ های موبایلی با وب اپ ها متفاوت است. این تفاوت به خاطر پیچیدگی در ساختمان و نوع پکیج های اپ های موبایلی می باشد. تفاوت های CI/CD در اپ های موبایلی و وب اپ ها به شرح ذیل می باشد:وب اپ ها در مرورگر ها عرضه می شوند در حالی که در اپ های موبایلی برای سیستم عامل های مختلف و بر روی دیوایس های مختلف با ورژن های مختلفی از سیستم عامل بایستی تولید و عرضه شود.در وب اپ ها، فایل های مورد نیاز آن ها در فضاهای سروری ذخیره می شود.در استفاده از ابزار و تکنولوژی با هم متفاوت هستند. مثلا برای وب اپ ها از تکنولوژی هایی مثل جاوا، جاوا اسکریپت استفاده میشود. اما در اپ های موبایلی از یک زبان برای تولید محصول استفاده می شود.برای عرضه اپ های موبایلی به امضا یا code sign نیاز دارید ولی در اکثر اپ های وبی به این مسئله نیازی نیست.نوع عرضه ی وب اپ ها از نوع قرار دادن بر روی سرور یا push-type است اما عرضه اپ های موبایلی با قرار داده بر روی استورهای عرضه اپ و با دانلود کاربر همراه است که اصطلاحا به آن pull-type می گویند و بایستی به صورت دستی بروز رسانی شود.چگونه یک CI/CD pipelines بسازیم؟یک نکته بسیار حائز اهمیت است که بدانید برای ساخت یک pipelines بایستی حتما از command line استفاده کنید. این دستورات در اپ های موبایلی بسیار پیچیده هستند و بایستی مراحل code sign و عرضه در استورها برای آنها پیاده سازی شود. در اپ های موبایلی نیاز به ابزاری برای build خودکار سورس کد خود دارید. ابزار build خودکار در iOS با نام Fastlane و در اندروید با نام Gradle مورد استفاده قرار میگیرد. مراحل ساخت یک CI/CD pipelines به شرح زیر می باشد:آنالیز ایستای خودکاربررسی syntax پیاده سازی اپ بر اساس زبانی که انتخاب شده است. مثلا زبان swift. اگر خطای جدی در سورس مشاهده شود، عملیات fail شده و به مرحله build نخواهیم رفت.پردازش برای build خودکاراگر از مرحله قبل یعنی آنالیز استاتیک عبور کنید، به مرحله build و کامپایل می رسید. اپ های موبایلی برای build شدن، باید سورس و منابع مربوطه ی آنها کامپایل شوند. نتیجه ی نهایی خروجی فایل ipa در ios و فایل apk در اندروید خواهد بود. برای مثال برای ios بایستی از ابزار fastlane استفاده کرد. Command زیر عمل build را با استفاده از این ابزار محقق می سازد:bundle exec fastlane buildاجرای خودکار تستاجرا تست به صورت خودکار، تمام کننده و حائز اهمیت است. در صورت نبود این مرحله، نقص در کیفیت محصول نهایی را رقم خواهد زد. تست های خودکار می تواند برای سطح و متدهای مهم نوشته شود. مطابق command قبلی در ios، برای تست در ios نیز باید به صورت زیر عمل نمود:bundle exec fastlane testو پابلیشبرای آماده سازی CI/CD Pipelines اپ های موبایلی نیاز به امضای کد یا code sign خواهید داشت.ارسال notificationزمانی که مراحل build به اتمام می رسد، مطلع شدن تیم اجرایی کار از نتیجه ی مراحل CI/CD بسیار حائز اهمیت می باشد. توسعه دهندگان می توانند لاگ های ثبت شده را بررسی نمایند ولی ارسال وضعیت به ایمیل یا اسلک آن ها راحت تر خواهد بود.در پایان عملیات build، بایستی CI/CD Pipeline یک پیام به توسعه دهندگان ارسال کند.ابزار های CI/CD برای اپ های موبایلیابزارهای این تکنولوژی دو نوع هست:Self-hosted: در این نوع بایستی تمامی ابزارها و فرایندها پیاده سازی، نگهداری و بهینه سازی شود. ابزارهایی مثل Jenkins, TeamCity, BuildKiteCloud-base: در این نوع نیازی به پیاده سازی و نگهداری نیست و به راحتی قابل پیاده سازی خواهد بود به خصوص مراحل code sign و پابلیش. برای این نوع می توان از Nevercode, Bitrise, Travis CI, Circle CI نام برد.مثال زیر سه مرحله در CI را پیاده سازی کرده است. مراحل تست و بیلد و گرفتن screenshot برای پابلیش بر روی appStore:# Use the latest stable version of Semaphore 2.0 YML syntax: version: v1.0 # Name your pipeline. If you choose to connect multiple pipelines with # promotions, the pipeline name will help you differentiate between # them. For example, you might have a build phase and a delivery phase. # For more information on promotions, see: # https://docs.semaphoreci.com/article/67-deploying-with-promotions name: Tallest Towers # The agent defines the environment in which your CI runs. It is a combination # of a machine type and an operating system image. For a project built with # Xcode you must use one of the Apple machine types, coupled with a macOS image # running either Xcode 10 or Xcode 11. # See https://docs.semaphoreci.com/article/20-machine-types # https://docs.semaphoreci.com/article/161-macos-mojave-xcode-10-image and # https://docs.semaphoreci.com/article/162-macos-mojave-xcode-11-image agent: machine: type: a1-standard-4 os_image: macos-xcode11 # Blocks are the heart of a pipeline and are executed sequentially. Each block # has a task that defines one or more parallel jobs. Jobs define commands that # should be executed by the pipeline. # See https://docs.semaphoreci.com/article/62-concepts blocks: - name: Run tests task: # Set environment variables that your project requires. # See https://docs.semaphoreci.com/article/66-environment-variables-and-secrets env_vars: - name: LANG value: en_US.UTF-8 prologue: commands: # Download source code from GitHub. - checkout # Restore dependencies from cache. This command will not fail in # case of a cache miss. In case of a cache hit, bundle install will # complete in about a second. # See https://docs.semaphoreci.com/article/68-caching-dependencies - cache restore - bundle install --path vendor/bundle - cache store jobs: - name: Test commands: # Select an Xcode version. # See https://docs.semaphoreci.com/article/161-macos-mojave-xcode-10-image and # https://docs.semaphoreci.com/article/162-macos-mojave-xcode-11-image - bundle exec xcversion select 11.4.1 # Run tests of iOS and Mac app on a simulator or connected device. # See https://docs.fastlane.tools/actions/scan/ - bundle exec fastlane test - name: Build app task: env_vars: - name: LANG value: en_US.UTF-8 secrets: # Make the SSH key for the certificate repository and the MATCH_PASSWORD # environment variable available. # See https://docs.semaphoreci.com/article/109-using-private-dependencies - name: match-secrets prologue: commands: # Add the key for the match certificate repository to ssh # See https://docs.semaphoreci.com/article/109-using-private-dependencies - chmod 0600 ~/.ssh/* - ssh-add ~/.ssh/match-repository-private-key # Continue with checkout as normal - checkout - cache restore - bundle install --path vendor/bundle - cache store jobs: - name: Build commands: - bundle exec xcversion select 11.4.1 - bundle exec fastlane build # Upload the IPA file as a job artifact. # See https://docs.semaphoreci.com/article/155-artifacts - artifact push job build/TallestTowers.ipa - name: Take screenshots task: env_vars: - name: LANG value: en_US.UTF-8 prologue: commands: - checkout - cache restore - bundle install --path vendor/bundle - cache store jobs: - name: Screenshots commands: - bundle exec xcversion select 11.4.1 - bundle exec fastlane screenshots # Upload the screenshots directory as a project artifact. # See https://docs.semaphoreci.com/article/155-artifacts - artifact push job screenshots