В Inato все наши веб-приложения содержатся в одном монорепозитории (интерфейсные приложения, API и т. Д.). Мы используем рабочие области пряжи для управления всеми этими пакетами.

Для размещения и запуска наших приложений мы используем Heroku.

Стандартная установка Heroku работает только для варианта использования 1-app-1-repo.

Итак, вот краткое руководство о том, как размещать и запускать несколько приложений из нескольких рабочих областей пряжи, содержащихся в одном репозитории Git на Heroku.

Отказ от ответственности: это руководство предполагает базовые знания Heroku (см. Начало работы).

Допустим, у вас есть один репозиторий Git, содержащий несколько приложений в рабочих областях пряжи, например:

.
├── package.json
├── packages
│   ├── web-client
│   │   └── package.json
│   └── api
│       └── package.json
└── scripts
    └── heroku.build

И web-client, и api - это веб-приложения, которые должны быть доступны в сети.

Использование одного Procfile для открытия нескольких веб-процессов в Heroku невозможно. Вы не сможете иметь api и web в файле Procfile, открывающем веб-приложения. Т.е. это не работает:

web: yarn workspace web-client start
api: yarn workspace api start

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

из документации Heroku.

Правильный способ сделать это:

  • Создайте по одному дино для каждого приложения (рабочего пространства), которое вы хотите запустить.
  • Используйте пакет сборки с несколькими процессами
  • При желании используйте переменные среды, чтобы настроить шаг сборки

Вот подробности:

1. Создайте по одному дино для каждого приложения (рабочего пространства), которое вы хотите запустить.

Создайте одно приложение Heroku с именем для каждого веб-приложения с помощью интерфейса командной строки Heroku и привяжите его к удаленному Git.

$ heroku create web-client --remote heroku-web-client
$ heroku create api --remote heroku-api

Здесь web-client - это имя приложения Heroku, которое сделает приложение доступным по адресу http://web-client.herokuapp.com, а heroku-web-client - это имя git remote. указывая на это приложение heroku и позволяет развернуть ваш код в одном или другом приложении следующим образом:

$ git push heroku-web-client master

2. Используйте многопроцессорный сборочный пакет.

Вам нужно указать Heroku, как запускать каждое из ваших приложений. Команда Heroku предоставила для этого сборочный пакет: Сборочный пакет Heroku Multi Procfile.

Представьте, что у вас есть единая кодовая база, в которой есть несколько разных приложений ... или, по крайней мере, возможность запускать несколько разных приложений. Или, может быть, вы используете Google со своим моно-репо?

В любом случае, как вам это удается на Heroku? Вы этого не сделаете. Приложения Heroku предполагают наличие одного репозитория для одного приложения.

Войдите в пакет сборки Multi Procfile, в котором каждое приложение получает Procfile!

- Напишите кучу Procfiles и разбросайте их по своей кодовой базе.

- Создайте кучу приложений Heroku.

- Для каждого приложения установите PROCFILE=relative/path/to/Procfile/in/your/codebase и, конечно же: heroku buildpacks:add -a <app> https://github.com/heroku/heroku-buildpack-multi-procfile

- Для каждого приложения git push [email protected]:<app> master

В нашем примере у нас будет один файл Procfile для каждой рабочей области:

.
├── package.json
├── packages
│   ├── web-client
│   │   ├── Procfile
│   │   └── package.json
│   └── api
│       ├── Procfile
│       └── package.json
└── scripts
    └── heroku.build

содержащий, например:

web: yarn workspace api start

3. При необходимости используйте переменные среды, чтобы настроить шаг сборки.

По умолчанию Heroku устанавливает только Node и запускает yarn install (так называемый этап сборки). Если вам действительно нужно что-то построить (например, ваш интерфейсный пакет), вы можете использовать heroku-postbuild для задач, специфичных для Heroku (документация), которая находится в разделе scripts вашего package.json верхнего уровня.

Используя переменные среды, вы можете заставить этот скрипт выполнять разные задачи в зависимости от приложения.

Пример:

Вот и все !

С помощью этих шагов вы можете создавать и запускать различные приложения из вашего монорепозитория.