Как настроить Circleci для монорепозитория

Возможно, вы захотите настроить ci для своего monorepo. В этой статье мы увидим, как использовать Circleci внутри моно-репозитория. Этот пост предполагает, что вы уже знакомы с процессом monorepo и непрерывной интеграции с Circleci.

Мы будем использовать версию 2.0 API CircleCI. Вы можете ознакомиться с API здесь. В этой версии они позволяют запускать рабочий процесс из вызова API. Теперь вы можете использовать разные рабочие процессы для каждого проекта внутри вашего monorepo. Основная идея здесь состоит в том, чтобы инициировать рабочий процесс на основе логических параметров, которые вы включаете или нет.

Примечание. В этой статье мы не будем сосредотачиваться на том, что именно мы делаем внутри нашего ci, и на лучших практиках внутри circleci. Мы сосредоточимся только на том, как мы запускаем рабочие процессы. Вы можете посмотреть на окончательный результат на github здесь.

Параметры

В вашем файле .circleci/config.yml вы можете определить параметры. Это просто переменные, к которым вы можете получить доступ внутри этого файла. Когда вы запускаете CircleCI для этого проекта, вы можете изменить значение этих параметров. Вы можете найти больше информации об этой части API здесь

  • Мы указываем параметр trigger в true. Это будет логическое значение, которое запускает или не запускает основной рабочий процесс.
  • Мы также добавили по одному параметру на пакет (и components), по умолчанию мы установили для него значение false.

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

Рабочие процессы внутри монорепозитория

Давайте углубимся в часть конфигурации рабочего процесса .circleci/config.yml. У нас есть три различных рабочих процесса:

  • что является основным рабочим процессом. Он установит зависимости пакетов. Кроме того, он будет нести ответственность за запуск другого рабочего процесса.
  • определить рабочий процесс пакета core
  • components определить рабочий процесс пакета components

Вы можете заметить, что у нас есть условие для запуска каждого из них с условием when. Условие должно соответствовать переменной параметра, определенной ранее. Вот почему у нас есть when: << pipeline.parameters.components >> для запуска рабочего процесса components.

Запуск рабочего процесса в монорепозитории

В этой части мы рассмотрим, как мы запускаем различные рабочие процессы в монорепозитории. Вот задание trigger-workflows

trigger-workflows запускайте только файл javascript, который отвечает за триггерные рабочие процессы. Вот circleci.js

В этом файле:

  • выполняем команду npx lerna changed --all чтобы увидеть пакеты которые изменились
  • мы берем вывод этой команды, чтобы увидеть, какое изменение пакета
  • для каждого измененного пакета мы запускаем API circleci и сообщаем о выполнении рабочего процесса, который соответствует имени нашего пакета. мы также помещаем trigger в false, поэтому базовый ci не будет выполняться.

Примечание:

  • CIRCLE_TOKEN — это ваш личный токен, который позволяет запускать рабочий процесс.
  • CIRCLE_PROJECT_USERNAME и CIRCLE_PROJECT_REPONAME вводятся Circleci, поэтому нам не нужно об этом заботиться.

Вот и все ! Вы увидите, как создавать разные рабочие процессы и запускать их в свой моно-репозиторий. Я добавил простой пример на github здесь. Цель этого примера — сосредоточиться на том, как мы запускаем рабочий процесс для монорепозитория, а не на том, что мы делаем внутри рабочих процессов. Как только вы увидите, как создать рабочий процесс для монорепозитория, вы сможете легко адаптировать его к своим потребностям в непрерывной интеграции. Эта статья была вдохновлена ​​предыдущей публикацией, сделанной Реувеном Харрисоном (доступно здесь) и Димитру Девятии (доступно здесь) . Вы можете взглянуть на эти посты, в которых говорится об одной и той же теме, они являются хорошим ресурсом.

Последнее примечание: английский не является моим родным языком, поэтому, если вы обнаружите ошибку в этой статье, не стесняйтесь связаться со мной.

Первоначально опубликовано на https://tech.julienkarst.com 19 ноября 2019 г.