metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-06 01:42 pm

Special Enterprise Programming Olympics - первый результат

[livejournal.com profile] theiced:
Проект и инструкция по деплойменту: 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] kometa_zxc приложение поставилось только со второго раза и только после вмешательства ребе айседа.
Частично проблема в том, что она спешит, не всегда читает вывод команд и промахивается по кнопкам, а опыта для диагностики странных ошибок по оккультным сообщениям у нее недостаточно. Как минимум, один такой случай я видел.

(переформулирую более литературно: у нее мало опыта, чтобы не допускать чортово вуду на автомате(как это делают айсед, я и прочие ребе) и мало опыта, чтобы допущенное чортово вуду исправлять, исходя из оккультной симптоматики).

Проблемы:
1) .bash_profile и .profile - это упоминается в выводе инсталлятора rvm, но среди полстраницы вывода нужно заметить это и увязать с тем, что нужно выполнить source ~/.profile а не source ~/.bash_profile, как написано на сайте rvm. Т.е. "ответвление в инструкции".
2) rvm не поставился. По той причине, что rvm requirements не выдал список требований. Я не знаю, почему.
3) Вывод rvm requirements понятен только тем, кто варится в руби или вообще в разработке под линукс.

Итого: подобный деплоймент годится только для разработчиков или продвинутых админов, которым не влом делать весь вышеописанный ад.

Как бы переделал инструкцию по деплойменту:
1) Все инструкции с внешних сайтов перенес бы в свою.
2) Для каждой команды добавил бы подробное описание, что она делает, и какой должен быть вывод. Это обязательно, т.к. даже я не знаю, что делает та или иная команда и верно ли она отработала - это я решал при своем деплойменте реально НАУГАД.

Насчет того, что ставить надо из пакетов и реп: все верно, но ребе айсед сознательно выбрал идеологически другой метод, т.е. формально его сравнить с пакетным менеджером и прочим сложно. Как лучше делать, я не знаю. Лично я бы предпочел стабильный метод с пакетами, потому что мне подобная идеология ближе.

Приложение работает, его я оттестирую чуть попозже.

[identity profile] denisioru.livejournal.com 2012-02-06 11:08 am (UTC)(link)
Что это вообще за Special Enterprise Programming Olympics? Кто сделает самую хитровыебанную инсталяцию?

[identity profile] metaclass.livejournal.com 2012-02-06 11:15 am (UTC)(link)
Кто больше проебется при деплойменте.

[identity profile] metaclass.livejournal.com 2012-02-06 11:15 am (UTC)(link)
Деплоймент был основной подъебкой в задаче, если что :)

[identity profile] mend0za.livejournal.com 2012-02-06 11:38 am (UTC)(link)
Неудивительно что такой бред у товарища в деплойменте. Штатные средства ОС он использовать не хочет, пишет "Войну И Мир" в INSTALL по причинам совершенно не техническим.

Update: в настоящий момент как раз занимаюсь деплойментом кода на Ruby в составе Debian на LiveCD. И пошаговая стратегия делает мне смешно.
Edited 2012-02-06 11:45 (UTC)

[identity profile] theiced.livejournal.com 2012-02-06 11:47 am (UTC)(link)
руби в бабуине ломают с завидной переодичностью. я не хочу зависеть от рукожопых пидорасов. точка.

[identity profile] mend0za.livejournal.com 2012-02-06 11:49 am (UTC)(link)
Закат солнца вручную? ТруЪ LFS/Slakware? Тогда к чему вообще упоминание Ubuntu?



[identity profile] theiced.livejournal.com 2012-02-06 11:51 am (UTC)(link)
у нас щемта ~200 серверов с убунтой на EC2. везде рвм - именно по причине того что мы не дрочим на говнополиси а пытаемся предоставить предсказуемый и рабочий сервис.

[identity profile] mend0za.livejournal.com 2012-02-06 11:58 am (UTC)(link)
А хотябы заскриптовать и проверить свою мурзилку на выполняемость - религия не позволяет?

Enterprise в первую очередь - это интеграция, воспроизводимость и проверяемость решения. И интеграции там столько же сколько и кодирования. И тестирования столько же сколько кодирования.

Метакласс, как QA-инженер - доставляет. Задаёт правильные тупые вопросы (без подъёбки). У девелоперов мозги набекрень, они свою систему видят с очень своеобразного угла зрения.


Edited 2012-02-06 12:00 (UTC)

[identity profile] theiced.livejournal.com 2012-02-06 12:04 pm (UTC)(link)
1. ридми для идиотов я доправил. изначально в задаче не было указано что оно будет ставится идиотами. не проблема дописать ;]

2. наш продукт используют разные такие кастомеры типа делла или там ебэя. отказ сервиса по причине того что бабуин-мэйнейнер руби пережрал говна и всё сломал нам не нужны. всё ставится на отдельный сервак, тестируется, и деплоится (scp вроде, мне не интересно) на все остальные сервера. проблем это за 2 года не вызывало. не, я понимаю что бебиановский руби пригоден для чего то там на бебиановском лайвцд, good for you, нам он не подходит.

[identity profile] mend0za.livejournal.com 2012-02-06 12:14 pm (UTC)(link)
Избавься от анальной фиксации от дебиан-версии руби. Она мешает тебе прочитать и понять, что было написано в предыдущем моём коментарии.

"Всё ставится на отдельный сервак, тестируется, и деплоится" - интересует первая фаза процесса, "ставится на отдельный сервак". Это такой же закат солнца вручную, как описано в мурзилке README.md ?

