written on Thursday, August 14, 2014
Вот например у нас сейчас есть такой сайт eusign.org. Про сайт я конечно тоже напомню, чтобы все знали, какую крутую штуку мы сейчас делаем.
Делаем мы веб-приложение, чтобы создавать, подписывать и пересылать электронные документы. ДСТУ 4145-2002, Гостовые шифры, OAuth2, PKCS#7 и маркдаун. Хардкор вобщем.
Чтобы весь этот хардкор работал, нужно мешок серверных зависимостей, сишные модули к ним, какой-то всякий жаваскрипт, собирающийся браузерифи, статические файлы, менеджащиеся бовером, переводы еще. Надо же как-то суржик поддерживать и инглиш.
Сам по себе пайтон код деплоится очень просто. Закинул в каталог, выдал пинка через сигнал контейнер демону и все - новый код уже сервится. Заливать можно хоть через rsync, хоть через git, хоть тарболы по scp гонять.
Но вот у кода есть куча зависимостей, у зависимостей есть сишные расширения и уже на сервер притащили gcc, девелопмент пакеты от пайтона и постргреса. Мне такое не нравится конечно, но пока весь треш и праздник рубизма происходит в virtualenv - это еще ладно.
Но тут приходит Мойша и вот на сервере уже нужно сразу мешок всего - руби, ноду, бовер, лесс, процессить файлы локализации. NYET NYEVOZMOZHNO.
Пришлось садиться и делать красиво. Репозиторий подцепляется к кодшипу, там запускается make setup и все скомпиленные статические файлы в готовом виде улетают на сервер рсинком.
Но не тут-то было. Виртуаленв, в отличии от статических файлов, нельзя просто так взять и перетащить с одной машины на другую. Все ломался, пути не совпадают, версии библиотек, архитектура.
А счастье было так близко.
В итоге проблему пришлось решать по хардкору - поставить все пайтоновые зависимости в 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. Моего уровня правда не хватило на метапакет, но уже неплохо.
В итоге процедура получилась такая: