Рубрики
Uncategorized

Создание проектов Kotlin Multiplatform в конвейере CI / CD

Kotlin — один из самых универсальных языков программирования, в значительной степени из-за … Tagged CiCD, Kotlin, Mobile, Circleci.

Котлин Является ли одним из самых универсальных языков программирования, в значительной степени из-за сосредоточенности команды Kotlin на доставке его как можно больше платформ. Это основной язык для разработки приложений Android и популярен для JVM Backends. Kotlin также имеет целевые показатели для нативной бинарной компиляции с Kotlin/родным и для Интернета через Kotlin/JS. Одной из его наиболее перспективных функций является возможность нацелить несколько платформ, которые он компилирует.

Это где Kotlin Multiplatform Mobile (KMM) Приходит: он позволяет писать и повторно использовать один и тот же код Kotlin через Android и IOS приложения. Поскольку мобильные клиенты часто стремятся к четности на основе функции, это умный подход, чтобы избежать дублирования работ, и все мы знаем, как разработчики любят избегать дублированных работ. Поверь мне, я разработчик, и я знаю, как это правда.

Во всяком случае, обратно в Kotlin Multiplatform. Это другой подход от кроссплатформенных инструментов, таких как трепетание и реагирование на родом, что обеспечивает единое интернет-интерфейс на вершине всего. KMM позволяет писать общую бизнес-логику, сохраняя пользовательский интерфейс и надежно в домене их родных платформ. Во многих случаях этот подход предпочтительнее пользователей приложений, и поэтому ваших клиентов.

Эта статья покажет вам, как начать строительство проектов KMM в CI/CD-трубопровод и включите, что в рабочем процессе развития вашей команды.

Примечания для следующего

Эта статья предполагает понимание Kotlin, а также знакомства с хотя бы одним из Android или iOS, в идеале обеих платформ. Эта статья не учит вас KMM. Для этого просмотрите один из существующих учебных пособий на сайте Котлин или Readme из приложения образца.

Также Примечание: KMM в настоящее время в альфа-версии. Технология и API постоянно меняются и развиваются, и мы делаем все возможное, чтобы сохранить образцы, работающие и актуальны, но он должен прийти без гарантий, кроме версий API в образцах.

Чтобы построить многоплатформенный проект в контексте CI/CD думает об этом как построение различных проектов для каждой отдельной целевой платформы. Наш проект основан на Собственный мультиплатформенный образцов Kotlin — приложение RSS Reader Отказ Он содержит 2 приложения, а также общую кодовую базу Kotlin в виде библиотеки Kotlin. Общая библиотека остается в Kotlin для компиляции на Android, а также компилирует нативный код для запуска на ARM64 для целей iOS.

Код приложения Android находится в AndroidApp и написано в знакомом Котнинском кодовой базе. Приложение iOS написано в Swift и расположено в IOS приложение Отказ Чтобы понять, как KMM делает все работать, посмотрите официальную документацию KMM Документация и Образец проекта На Github Repo Kotlin, что этот проект основан.

Создание базового трубопровода

Самый простой CI/CD-канал для проектов KMM содержит 2 рабочих места в одном рабочем процессе, которые выполняют сборку для каждой соответствующей платформы. Работа в Circleci — это последовательность команд или шагов, которые выполняются в заранее определенной среде. Эта среда является ключом к созданию приложения для разных платформ. Для iOS нам нужно построить его на Mac Macware, проходя мимо Macos для исполнителя. Android более разрешительный, но мы все еще можем выбрать предварительно встроенную среду, которая содержит все SDK и все остальное встроено. Для этого учебника мы будем использовать Android Docker Image, как предоставлено Android Орб

Сами рабочие места просты и не актуальны для этого руководства: проверьте код, компилируйте, возможно, запустите некоторые тесты, построить, может быть, даже развертывание. В рамках этого руководства мы не будем сосредоточиться на рабочих местах. Вместо этого мы проведем некоторое время настроив окружающую среду и рабочие процессы для сборки. Если вы хотите узнать больше о настройке сборки и тестирования для Android, вы можете прочитать об этом в Это пост Отказ Если вы хотите узнать больше о настройке сборки и тестов на iOS, вы можете прочитать больше в Это руководство в документации CIRCLECI Отказ