[identity profile] theiced.livejournal.com 2012-02-06 12:41 pm (UTC)(link)
это не закат солнца вручную, это предпочтительный способ деплоя руби аппов что бы не зависеть от пидорасов-мэйнтейнеров. ещё раз - в вашем мире фей, лепестков роз и прочего говна когда вы пишете какую то поделку для лайвцд бебиана вы можете спокойно использовать руби из дистрибутива. когда вы приходите в реальный мир - вы не можете этого делать. никогда.

[identity profile] theiced.livejournal.com 2012-02-06 12:44 pm (UTC)(link)
ну начнём с малого. у нас вот кастомеры хотят запускать свои поделия на строго определённой версии руби (учитывая и патчсет). как я поставлю вот всё это:

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 конечно) на бабуин штатными средствами?

[identity profile] mend0za.livejournal.com 2012-02-06 12:45 pm (UTC)(link)
Ещё раз, для тупых фанбоев "мы соберём свой руби из говна, гемов и блекджека", повторю вопрос.

Последовательность деплоймента - скриптуется или нет?

Или ты слышишь только вопросы голосов из розетки?

[identity profile] theiced.livejournal.com 2012-02-06 12:56 pm (UTC)(link)
естсественно. не руками же вводится. я поэтому и не в курсе - оно написано было два года назад и с тех пор не трогали.

[identity profile] mend0za.livejournal.com 2012-02-06 12:58 pm (UTC)(link)
ok, спасибо что наконец ответил.

[identity profile] theiced.livejournal.com 2012-02-06 01:04 pm (UTC)(link)
при этом за эти два года бравые бабуинисты последовательно сломали руби сотней разных способов. и нет, нас не устраивает руби 40летней свежести из стэйбл.

(no subject)

[identity profile] mend0za.livejournal.com - 2012-02-06 13:05 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-02-06 13:19 (UTC) - Expand

(no subject)

[identity profile] mend0za.livejournal.com - 2012-02-06 13:20 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-02-06 14:06 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-02-06 13:31 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-02-06 14:07 (UTC) - Expand

(no subject)

(Anonymous) - 2012-02-07 06:24 (UTC) - Expand

(no subject)

(Anonymous) - 2012-02-07 06:36 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-02-07 06:43 (UTC) - Expand

(no subject)

[identity profile] alexclear.livejournal.com - 2012-02-09 21:47 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-02-10 04:16 (UTC) - Expand

[identity profile] alex-butenko.livejournal.com 2012-02-06 12:19 pm (UTC)(link)
у тебя 200 серверов бабуяна, и ты до сих пор не осилил сборку своих деб пакетов в собственный репозиторий? :)

[identity profile] theiced.livejournal.com 2012-02-06 12:49 pm (UTC)(link)
не у меня а у нас. я не админ. я не хочу быть тупым админом и делать тупую админскую работу, для этого есть выпускники рти.

и таки пакетировать 20 разных рубей... нахуя? в мире руби rvm это preferred way для деплоя.

алсо, у нас в планах далеко не только уебунта. вот я не знаю что там на engineyard например, но хорошие шансы что не уебунта. и чо - потом 200 дистров поддерживать? НАХУЙ.

ну и щемта у нас вот с таким подходом всё хорошо. за 2 года проблемы конечно были - но ни одна из них не была по причине рвма и такого деплоя (исключительно баги в нашем софте написанные лично нами).

(Anonymous) 2012-02-06 03:26 pm (UTC)(link)
>> руби rvm это preferred way для деплоя

У нас с вами разные миры Ruby. Для деплоя или собирают свои пакеты .deb, .rpm и т.д., или ставят конкретную версию (которая крутится на стейджинге у QA и на машинах с CI) через скриптовые системы деплоймента. RVM в продакшине использовать бессмысленно (как и rbenv). Ломался этот РВМ не раз, и ставить стороннюю девелоперскую (т.е. расчитаную на девелоперскую машину с 100500 разными версиями руби) прослойку на продакшин на я не вижу ни малейшего резона.

Каким образом проходит ваш процесс деплоя? Я подозреваю, что при выходе новых патчей на руби вы обновляете эталонный образ и перестартуете все инстансы с перезаливкой туда этого образа?

[identity profile] inhate.livejournal.com 2012-02-06 02:25 pm (UTC)(link)
А как вас случаются секьюрити-апдейты?
Ну т.е. нашлась там в рельсах дыра, или в либе, с которой руби слинкованы (ssl например) ?
develop7: (Default)

[personal profile] develop7 2012-02-06 03:08 pm (UTC)(link)
дыра в рельсах: правим одну строку в Gemfile, пускаем bundle install
дыра в либе из пакетов: апдейт приезжает из репов; если нужно — rvm reinstall ruby_version
дыра в либе из .rvm/usr: rvm get stable, rvm reinstall ruby_version

[identity profile] inhate.livejournal.com 2012-02-06 03:12 pm (UTC)(link)
>>> дыра в рельсах: правим одну строку в Gemfile, пускаем bundle install

Там есть какие-то релизы для которых делаю секьюрити фиксы без изменения функциональности? Т.е. такая операция не сломает че-нить в приложении?

Кстати, rvm же умеет всё своё хозяйство класть хомяк юзеру?

[identity profile] metaclass.livejournal.com 2012-02-06 03:20 pm (UTC)(link)
Оно так и лежит сейчас)

[identity profile] theiced.livejournal.com 2012-02-06 03:29 pm (UTC)(link)
и это основной плюс. ` -R ~/.rvm куданить` и всё заебись.

(no subject)

[identity profile] inhate.livejournal.com - 2012-02-06 17:27 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-02-06 17:48 (UTC) - Expand

[identity profile] vinslivins.livejournal.com 2012-02-06 06:58 pm (UTC)(link)
)))