Entry tags:
Special Enterprise Programming Olympics - первый результат
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Проект и инструкция по деплойменту: https://github.com/iced/worm-reports
На данный момент деплоймент этого дела выглядит как пошаговая стратегия.
Причем ребе айсед принимает активное участие в деплойменте, см https://github.com/iced/worm-reports/commits/ за 06.02
1) поставить curl 2) bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) [[ -s "/home/zju/.rvm/scripts/rvm" ]] && source "/home/zju/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* 3) source ~/.profile
инсталлятор меняет ~/.profile но в инструкции по rvm написано ~/.bash_profile
про ~/.profile сказано только в выводе bash
Первый затык:
инсталляция rvm и запуск rvm requirements выдает набор текста:
100 799k 100 799k 0 0 175k 0 0:00:04 0:00:04 --:--:-- 276k Upgrading the RVM installation in /home/zju/.rvm/ Removing rvm loading line from '/home/zju/.profile'. Adding rvm loading line to '/home/zju/.profile'. Upgrade Notes: * No new notes to display. # RVM: Shell scripts enabling management of multiple ruby environments. # RTFM: https://rvm.beginrescueend.com/ # HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net) # Screencast: http://screencasts.org/episodes/how-to-use-rvm # In case of any issues read output of 'rvm requirements' and/or 'rvm notes' Upgrade of RVM in /home/zju/.rvm/ is complete. # zju, # # Thank you for using RVM! # I sincerely hope that RVM helps to make your life easier and more enjoyable!!! # # ~Wayne zju@ubuntu00:~$ source ~/.profile zju@ubuntu00:~$ rvm requirements Requirements for Linux ( DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.04 DISTRIB_CODENAME=lucid DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS" ) NOTE: 'ruby' represents Matz's Ruby Interpreter (MRI) (1.8.X, 1.9.X) This is the *original* / standard Ruby Language Interpreter 'ree' represents Ruby Enterprise Edition 'rbx' represents Rubinius bash >= 4.1 required curl is required git is required (>= 1.7 for ruby-head) patch is required (for 1.8 rubies and some ruby-head's). To install rbx and/or Ruby 1.9 head (MRI) (eg. 1.9.2-head), then you must install and use rvm 1.8.7 first. Additional Dependencies: # For Ruby / Ruby HEAD (MRI, Rubinius, & REE), install the following: ruby: /usr/bin/apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsq lite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion # For JRuby, install the following: jruby: /usr/bin/apt-get install curl g++ openjdk-6-jre-headless jruby-head: /usr/bin/apt-get install ant openjdk-6-jdk # For IronRuby, install the following: ironruby: /usr/bin/apt-get install curl mono-2.0-devel
Я считаю, что это понятно только тому, кто варится в руби. Очевидно, админ-деплоер в норме руби знать не будет.
Далее, выполняем:
/usr/bin/apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
Я то знаю, что это значит, что нужно запускаться от root, но где это в документации? :)
Далее:
инструкция по rvm: rvm install 1.9.3
Инструкция айседа: rvm install 1.9.3 --default
Я знаю, чем это отличается и какую из команд выбрать, но будет ли это знать тот, кто выполняет деплоймент?
git checkout git@github.com:iced/worm-reports.git - тут ошибка, правильно
git clone https://github.com/iced/worm-reports.git или же скачать zip
далее: cd worm_reports -> cd worm-reports
далее: настраиваем postgresql и базу worm_reports_development. Это не относится к проекту, т.к. я сразу сказал что база будет готовая, но надо проверить как отработает миграция. Кстати, в инструкции нигде не сказано, что база должна быть создана и пользователь должен существовать):
1) sudo -u postgres psql
2) create user worm password 'worm' createdb;
3) \q
4) psql -U worm -d template1
5) create database worm_reports_development;
Далее bundle:
bundle Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /home/zju/.rvm/rubies/ruby-1.9.3-p0/bin/ruby extconf.rb checking for pg_config... no No pg_config... trying anyway. If building fails, please try again with --with-pg-config=/path/to/pg_config checking for libpq-fe.h... no Can't find the 'libpq-fe.h header *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/zju/.rvm/rubies/ruby-1.9.3-p0/bin/ruby --with-pg --without-pg --with-pg-dir --without-pg-dir --with-pg-include --without-pg-include=${pg-dir}/include --with-pg-lib --without-pg-lib=${pg-dir}/lib --with-pg-config --without-pg-config --with-pg_config --without-pg_config Gem files will remain installed in /home/zju/.rvm/gems/ruby-1.9.3-p0/gems/pg-0.12.2 for inspection. Results logged to /home/zju/.rvm/gems/ruby-1.9.3-p0/gems/pg-0.12.2/ext/gem_make.out An error occured while installing pg (0.12.2), and Bundler cannot continue. Make sure that `gem install pg -v '0.12.2'` succeeds before bundling. zju@ubuntu00:~/worm-reports$
не работает. Валится на сборке гема 'pg'. Ребе айсед пофиксил документацию, дописал нужную команду: apt-get install libpq-dev
Я бы это собрал и сам, но при деплойменте рыться в логах bundler и вспоминать в каком пакете живет хидер от postgresql - печально. Ладно, ставим libpq-dev, перезапускаем bundle. Откуда мы знаем, что повторный запуск безопасен? Ну, верим в честное слово линуксоидов, как обычно.
далее: можно пойти по оригинальной версии инструкции и запустить rake:dbmigrate:
rake aborted!
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.
(See full trace by running task with --trace)
читаем обновленнную версию инструкции и идем читать https://github.com/sstephenson/execjs и https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager (не забываем, мы деплоим у клиента, в ебенях ада, под чутким надзором службы безопасности и ИТ-службы клиента). Делаем, как там написано, ставим левый софт и левый репозиторий (http://ppa.launchpad.net/chris-lea/node.js/ubuntu/ lucid/main Translation-en_US):
sudo apt-get install python-software-properties sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs
Далее rake db:migrate, rake db:seed и rails -s отрабатывают как положено. Приложение отдеплоено (в девелопмент режиме, с Webrick?), будем проверять( инструкцию не читаем, само собой):
http://test:3000
Routing Error
No route matches [GET] "/"
Try running rake routes for more information on available routes.
zju@ubuntu00:~/worm-reports$ rails s => Booting WEBrick => Rails 3.2.1 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2012-02-06 14:27:13] INFO WEBrick 1.3.1 [2012-02-06 14:27:13] INFO ruby 1.9.3 (2011-10-30) [i686-linux] [2012-02-06 14:27:13] INFO WEBrick::HTTPServer#start: pid=26298 port=3000 Started GET "/" for 192.168.240.18 at 2012-02-06 14:29:11 +0300 ActionController::RoutingError (No route matches [GET] "/"): actionpack (3.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' actionpack (3.2.1) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' railties (3.2.1) lib/rails/rack/logger.rb:26:in `call_app' railties (3.2.1) lib/rails/rack/logger.rb:16:in `call' actionpack (3.2.1) lib/action_dispatch/middleware/request_id.rb:22:in `call' rack (1.4.1) lib/rack/methodoverride.rb:21:in `call' rack (1.4.1) lib/rack/runtime.rb:17:in `call' activesupport (3.2.1) lib/active_support/cache/strategy/local_cache.rb:72:in `call' rack (1.4.1) lib/rack/lock.rb:15:in `call' actionpack (3.2.1) lib/action_dispatch/middleware/static.rb:53:in `call' railties (3.2.1) lib/rails/engine.rb:479:in `call' railties (3.2.1) lib/rails/application.rb:220:in `call' rack (1.4.1) lib/rack/content_length.rb:14:in `call' railties (3.2.1) lib/rails/rack/log_tailer.rb:14:in `call' rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service' /home/zju/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service' /home/zju/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run' /home/zju/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' Rendered /home/zju/.rvm/gems/ruby-1.9.3-p0/gems/actionpack-3.2.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (2.1 ms)
Ответ ребе айседа: "http://test:3000/reports блядь". В документации это написано, но мы ее не читаем, само собой(ибо заебались от предыдущего всего).
TL;DR: У меня приложение поставилось (по последней версии инструкции) без явных проблем, вперемежку с записью результатов в ЖЖ и спорами с айседом. Тем не менее, первая версия инструкции содержала ошибки и несколько умолчаний (nodejs, lib_pqdev).
У
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Частично проблема в том, что она спешит, не всегда читает вывод команд и промахивается по кнопкам, а опыта для диагностики странных ошибок по оккультным сообщениям у нее недостаточно. Как минимум, один такой случай я видел.
(переформулирую более литературно: у нее мало опыта, чтобы не допускать чортово вуду на автомате(как это делают айсед, я и прочие ребе) и мало опыта, чтобы допущенное чортово вуду исправлять, исходя из оккультной симптоматики).
Проблемы:
1) .bash_profile и .profile - это упоминается в выводе инсталлятора rvm, но среди полстраницы вывода нужно заметить это и увязать с тем, что нужно выполнить source ~/.profile а не source ~/.bash_profile, как написано на сайте rvm. Т.е. "ответвление в инструкции".
2) rvm не поставился. По той причине, что rvm requirements не выдал список требований. Я не знаю, почему.
3) Вывод rvm requirements понятен только тем, кто варится в руби или вообще в разработке под линукс.
Итого: подобный деплоймент годится только для разработчиков или продвинутых админов, которым не влом делать весь вышеописанный ад.
Как бы переделал инструкцию по деплойменту:
1) Все инструкции с внешних сайтов перенес бы в свою.
2) Для каждой команды добавил бы подробное описание, что она делает, и какой должен быть вывод. Это обязательно, т.к. даже я не знаю, что делает та или иная команда и верно ли она отработала - это я решал при своем деплойменте реально НАУГАД.
Насчет того, что ставить надо из пакетов и реп: все верно, но ребе айсед сознательно выбрал идеологически другой метод, т.е. формально его сравнить с пакетным менеджером и прочим сложно. Как лучше делать, я не знаю. Лично я бы предпочел стабильный метод с пакетами, потому что мне подобная идеология ближе.
Приложение работает, его я оттестирую чуть попозже.
no subject
no subject
no subject
no subject
Enterprise в первую очередь - это интеграция, воспроизводимость и проверяемость решения. И интеграции там столько же сколько и кодирования. И тестирования столько же сколько кодирования.
Метакласс, как QA-инженер - доставляет. Задаёт правильные тупые вопросы (без подъёбки). У девелоперов мозги набекрень, они свою систему видят с очень своеобразного угла зрения.
no subject
2. наш продукт используют разные такие кастомеры типа делла или там ебэя. отказ сервиса по причине того что бабуин-мэйнейнер руби пережрал говна и всё сломал нам не нужны. всё ставится на отдельный сервак, тестируется, и деплоится (scp вроде, мне не интересно) на все остальные сервера. проблем это за 2 года не вызывало. не, я понимаю что бебиановский руби пригоден для чего то там на бебиановском лайвцд, good for you, нам он не подходит.
no subject
"Всё ставится на отдельный сервак, тестируется, и деплоится" - интересует первая фаза процесса, "ставится на отдельный сервак". Это такой же закат солнца вручную, как описано в мурзилке README.md ?
no subject
no subject
1.8.6-p420
1.8.7-p357
1.9.1-p378
1.9.1-p431
1.9.2-p180
1.9.2-p290
1.9.3-preview1
1.9.3-rc1
1.9.3-p0
(не считая ree конечно) на бабуин штатными средствами?
no subject
Последовательность деплоймента - скриптуется или нет?
Или ты слышишь только вопросы голосов из розетки?
no subject
no subject
no subject
no subject
no subject
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(Anonymous) - 2012-02-07 06:24 (UTC) - Expand(no subject)
(Anonymous) - 2012-02-07 06:36 (UTC) - Expand(no subject)
(no subject)
(no subject)
no subject
no subject
и таки пакетировать 20 разных рубей... нахуя? в мире руби rvm это preferred way для деплоя.
алсо, у нас в планах далеко не только уебунта. вот я не знаю что там на engineyard например, но хорошие шансы что не уебунта. и чо - потом 200 дистров поддерживать? НАХУЙ.
ну и щемта у нас вот с таким подходом всё хорошо. за 2 года проблемы конечно были - но ни одна из них не была по причине рвма и такого деплоя (исключительно баги в нашем софте написанные лично нами).
no subject
(Anonymous) 2012-02-06 03:26 pm (UTC)(link)У нас с вами разные миры Ruby. Для деплоя или собирают свои пакеты .deb, .rpm и т.д., или ставят конкретную версию (которая крутится на стейджинге у QA и на машинах с CI) через скриптовые системы деплоймента. RVM в продакшине использовать бессмысленно (как и rbenv). Ломался этот РВМ не раз, и ставить стороннюю девелоперскую (т.е. расчитаную на девелоперскую машину с 100500 разными версиями руби) прослойку на продакшин на я не вижу ни малейшего резона.
Каким образом проходит ваш процесс деплоя? Я подозреваю, что при выходе новых патчей на руби вы обновляете эталонный образ и перестартуете все инстансы с перезаливкой туда этого образа?
no subject
Ну т.е. нашлась там в рельсах дыра, или в либе, с которой руби слинкованы (ssl например) ?
no subject
дыра в либе из пакетов: апдейт приезжает из репов; если нужно — rvm reinstall ruby_version
дыра в либе из .rvm/usr: rvm get stable, rvm reinstall ruby_version
no subject
Там есть какие-то релизы для которых делаю секьюрити фиксы без изменения функциональности? Т.е. такая операция не сломает че-нить в приложении?
Кстати, rvm же умеет всё своё хозяйство класть хомяк юзеру?
no subject
no subject
no subject
Осталось приделать систему сборки бинарных пакетов.
no subject