Пузырь состоит из 4 основных компонентов:

  1. Бэкэнд обрабатывает все соединения чата, т. е. соединения socket.io, базу данных
  2. Веб-приложение, это https://app.getbubblechat.com
  3. Целевая страница, https://getbubblechat.com
  4. Android-приложение

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

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

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

Вот текущая итерация моего сценария развертывания, который находится в производственной коробке. (К сожалению, я не проверил это в системе управления версиями, поэтому не могу рассказать, как этот скрипт превратился из простого двухстрочного в 10-строчный, что по-прежнему не так уж и много, что имеет примитивную поддержку для резервного копирования.) Сценарий развертывания относительно прост. , и я сильно аннотировал этот скрипт для целей этого поста.

# deploy.sh
# goes into the right directory, and pwd for sanity checking
cd bubble
pwd
# pull master (we also have travis-ci set up for master)
# https://travis-ci.org/CS3216-Bubble/bubble
# and install any new deps (npm-shrinkwrap to lock deps)
# https://docs.npmjs.com/cli/shrinkwrap
git pull
npm install --no-progress
# remove any old backups lying around
if [ -f ./dist-prev ]; then
  rm -rf ./dist-prev
fi
# build fails when we lock fsevents
# the problem occurs because I develop on a mac,
# and shrinkwrap generates a fsevents version for mac
# but our prod instance is a fedora, and it grabs the wrong
# version of fsevents.
# since npm-shrinkwrap.json doesn't change much, I manually edit it.
# https://github.com/npm/npm/issues/2679
grep 'fsevents' npm-shrinkwrap.json && (echo "remove fsevents from shrinkwrap" && exit 1)
# back up current working dist, allows for easy recovery
# in case the new build causes problems
cp -r dist/ dist-prev/
# finally build, this will compile our app into dist/
npm run build
# reserve and serve are npm run scripts that call into forever,
# it restarts a script if running, else it starts it
# https://github.com/foreverjs/forever
npm run reserve || npm run serve

Мой шаг развертывания:

ssh bubble # ssh into production box, set this up in .ssh/config
./deploy.sh # the same script as above

Я мог бы также добавить скрипт для автоматического отката, но я понял, что делаю откаты недостаточно часто (пока что сделал это только один раз). Кроме того, у нас в любом случае настроен travis-ci, так что мы будем знать, когда мастер выйдет из строя.

Эта стратегия развертывания проста, легка для понимания и отлично сработала для моей команды. Я использую ту же стратегию и для других компонентов: простой скрипт, который выполняет git pull, запускает любой шаг сборки и, при желании, копирует встроенные файлы в другой каталог (например, на целевую страницу, чтобы nginx мог обслуживать эти файлы). Как ваша команда выполняет развертывание?