Пузырь состоит из 4 основных компонентов:
- Бэкэнд обрабатывает все соединения чата, т. е. соединения socket.io, базу данных
- Веб-приложение, это https://app.getbubblechat.com
- Целевая страница, https://getbubblechat.com
- 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 мог обслуживать эти файлы). Как ваша команда выполняет развертывание?