Деплоймент

written on Thursday, August 14, 2014

Вот например у нас сейчас есть такой сайт eusign.org. Про сайт я конечно тоже напомню, чтобы все знали, какую крутую штуку мы сейчас делаем.

Делаем мы веб-приложение, чтобы создавать, подписывать и пересылать электронные документы. ДСТУ 4145-2002, Гостовые шифры, OAuth2, PKCS#7 и маркдаун. Хардкор вобщем.

Чтобы весь этот хардкор работал, нужно мешок серверных зависимостей, сишные модули к ним, какой-то всякий жаваскрипт, собирающийся браузерифи, статические файлы, менеджащиеся бовером, переводы еще. Надо же как-то суржик поддерживать и инглиш.

Суть проблемы

Сам по себе пайтон код деплоится очень просто. Закинул в каталог, выдал пинка через сигнал контейнер демону и все - новый код уже сервится. Заливать можно хоть через rsync, хоть через git, хоть тарболы по scp гонять.

Но вот у кода есть куча зависимостей, у зависимостей есть сишные расширения и уже на сервер притащили gcc, девелопмент пакеты от пайтона и постргреса. Мне такое не нравится конечно, но пока весь треш и праздник рубизма происходит в virtualenv - это еще ладно.

Но тут приходит Мойша и вот на сервере уже нужно сразу мешок всего - руби, ноду, бовер, лесс, процессить файлы локализации. NYET NYEVOZMOZHNO.

Codeship

Пришлось садиться и делать красиво. Репозиторий подцепляется к кодшипу, там запускается make setup и все скомпиленные статические файлы в готовом виде улетают на сервер рсинком.

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

А счастье было так близко.

Ubuntu PPA

В итоге проблему пришлось решать по хардкору - поставить все пайтоновые зависимости в virtualenv, зафризить список и по нему скачать из чизишопа все что нужно.

Дальше по этому пройтись шикарной утилитой stdeb и получить пакеты, пригодные для аплоада в PPA.

Вот как-то так для каждого:

python setup.py --command-packages=stdeb.command sdist_dsc -z trusty
debsign ./deb_dist/${fname}.changes -k$GPGKEY
dput ppa:ilya-muromec/python ./deb_dist/${fname}.changes

Ну для некоторых пришлось подкрутить чего, чтобы не было глитчей, типа python-python-social-auth, несовпадений с уже существующим пакетами и всего такого.

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

Результат

В итоге процедура получилась такая:

  • свой пайтоновый код живет в репозитории и ставится из него же
  • ништяки, типа секрета для кук и конекнеша к базе в репозе не лежат, а лежат в локальном файле
  • все зависимости, которые нужны для работы сервера (не для сборки), ставятся заранее через apt-get
  • сборка статических файлов проходит на кодшипе - весь less, browsefiry, babel и bower вместе с нодой и рубями ставится туда и запускается там, а результирующий набор кода, файлов, переводов прилетает на рабочий сервер через rsync
  • финальным аккордом запускается миграция и пинок контейнеру, чтобы обновил код

This entry was tagged code and ops