Monorepo — это структура репозитория, в которой несколько проектов или пакетов хранятся в одном репозитории. Для таких структур важным аспектом является настройка эффективных процессов CI/CD, которые обеспечивают автоматическую сборку, тестирование и развертывание всех проектов или пакетов в рамках репозитория.
В контексте Stencil, фреймворка для создания веб-компонентов, настройка CI/CD для monorepo может быть достаточно сложной задачей, но она значительно повышает эффективность разработки и сокращает время на релиз. С помощью правильной настройки можно легко интегрировать и тестировать различные компоненты, ускорить разработку и развертывание, а также предотвратить ошибки на различных этапах жизненного цикла проекта.
Для организации репозитория в стиле monorepo можно использовать несколько подходов. Например, структура может быть такой:
/root
/packages
/component1
/component2
/shared
/apps
/app1
/app2
/scripts
package.json
lerna.json
Для настройки эффективного CI/CD в монорепозитории могут использоваться различные инструменты. Один из самых популярных — Lerna, который помогает управлять многими пакетами в одном репозитории. Помимо Lerna, можно использовать Nx или Turborepo.
В процессе CI/CD для monorepo важно обеспечить несколько вещей:
Для этого важно интегрировать систему непрерывной интеграции и доставки (CI/CD) с инструментами управления пакетов и версиями. Рассмотрим пример настройки с использованием GitHub Actions и Lerna.
Создайте файл .github/workflows/ci.yml, в котором будет
описан процесс CI для вашего репозитория. Пример базового workflow:
name: CI for Stencil Monorepo
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: |
npm ci
- name: Lerna bootstrap
run: |
npx lerna bootstrap
- name: Run tests for all packages
run: |
npx lerna run test --stream
Чтобы ускорить процесс, можно добавить шаги для кэширования зависимостей и собранных данных:
- name: Cache Node modules
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
Этот шаг позволяет кэшировать директории с зависимостями, что ускоряет сборку при последующих запусках.
Для публикации новых версий пакетов, используйте Lerna. Важно настроить его так, чтобы он только обновлял версию тех пакетов, которые действительно изменились.
В Lerna можно настроить автоматическое увеличение версий через команду:
npx lerna version
Этот процесс можно интегрировать в GitHub Actions, чтобы автоматически публиковать новые версии пакетов при каждом слиянии в основной бранч.
Для деплоя можно настроить отдельные шаги в CI/CD pipeline для каждого приложения в monorepo. Например, если приложение использует компоненты из Stencil, можно настроить деплой с помощью Netlify или Vercel.
Пример конфигурации для Vercel:
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
Таким образом, можно настроить деплой каждого приложения, при этом не затрагивая остальную часть репозитория.
Для повышения производительности CI/CD в монорепозитории важно минимизировать количество задач, выполняемых на каждом шаге. Для этого можно использовать следующие подходы:
CI/CD для monorepo с использованием Stencil требует внимательной настройки для оптимизации работы с несколькими пакетами, но с правильной конфигурацией можно значительно улучшить производительность разработки и развертывания. Важно правильно настроить все этапы — от установки зависимостей до деплоя, чтобы каждый компонент репозитория получал свою обработку в нужный момент времени, при этом минимизируя излишние операции и ускоряя процесс развертывания.