version: 2.1
orbs:
  android: circleci/android@1.0.3
jobs:
  build-android:
    executor: android/android
    steps:
      - checkout
      - android/restore-build-cache
      - android/restore-gradle-cache
      - run: ./gradlew androidApp:assembleDebug
      - android/save-gradle-cache
      - android/save-build-cache
      - store_artifacts:
          path: androidApp/build/outputs/apk/debug
  build-ios:
    macos:
      xcode: 12.4.0
    steps:
      - checkout
      - run:
          name: Allow proper XCode dependency resolution
          command: |
            sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
            rm ~/.ssh/id_rsa || true
            for ip in $(dig @8.8.8.8 bitbucket.org +short); do ssh-keyscan bitbucket.org,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
            for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
      - run:
          name: Install Gem dependencies
          command: |
            cd iosApp
            bundle install
      - run:
          name: Fastlane Tests
          command: |
            cd iosApp
            fastlane scan
      - store_artifacts:
          path: iosApp/fastlane/test_output
      - store_test_results:
          path: iosApp/fastlane/test_output/report.junit
workflows:
  build-all:
    jobs:
      - build-android
      - build-ios

Создание приложения для Android

Лучший способ начать строить приложения для Android, используя Android ORB. Это дает вам несколько встроенных рабочих мест и команд, которые облегчают построить. Для этого выполняются, мы устанавливаем зависимости Gradle, и запустив команду Gradle для запуска модульных тестов.

Главное отличие Kotlin Multiplatform приводит к тому, что приложение не является проектом верхнего уровня. Вместо этого он расположен в AndroidApp модуль. Этот модуль имеет зависимость на поделился Итак, нам нужно включить команды Gradle с AndroidApp: приставка.

orbs:
  android: circleci/android@1.0.3
jobs:
  build-android:
    executor: android/android
    steps:
      - checkout
      - android/restore-build-cache
      - android/restore-gradle-cache
      - run: ./gradlew androidApp:assembleDebug
      - android/save-gradle-cache
      - android/save-build-cache
      - store_artifacts:
          path: androidApp/build/outputs/apk/debug

Создание приложения iOS

Как мы упоминали выше, создание приложений iOS требует оборудования MAC с установленным XCode. Для Build-iOS Работа, мы будем использовать Macos Исполнитель, где мы передаем версию XCode в качестве параметра. В нашем случае это: Xcode: 12.4.0 Отказ

Остальные шаги являются общими, независимо от того, используете ли вы какоапод или Swift Package Manager. Обычно вы будете устанавливать некоторые зависимости, а затем вы можете создать приложение и запустить тесты с помощью FastLane. Для этого учебника мы просто запустим некоторые тесты.

Общий код Kotlin Code автоматически создан как структура, когда мы инициируем сборку с Fastlane, поэтому здесь ничего не осталось делать здесь.

jobs:
  ...
 build-ios:
    macos:
      xcode: 12.4.0
    steps:
      - checkout
      - run:
          name: Allow proper XCode dependency resolution
          command: |
            sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
            rm ~/.ssh/id_rsa || true
            for ip in $(dig @8.8.8.8 bitbucket.org +short); do ssh-keyscan bitbucket.org,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
            for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
      - run:
          name: Install Gem dependencies
          command: |
            cd iosApp
            bundle install
      - run:
          name: Fastlane Tests
          command: |
            cd iosApp
            fastlane scan
      - store_artifacts:
          path: iosApp/fastlane/test_output
      - store_test_results:
          path: iosApp/fastlane/test_output/report.junit

Создание продвинутого конвейера с динамическим конфигом

