Обзор
После того как ваше приложение собрано и протестировано локально, у вас есть два пути для его распространения:- Разверните tar-архив — загрузите своё приложение напрямую на конкретный сервер Twenty для внутреннего или частного использования.
- Опубликовать в npm — разместите ваше приложение в маркетплейсе Twenty, чтобы любое рабочее пространство могло его найти и установить.
Сборка вашего приложения
Выполните команду сборки, чтобы скомпилировать приложение и сгенерировать готовый к распространениюmanifest.json:
.twenty/output/. Добавьте --tarball, чтобы также создать пакет .tgz для ручного распространения или для команды publish.
Развертывание на сервер (tarball)
Для приложений, которые вы не хотите делать общедоступными — собственные инструменты, интеграции только для предприятий или экспериментальные сборки — вы можете развернуть tarball напрямую на сервер Twenty.Требования
Перед развертыванием вам нужен настроенный remote, указывающий на целевой сервер. Remotes локально хранят URL сервера и учётные данные аутентификации в~/.twenty/config.json.
Добавьте remote:
Развертывание
Соберите и загрузите ваше приложение на сервер в одном шаге:Общий доступ к развернутому приложению
Приложения в формате tarball не отображаются в публичном маркетплейсе, поэтому другие рабочие пространства на том же сервере не найдут их при просмотре. Чтобы поделиться развернутым приложением:- Перейдите в Настройки > Приложения > Регистрации и откройте ваше приложение
- На вкладке Распространение нажмите Копировать ссылку для общего доступа
- Поделитесь этой ссылкой с пользователями в других рабочих пространствах — она ведёт их прямо на страницу установки приложения
Управление версиями
При обновлении уже развернутого tarball-приложения сервер требует, чтобы значениеversion в package.json было строго выше (согласно упорядочиванию по semver), чем текущая развернутая версия. Повторное развёртывание той же версии или публикация более низкой версии отклоняются до сохранения tarball — в CLI вы увидите ошибку VERSION_ALREADY_EXISTS.
Чтобы выпустить обновление:
- Увеличьте значение поля
versionв вашемpackage.json(например:1.2.3→1.2.4,1.3.0или2.0.0). - Выполните
yarn twenty app:publish --private(илиyarn twenty app:publish --private --remote production) - Рабочие пространства, в которых приложение установлено и для него включено автообновление (на вкладке «Настройки» приложения), обновляются автоматически в фоновом режиме; в остальных рабочих пространствах пользователи увидят доступное обновление в своих настройках
Пререлизные теги работают как ожидается: повышение версии
1.0.0-rc.1 → 1.0.0-rc.2 допускается, а финальный релиз вроде 1.0.0 корректно распознаётся как более высокий, чем 1.0.0-rc.5. Версия в package.json должна сама по себе быть корректной строкой semver.Совместимость версий сервера
Если ваше приложение использует функцию, появившуюся в конкретной версии сервера Twenty (например, провайдеры OAuth, добавленные в v2.3.0), следует объявить минимальную требуемую версию сервера с помощью поляengines.twenty в package.json:
Что происходит при развёртывании и установке:
- Если
engines.twentyзадано и версия целевого сервера не удовлетворяет диапазону, развёртывание (загрузка tarball-архива) или установка отклоняются с ошибкойSERVER_VERSION_INCOMPATIBLEи сообщением, указывающим как требуемый диапазон, так и фактическую версию сервера. - Если
engines.twentyне задано, приложение принимается на сервере любой версии (обратная совместимость с существующими приложениями). - Если на сервере
APP_VERSIONне задано, проверка пропускается.
Сервер выполняет окончательную проверку — он проверяет
engines.twenty как при загрузке tarball-архива, так и при установке в рабочем пространстве. Если вы развёртываете tarball вне стандартного процесса или устанавливаете из маркетплейса, сервер всё равно принудительно проверяет совместимость.Автоматизированный CI/CD (рабочие процессы, сгенерированные шаблоном)
Приложения, созданные с помощьюcreate-twenty-app, «из коробки» включают три рабочих процесса GitHub Actions в каталоге .github/workflows/. CI запускается без какой-либо настройки, для CD требуется один секрет, а публикация в npm требует однократной настройки доверенного издателя npm (trusted-publisher).
CI — ci.yml
Автоматически запускает интеграционные тесты при каждом пуше в main и для каждого pull request.
Что делает:
- Извлекает исходный код вашего приложения.
- Запускает изолированный тестовый экземпляр Twenty с помощью составного действия
twentyhq/twenty/.github/actions/spawn-twenty-app-dev-test@main(эквивалент для CIyarn twenty docker:start --test). - Включает Corepack, настраивает Node.js на основе вашего
.nvmrcи устанавливает зависимости с помощьюyarn install --immutable. - Запускает
yarn test, передаваяTWENTY_API_URLиTWENTY_API_KEYиз запущенного экземпляра, чтобы ваши тесты могли взаимодействовать с реальным сервером.
TWENTY_VERSION(переменная окружения, по умолчаниюlatest) — зафиксируйте версию сервера Twenty, используемую в CI, отредактировав это значение вci.yml.- Параллельные запуски группируются по
github.refи отменяют выполняющиеся прогоны при новых пушах.
CD — cd.yml
Разворачивает ваше приложение на настроенном сервере Twenty при каждом пуше в main и, при необходимости, из pull request при наличии метки deploy.
Что делает:
- Извлекает head-коммит PR (для PR с меткой) или запушенный коммит.
- Запускает
twentyhq/twenty/.github/actions/deploy-twenty-app@main— эквивалент для CIyarn twenty app:publish --private. - Запускает
twentyhq/twenty/.github/actions/install-twenty-app@main, чтобы новая развернутая версия была установлена в целевое рабочее пространство.
Значение
TWENTY_DEPLOY_URL по умолчанию — http://localhost:3000 — это заглушка: с хостируемого GitHub раннера к ней не будет доступа. Перед включением CD замените его на публичный URL вашего сервера (или используйте self-hosted раннер с сетевым доступом).deploy. Условие if: в cd.yml запустит задачу для этого PR, используя его head-коммит, что позволит проверить изменение на целевом сервере до слияния.
Публикация — publish.yml
Публикует ваше приложение в npm с указанием происхождения (provenance), когда вы отправляете тег версии (например, v1.0.0), или когда вы запускаете рабочий процесс вручную на вкладке Actions.
Что делает:
- Клонирует ваше приложение, настраивает Node.js и обновляет npm (для доверенной публикации требуется npm версии 11.5.1 или новее).
- Запускает
yarn twenty app:publish, который собирает приложение и публикует.twenty/outputв npm. В CI он автоматически добавляет--provenanceи--access public, поэтому в рабочем процессе флаги не требуются.
publish.yml (см. документацию по доверенной публикации в npm). Публикация с provenance подтверждает, какой репозиторий GitHub собрал пакет, а также позволяет вам заявить права на ваше приложение в маркетплейсе Twenty.
npm принимает подтверждение происхождения только из публичных репозиториев с исходным кодом. Если вы публикуете из приватного репозитория, npm отклоняет пакет подтверждения происхождения OIDC с ошибкой
E422 ... Ошибка Unsupported GitHub Actions source repository visibility: “private”. Чтобы публиковать из приватного репозитория, отключите подтверждение происхождения, установив TWENTY_APP_PUBLISH_DISABLE_PROVENANCE: ‘true’вenvшага публикации (закомментированная подсказка включена в сгенерированныйpublish.yml`):Закрепление версий повторно используемых действий
Рабочие процессыci.yml и cd.yml ссылаются на повторно используемые действия с указанием @main, поэтому обновления действий в репозитории twentyhq/twenty подхватываются автоматически. Если вам нужны детерминированные сборки, замените @main на SHA коммита или тег релиза в каждой строке uses:.
Публикация в npm
Публикация в npm делает ваше приложение видимым в маркетплейсе Twenty. Любое рабочее пространство Twenty может просматривать, устанавливать и обновлять приложения из маркетплейса непосредственно из интерфейса.Требования
- Учётная запись npm
- Ключевое слово
twenty-appв массивеkeywordsвашегоpackage.json(добавьте его вручную — по умолчанию оно не включено в шаблонcreate-twenty-app)
Метаданные маркетплейса
КонфигурацияdefineApplication() поддерживает необязательные поля, которые определяют, как ваше приложение отображается в маркетплейсе. Используйте logo и galleryImages, чтобы ссылаться на изображения из папки public/:
src/application-config.ts
author, category, aboutDescription, websiteUrl, termsUrl и т. д.).
Рекомендуемые размеры изображений галереи
Маркетплейс отображаетgalleryImages в контейнере с фиксированным соотношением сторон 8:5 (например, 1600×1000 px).
Изображения галереи с любым соотношением сторон отображаются полностью и никогда не обрезаются, но всё, что значительно выше или уже, чем
8:5, будет иметь пустые поля по бокам.Ограничение размера изображения
Файлlogo и каждый файл из galleryImages не должны превышать 10 MB. Более крупные файлы пропускаются при повторном размещении ваших опубликованных ресурсов на маркетплейсе, поэтому они не будут отображаться.
Публикация
beta или next):
Как работает обнаружение приложений в маркетплейсе
Сервер Twenty синхронизирует каталог маркетплейса из реестра npm каждый час. Вы можете запустить синхронизацию немедленно, вместо ожидания:defineApplication() — см. раздел Метаданные маркетплейса выше.
Если ваше приложение не определяет
aboutDescription в defineApplication(), маркетплейс автоматически использует README.md вашего пакета из npm в качестве содержимого страницы «О приложении». Это означает, что вы можете поддерживать единый README как для npm, так и для маркетплейса Twenty. Если вы хотите другое описание в маркетплейсе, явно задайте aboutDescription.Публикация через CI
Сгенерированный выше рабочий процессpublish.yml автоматически публикует в npm по тегам версий, с provenance. Поскольку yarn twenty app:publish при запуске в CI добавляет за вас --provenance и --access public, в рабочем процессе не нужны флаги npm — требуется только однократная настройка доверенного издателя.
Для других систем CI (GitLab CI, CircleCI и т. д.) запустите yarn install, затем yarn twenty app:publish. Provenance создается, когда среда может выпустить токен OIDC, и в противном случае автоматически пропускается.
npm provenance добавляет значок доверия к вашему пакету в npm, позволяя пользователям проверить, что пакет был собран из конкретного коммита в общедоступном конвейере CI. Это также то, что позволяет вам заявить права на ваше приложение в маркетплейсе Twenty. Подробности см. в документации по npm provenance.
Установка приложений
После публикации приложения (npm) или его развертывания (tarball) рабочие пространства могут установить его через интерфейс. Перейдите на страницу Настройки > Приложения в Twenty, где можно просматривать и устанавливать как приложения из маркетплейса, так и развернутые через tarball. Вы также можете устанавливать приложения из командной строки:Сервер при установке применяет версионирование semver, аналогичное правилам при развёртывании:
- Установка той же версии, которая уже установлена в вашем рабочем пространстве, отклоняется с ошибкой
APP_ALREADY_INSTALLED. - Установка версии ниже текущей отклоняется с ошибкой
CANNOT_DOWNGRADE_APPLICATION.
yarn twenty app:install.