Mostrando entradas con la etiqueta rails. Mostrar todas las entradas
Mostrando entradas con la etiqueta rails. Mostrar todas las entradas

1 jun 2012

Rails - Deployment

Bueno, aprendizajes más, aprendizajes menos ahora estoy en la cuestión del deployment (poner una aplicación en producción) otra ves, denuevo es complicado, así que esta vez voy a intentar aprender un poco, y para aprender hay que escribir.

  1. Parece que a la aplicación hay que aislarla (creandole un usuario propio):


    # adduser

  2. rvm: para que ande una aplicación de rails, tiene que estar instalado ruby, así que hay que instalarlo junto con sus requerimientos:


    # aptitude install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

    # curl -L get.rvm.io | bash -s stable

    # adduser usuario rvm

  3. Como usamos mysql y ruby hay que instalar tambien:


    # aptitude install libmysqlclient-dev


  4. Ahora falta clonar el repositorio y configurar la aplicación. (Esta parte se debería automatizar con capistrano y otras herramientas como esa.)


    $ git clone <...>
    $ gem install bundle
    $ cd aplicacion/
    $ bundle install
    $ rake db:setup RAILS_ENV=production  
     
  5. Automatizando con capistrano, esto se complica un poco, y se simplifica otro poco. Por un lado hay que seguir algunas instrucciones. Luego, hay que hacerle algunas modificaciones para encargarse de el archivo database.yml. Aunque las modifiqué un poco para parecerse más a esto. Además hay que tener bien configurada la conexión ssh con el server (en ~/.ssh/config).
  6. Después viene la parte de instalar passenger que al final no es tán dificil (pero seguro que se complica un poco). Me parece que habría que crear mejor dos archivos (/etc/apache2/mods-available/passenger.[conf|load]) y además uno para cada aplicacion (/etc/apache2/sites-available/passenger) y utilizar las herramientas de Debian a2enmod y a2ensite como se debe. Obvio que esto habría que automatizarlo (usando puppet).
  7. Ahi estoy ahora, pero faltan algunas cosas, a saber:
    1. configurar passanger.
    2. Manejar los errores y los logs. (logwatch y logrotate ?)
    3. Automatizar la instalación de las aplicaciones y la creación del usuario.
    4. Encontrar un metodo simple para actualizar la aplicación.
    5. Utilizar la opcion "bundle install --deployment"
    6. Programar un backup de la base de datos.

Ahora estoy así, necesitando una mano con esto... ¿cuál será el canal para pedir ayuda?

14 feb 2012

Sobre git (procedimiento rudimentario)

La idea de los commits es poder separar lo que funciona de lo que no (aislar los problemas) si está todo en un gran commit no sirve de nada (excepto para poner todo o sacar todo) por lo que es importante que haya muchos commits, y que en cada uno haya un cambio.

Así que acá presento un procedimiento rudimentario para lograrlo de forma simple y clara.

La onda es que cuando te agarra la voragine programadora hagas el siguiente procedimiento, que aunque rudimentario puede funcionar.

0. hay que empezar desde *master* y tiene que estar todo *limpio*, si hay cambios de algun tipo hay que borrarlos `git co .` o guardarlos para después `git stash`

1. Creas una rama donde trabajar


        $ git checkout -b nombre_de_la_nueva_rama`

2. Haces un cambio cualquiera o dos como mucho, si corres un generador ya está, si modificas 2 archivos y lo que pusiste _anda_ ya está. La cuestión es lograr que eso que acabas de escribir ande. si agregas un botón y el botón se ve, fue, ya está, es hora de comitear.

3. Comitea lo que acabas de cambiar (ahí te pide un comentario, descriví lo que hiciste)

        $ git add . && git commit

4. Repetí 2-3 tantas veces como sea posible.

5. hacé un push (si la rama no existe primero creala)

        $ git promote
        $ git push

De esta forma quedan un monton de commits horribles, pero cada uno tiene una cosa que anda por si sola, así que uno puede, al encontrar un error, ver que commit lo creo y revertirlo `git revert` o corregirlo, pero entiende para qué está cada linea de código.

29 dic 2011

Idea para una gema. db2fixture

La cuestión es bastante simple, uno quiere hacer un fixture rápido de una cuestión que le parece interesante, como ser un registro que le causó problemas o errores en algún momento. Entonces querés hacer un test sobre el tema para asegurarte que ese problema no vuelve a ocurrir.

Como hago el fixture sin escribir, abro la consola, busco el registro y hago:

r.to_fixture "registro_problemático" # => se crearán 7 fixtures... ¿seguro?(y/n)
; yes # => OK

y como funciona?

usa muchas cosas de este plugin que hace algo parecido.
Y a eso le agrega una búsqueda de relaciones (basada en r.class.reflections) que carga también todos los registros relacionados con el primero recursivamente.

Luego, solo queda escribir el test. :) (y la gema :( )

12 sept 2011

Jugando con Token Input

Me puse a intentar usar token-input.js desde rails 3.1 y me encontré con que no fue tan dificil.

Un poco de codigo para recordarme:

El Input de formtastic:

    <%= form.input :compradores_tokens, :label => "Compradores:",
                   :input_html => {
                     "data-pre" => @contrato.compradores.to_json, :only => [:id, :name] } %>


El coffescript para cargarlo:

//= require jquery.tokeninput

$ ->
  $('#contrato_compradores_tokens').
    tokenInput '/personas/people.json',
    # NOTE: esto esta hardcodeado porque no se puede tener acceso a los helpers (helper.personas.new_people_path(:as => :json))
      queryParam: 'search[name_like]'
      crossDomain: false
      prePopulate: $('#contrato_compradores_tokens').data('pre')
      searchingText: 'Buscando...'
      hintText: 'Ingrese el nombre del comprador'
      noResultsText: "Esta persona no está registrada"


El codigo para los estilos

*= require token-input


En el modelo:

  attr_reader :compradores_tokens

  def compradores_tokens=(ids)
    self.comprador_ids = ids.split(",")
  end


Y ahí debería estar andando... :)