Этот образец трубопровода хорошо работает для создания и тестирования целевых платформ вашего приложения KMM каждый раз, когда кто-то совершает репозиторий. Но мы можем сделать лучше. Реальность мобильного развития заключается в том, что у нас есть специалисты, сосредоточившаяся на их работе на своих соответствующих платформах. Есть люди, которые любят и используют Android, люблю создавать отличный UX и опыт для Android и знают платформу внутри и снаружи. С другой стороны, есть разработчики, которые сосредоточены на iOS таким же образом. На общих кодовых базе всегда есть несколько пересковок. Там все равно будут люди, которые специализируются на одной или другой платформе на большинстве команд.

Прогресс развития обычно составляет в одной из этих конфигураций:

  • Android Fressend CodeBase только
  • IOS Frestend CodeBase только
  • Shared KMM CodeBase, который потребляется обеими кодовые базы

Для первых двух сценариев здание только для платформы работают над, делает гораздо больше смысла и экономит время, кредиты и эффективность.

Чтобы оптимизировать этот поток, мы можем использовать функцию динамической конфигурации Circleci, которая помогает нам проекты Orchestrate, как это намного эффективнее. Dynamic Config позволяет создавать только части приложения, которые вы изменили.

Dynamic Config работает через рабочий процесс установки, который на первом этапе оценивает кодовую базу, обнаруживает то, что изменилось (больше на это немного позже), и только затем запускается реальный Рабочий процесс, тот, который строит часть приложения, которая актуальна.

Рабочий процесс установки все еще использует config.yml Это пользователи Circleci, вероятно, знакомы. Рабочий процесс, который выполняется, использует фильтрацию PATH ORB, который обнаруживает изменения по сравнению с указанной веткой. Вот полная конфига.

version: 2.1
setup: true
orbs:
  # the path-filtering orb is required to continue a pipeline based on
  # the path of an updated fileset
  path-filtering: circleci/path-filtering@0.0.2
workflows:
  select-for-build:
    jobs:
      - path-filtering/filter:
          base-revision: master
          config-path: .circleci/continue-config.yml
          mapping: |
            shared/.*|^(?!shared/.*|iosApp/.*|androidApp/.*).*  build-all     true
            androidApp/.*                                       build-android true
            iosApp/.*                                           build-ios     true

Вот разрыв этого конфига:

Настройка: правда Указывает CIRCLECI, что мы используем динамическую конфигурацию, и что это первая часть трубопровода для запуска. Рабочий процесс установки — это только рабочий процесс этой конфигурации. У него есть одна работа, Путь фильтрация/фильтр , который из Путь-фильтрация Орб Работа занимает несколько параметров:

  • Базовая ревизия указывает на ветвь для сравнения против
  • сопоставление определяет, какие пути сравнивать (больше об этом позже)
  • Конфигурация указывает на Продолжить-config.yml , который является следующим конфигурацией для оценки после этого рабочего процесса установки. В нашем случае мы указываем на статический файл, но мы также могли программно заранее создать этот новый файл конфигурации.

Использовать сопоставление Вы определяете пути проекта для сравнения от кодовой базы в базовой ревизии. Есть один путь в строке. Затем установите параметр трубопровода для передачи на последующий трубопровод и его значение. Все это разделены пробелом.

Линии 2 и 3 довольно просты:

androidApp/.* build-android  true

В этом случае путь, который мы заинтересованы в том, это все файлы и подкаталоги в AndroidApp/ каталог. Именно здесь кодовая база для Android-специфического интерфейса есть. Параметр трубопровода, Build-Android установлен на правда Отказ

Первая сопоставительная линия, однако, является более сложной из-за гораздо более длинного Regex Motorer:

shared/.*|^(?!shared/.*|iosApp/.*|androidApp/.*).*  build-all  true

Это соответствует пути в обоих Общий/ каталог, который находится в том месте, где находится наш код Kotlin Multiplatform, а также все, что не в Общий/ , iosapp/ или AndroidApp/ Каталоги, которые включают в себя любые другие файлы верхнего уровня. Мы установили параметр трубопровода сборка-все к правда , который запускает сборки приложений для обеих платформ.

Как указано в Продолжить-config.yml. После того, как сопоставление оценило все изменения и установить все соответствующие параметры трубопровода, CIRCLECI останавливает эту работу, и выступает из второй части этого динамического рабочего процесса. Вот полный файл:

version: 2.1
orbs:
  android: circleci/android@1.0.3
parameters:
  build-all:
    type: boolean
    default: false
  build-android:
    type: boolean
    default: false
  build-ios:
    type: boolean
    default: false
jobs:
  build-android:
    executor: android/android
    steps:
      - checkout
      - android/restore-build-cache
      - android/restore-gradle-cache
      - run:
          name: Build Android app
          command: ./gradlew androidApp:assembleDebug
      - android/save-gradle-cache
      - android/save-build-cache
      - store_artifacts:
          path: androidApp/build/outputs/apk/debug
  build-ios:
    macos:
      xcode: 12.4.0
    steps:
      - checkout
      - run:
          name: Allow proper XCode dependency resolution
          command: |
            sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
            rm ~/.ssh/id_rsa || true
            for ip in $(dig @8.8.8.8 bitbucket.org +short); do ssh-keyscan bitbucket.org,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
            for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
      - run:
          name: Install Gem dependencies
          command: |
            cd iosApp
            bundle install
      - run:
          name: Fastlane Tests
          command: |
            cd iosApp
            fastlane scan
      - store_artifacts:
          path: iosApp/fastlane/test_output
      - store_test_results:
          path: iosApp/fastlane/test_output/report.junit
workflows:
  run-android:
    when:
      or:
        - << pipeline.parameters.build-android >>
        - << pipeline.parameters.build-all >>
    jobs:
      - build-android
  run-ios:
    when:
      or:
        - << pipeline.parameters.build-ios >>
        - << pipeline.parameters.build-all >>
    jobs:
      - build-ios

Настройка: правда Линия здесь не включена, что указывает на то, что это «стандартный» файл конфигурации CIRCLECI. Он содержит Параметры Раздел с параметрами трубопроводов, которые мы определили на предыдущем этапе.

parameters:
  build-all:
    type: boolean
    default: false
  build-android:
    type: boolean
    default: false
  build-ios:
    type: boolean
    default: false

Чтобы использовать параметры трубопроводов, которые нам сначала нужно определить их в трубопроводе. Мы использовали их ранее. Теперь вы указываете их типы и значения по умолчанию: все логический и установить ложь Отказ

workflows:
  run-android:
    when:
      or:
        - << pipeline.parameters.build-android >>
        - << pipeline.parameters.build-all >>
    jobs:
      - build-android
  run-ios:
    when:
      or:
        - << pipeline.parameters.build-ios >>
        - << pipeline.parameters.build-all >>
    jobs:
      - build-ios

Как только параметры определены, мы можем использовать их при фильтрации рабочих процессов. В отличие от гораздо более простого конфигурации, показанного предыдущим разделом, нам нужно разделить задания на 2 рабочих процессах:

  • Работа для Android называется Run-Android
  • Работа для iOS названа Run-iOS.

Мы можем использовать Когда Stanza в сочетании с логическими операторами указать фильтры, когда для запуска определенного рабочего процесса. Для Android это либо сборка-все или Build-Android Параметр трубопровода. Для iOS, это Build-iOS или сборка-все Отказ

Этот рабочий процесс работает выборочно в зависимости от измененных файлов, которые запускают задания, относящиеся к рабочему процессу. Эта настройка позволяет вашей команде работать быстрее и эффективнее, пока все еще использует все возможности многоплатформы KMM.

В этом руководстве вы узнали, как настроить трубопровод, который создает мобильные проекты Kotlin Multiplatform на Circleci. Он похож на создание любого другого проекта, за исключением знания того, какую платформу для сначала построить. Мобильные платформы часто разрабатываются отдельно, поэтому мы использовали функцию Circleci Dynamic Configuration для создания только части разработчиков приложений в настоящее время работают.

Если у вас есть какие-либо вопросы или предложения об этой статье или идеям для будущих статей и гидов, обратитесь к мне на Твиттер — @zmarkan. или напишите мне Отказ

Оригинал: «https://dev.to/circleci/building-kotlin-multiplatform-projects-in-a-cicd-pipeline-142e»