<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rafa Garcia.net - Blog &#187; capistrano</title>
	<atom:link href="http://blog.rafagarcia.net/category/capistrano/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rafagarcia.net</link>
	<description>Desvaríos varios sobre ruby, rails, linux, capistrano, ... y muchas cosas más!</description>
	<lastBuildDate>Sun, 22 Aug 2010 13:35:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Capistrano: Submódulos de los submódulos</title>
		<link>http://blog.rafagarcia.net/2010/05/13/capistrano-submodulos-mas-submodulos-mas-submodulos/</link>
		<comments>http://blog.rafagarcia.net/2010/05/13/capistrano-submodulos-mas-submodulos-mas-submodulos/#comments</comments>
		<pubDate>Thu, 13 May 2010 02:49:43 +0000</pubDate>
		<dc:creator>Rafa García</dc:creator>
				<category><![CDATA[capistrano]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[submodulos]]></category>

		<guid isPermaLink="false">http://blog.rafagarcia.net/?p=135</guid>
		<description><![CDATA[Últimamente al &#8220;deployar&#8221; mi pet-project dejaba de funcionar la aplicación, passenger no arrancaba. Mirando los logs me di cuenta de que la dependencia de prawn y prawn-labels me estropeaban el deploy. Recomiendan instalar prawn (y prawn-labels) como submódulo y eso por suerte está contemplado en los despliegues con Capistrano, al menos parcialmente, añadiendo la siguiente [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente al &#8220;deployar&#8221; mi pet-project dejaba de funcionar la aplicación, passenger no arrancaba. Mirando los logs me di cuenta de que la dependencia de prawn y prawn-labels me estropeaban el deploy.</p>
<p>Recomiendan instalar prawn (y prawn-labels) como submódulo y eso por suerte está contemplado en los despliegues con Capistrano, al menos parcialmente, añadiendo la siguiente variable a nuestro deploy.rb:</p>
<p><code> set :git_enable_submodules, true </code> <em> </em></p>
<p><em>Ver fichero: capistrano/lib/capistrano/recipes/deploy/scm/git.rb</em></p>
<p>De todos modos al hacer un nuevo despliegue la cosa seguía fallando. Siguiendo el proceso a mano resulta que Capistrano solo hace el init y update de los submódulos &#8220;raíz&#8221;. Quiero decir que si estos tienen mas submódulos no son tenidos en cuenta.</p>
<p>Finalmente dándome un paseo por Internet encontré la solución, se trata de la gema <a href="http://github.com/morhekil/capistrano-deepmodules">capistrano-deepmodules de morhekil</a>.  La cosa es muy simple:</p>
<ol>
<li>Instalamos la gema &#8220;morhekil-capistrano-deepmodules&#8221;</li>
<li>Añadimos en nuestro deploy.rb: &#8220;require &#8216;capistrano/deepmodules&#8217;&#8221;</li>
<li>(Opcional) podemos quitar de nuestro deploy.rb: &#8220;set :git_enable_submodules, true&#8221;</li>
</ol>
<p><br class="spacer_" /></p>
<p>That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafagarcia.net/2010/05/13/capistrano-submodulos-mas-submodulos-mas-submodulos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capistrano y deployments sin Rails</title>
		<link>http://blog.rafagarcia.net/2010/02/17/capistrano-y-deployments-sin-rails/</link>
		<comments>http://blog.rafagarcia.net/2010/02/17/capistrano-y-deployments-sin-rails/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 12:38:58 +0000</pubDate>
		<dc:creator>Rafa García</dc:creator>
				<category><![CDATA[capistrano]]></category>

		<guid isPermaLink="false">http://blog.rafagarcia.net/?p=96</guid>
		<description><![CDATA[Siguiendo con la tónica de  &#8221;cosas de las que quise hablar en el taller de Capistrano y no pude &#8211; episodio 2&#8243;. A veces toca hacer deployment de aplicaciones que no tienen nada que ver con rails, el caso mas claro unas páginas estáticas(solo subir ficheros, sin migration, ni restart). Para eso Lee Hambley hizo [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con la tónica de  &#8221;cosas de las que quise hablar en el taller de Capistrano y no pude &#8211; episodio 2&#8243;.</p>
<p>A veces toca hacer deployment de aplicaciones que no tienen nada que ver con rails, el caso mas claro unas páginas estáticas(solo subir ficheros, sin migration, ni restart).</p>
<p>Para eso Lee Hambley hizo la gema <a href="http://github.com/leehambley/railsless-deploy/" target="_blank">railsless-deploy</a>, básicamente lo que hace es quitar las &#8220;railties&#8221; de Capistrano. Con esta gema y un pequeño cambio en tu fichero Capfile puedes &#8220;deployar&#8221; lo que quieras. <img src='http://blog.rafagarcia.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Por una vez no me voy a enrollar y a escribir paso a paso un ejemplo porque creo que con las explicaciones que hay en la página de <a href="http://github.com/leehambley/railsless-deploy/" target="_blank">la gema</a> es suficiente.</p>
<p><br class="spacer_" /></p>
<p>&#8220;Solo puede deployar uno&#8221; &#8211; Los inmortales</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafagarcia.net/2010/02/17/capistrano-y-deployments-sin-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capistrano y multistaging</title>
		<link>http://blog.rafagarcia.net/2010/01/09/capistrano-y-multistaging/</link>
		<comments>http://blog.rafagarcia.net/2010/01/09/capistrano-y-multistaging/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 02:16:16 +0000</pubDate>
		<dc:creator>Rafa García</dc:creator>
				<category><![CDATA[capistrano]]></category>
		<category><![CDATA[multistage]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.rafagarcia.net/?p=82</guid>
		<description><![CDATA[Mientras veía caer los copos de nieve por la ventana, observando como cuajaban en el patio, me vino a la mente que este &#8220;viernes de Capistrano&#8221; tenía que ser diferente, no estaba/estoy lo suficiente inspirado para corregir bugs. Entonces he recordado que tengo una deuda pendiente con la gente que vino al taller de Capistrano [...]]]></description>
			<content:encoded><![CDATA[<p>Mientras veía caer los copos de nieve por la ventana, observando como cuajaban en el patio, me vino a la mente que este &#8220;viernes de Capistrano&#8221; tenía que ser diferente, no estaba/estoy lo suficiente inspirado para corregir bugs. Entonces he recordado que tengo una deuda pendiente con la gente que vino al taller de Capistrano en la Conferencia Rails. Hubo varios temas que quería haber tocado pero que tuve que eliminar por falta de tiempo. Así que vamos a por uno de esos temas, el multistaging.</p>
<p><span id="more-82"></span>Un ejemplo de entorno multistage podría ser el siguiente:</p>
<ul>
<li> mi máquina de desarrollo </li>
<li> un servidor de aceptación </li>
<li> un servidor de producción </li>
</ul>
<p>Supongamos que mi máquina de desarrollo la actualizo a mano y los otros dos stages los quiero hacer con Capistrano. Capistrano por defecto solo sabe &#8220;deployar&#8221; y no es capaz de diferenciar entre aceptación y producción. Para ayudarle a diferenciar entre los diferentes stages podemos seguir varias estrategias.</p>
<p>Vamos a empezar por el mas simple de los casos, supongamos que entre aceptación y producción lo único que cambian son los datos de los roles. Una solución muy simple podría ser añadir a nuestro deploy.rb lo siguiente:</p>
<pre>  if ENV['DEPLOY'].upcase == 'PRODUCTION'
    puts "*** Deployando en producción"
    role :web, "www.production.com"
    role :app, "app.production.com"
    role :db,  "db.production.com", :primary =&gt; true
  else
    puts "*** Deployando en staging"
    role :web, "www.staging.com"
    role :app, "app.staging.com"
    role :db,  "db.staging.com", :primary =&gt; true
  end
</pre>
<p>El código añadido es bastante simple, si la variable de entorno DEPLOY tiene el string &#8216;PRODUCTION&#8217; ejecutaremos el deploy en la máquina de producción, sino se irá a staging. La ejecución se haría de la siguiente manera:</p>
<pre>  $ DEPLOY=production cap deploy
</pre>
<p>Para probarlo sin tener que subir toda una aplicación a nuestros servidores podemos crear una tarea simple y estúpida como esta:</p>
<pre>  task :foo do
    run "uptime"
  end
</pre>
<p>Entonces ahora lo podemos probar de nuevo:</p>
<pre>  $ DEPLOY=production cap foo
  *** Deployando en producción
  ...

  $ cap foo
  *** Deployando en staging
  ...
</pre>
<p>Vale, funciona pero me chirría un poco, ¿no sería mejor hacerlo en el idioma de Capistrano? -aquí es donde todos al unísono debéis decir: SÍIIIIIIII. Entonces vamos a hacer algo parecido encadenando las tareas.</p>
<p>Si recordáis el día del taller os expliqué que con Capistrano podíamos definir varias tareas y llamarlas una detrás de otra, eso es lo que vamos a hacer. Vamos a considerar la configuración de cada stage una tarea diferente:</p>
<pre>  task :production do
    puts "*** Deployando en producción"
    role :web, "www.production.com"
    role :app, "app.production.com"
    role :db,  "db.production.com", :primary =&gt; true
  end

  task :staging do
    puts "*** Deployando en staging"
    role :web, "www.staging.com"
    role :app, "app.staging.com"
    role :db,  "db.staging.com", :primary =&gt; true
  end
</pre>
<p>Utilizando este método el deploy o la ejecución de tareas en un stage u otro se hace de manera mas natural(sin usar variables de entorno):</p>
<pre>  $ cap staging foo
  * executing `staging'
*** Deployando en staging
  * executing `foo'
  * executing "uptime"
    servers: ["localhost"]
Password:
    [localhost] executing command
 ** [out :: localhost] 01:39:08 up  2:25,  5 users,  load average: 0.01, 0.07, 0.05
    command finished
</pre>
<p>Si nos fijamos en el log de Capistrano vemos que primero ejecuta la tarea &#8220;staging&#8221; y luego ejecuta la tarea &#8220;foo&#8221;, que es lo que comentaba del encadenamiento de tareas.</p>
<p>Esta estrategia a mi me parece muy útil cuando los cambios que se necesitan para desplegar en producción y staging son mínimos. Considerando un cambio mínimo el cambio de variables.</p>
<p>Sin embarbo, esta estrategia no me parece limpia si ya se cambian tareas,callbacks, etc. entre stages. En tal caso cambiaría la estrategía y usaría la gema/plugin <a href="http://github.com/jamis/capistrano-ext" target="_blank">capistrano-ext</a>. Esta gema por dentro usa el mismo método que acabamos de utilizar pero llega un poco mas lejos.</p>
<p>Para usar este plugin solo hay que hacer 4 cosillas y una de ellas opcional <img src='http://blog.rafagarcia.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<blockquote><ol>
<li>Hacer un require de capistrano-ext</li>
<li>Definir los stages que vamos a usar</li>
<li>Definir el stage por defecto **OPCIONAL**</li>
<li>Escribir nuestras recetas por cada stage dentro de config/deploy/&lt;stage&gt;.rb</li>
</ol>
</blockquote>
<p>Vamos a hacer el require y definir los stages, escribimos en el inicio de nuestro deploy.rb:</p>
<pre>  require 'capistrano/ext/multistage'
  set :stages, %w(staging production)
</pre>
<p>No ha sido tan dificil ¿verdad?</p>
<p>Ahora siguiendo nuestro sencillo ejemplo vamos a escribir la receta de cada stage. En config/deploy/staging.rb escribimos:</p>
<pre>  puts "*** Deployando en staging"
  role :web, "localhost"
  role :app, "localhost"
  role :db,  "localhost", :primary =&gt; true
</pre>
<p>Y en config/deploy/production.rb:</p>
<pre>  puts "*** Deployando en producción"
  role :web, "localhost"
  role :app, "localhost"
  role :db,  "localhost", :primary =&gt; true
</pre>
<p>Lo probamos y vemos que funciona:</p>
<pre>  $ cap production foo
  * executing `production'
*** Deployando en producción
    triggering start callbacks for `foo'
  * executing `multistage:ensure'
  * executing `foo'
  * executing "uptime"
    servers: ["localhost"]
Password:
    [localhost] executing command
 ** [out :: localhost] 02:22:19 up  3:08,  5 users,  load average: 0.11, 0.10, 0.07
    command finished
</pre>
<p>Si no le pongo stage falla miserablemente:</p>
<pre>  $ cap foo
    triggering start callbacks for `foo'
  * executing `multistage:ensure'
No stage specified. Please specify one of: staging, production (e.g. `cap staging foo')
</pre>
<p>Para definir un stage por defecto entonces añadimos a nuestro deploy.rb:</p>
<pre>  require 'capistrano/ext/multistage'
  set :stages, %w(staging production)
  set :default_stage, 'staging'
</pre>
<p>Y ahora comprobamos que usamos staging por defecto:</p>
<pre>  $ cap foo
      triggering start callbacks for `foo'
    * executing `multistage:ensure'
  *** Defaulting to `staging'
    * executing `staging'
  *** Deployando en staging
    * executing `foo'
    * executing "uptime"
      servers: ["localhost"]
  Password:
      [localhost] executing command
   ** [out :: localhost] 02:29:17 up  3:15,  5 users,  load average: 0.03, 0.08, 0.08
      command finished
</pre>
<p>Esta última estrategia la recomiendo si hay demasiada diferencia a la hora de hacer un deploy entre los diferentes stages, por ej. si en staging tenéis montado el stack con mongrel y en producción con passenger. Otra situación podría ser cuando el deploy tiene muchas variables(además diferentes entre stages) y hace que se pierda la legibilidad de nuestro deploy.rb</p>
<p>Al usar esta estregia siempre procuro que las variables y tareas comunes se queden en el deploy.rb, y el resto vaya al fichero de configuración del stage. Si tuviésemos demasiadas tareas comunes las movería a otro fichero, todo sea por mantener la legibilidad. De todos modos cada cual lo puede hacer como le vaya bien <img src='http://blog.rafagarcia.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Nota:</strong> El deploy.rb que he usado para escribir este post solo contenía lo que os he ido indicado, para las pruebas que hemos hecho no es necesario definir la aplicación, el repositorio, tipo de scm,&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafagarcia.net/2010/01/09/capistrano-y-multistaging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capistrano 2.5.9 preview release, probála! &#8211; llamada a la comunidad</title>
		<link>http://blog.rafagarcia.net/2009/09/03/capistrano-2-5-9-preview-release-probala-llamada-a-la-comunidad/</link>
		<comments>http://blog.rafagarcia.net/2009/09/03/capistrano-2-5-9-preview-release-probala-llamada-a-la-comunidad/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 23:17:57 +0000</pubDate>
		<dc:creator>Rafa García</dc:creator>
				<category><![CDATA[capistrano]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.rafagarcia.net/?p=59</guid>
		<description><![CDATA[Lee Hambley hace unos días anunció &#8220;Capistrano 2.5.9 preview release&#8221;, la finalidad de esta pre-release era comprobar que la corrección de un bug importante se había solucionado y no provocaba ninguna destrucción Además se añadió alguna pequeña funcionalidad y se corrigieron otros bugs. Esperábamos algo de feedback y la verdad es que no ha llegado [...]]]></description>
			<content:encoded><![CDATA[<p>Lee Hambley hace unos días anunció &#8220;Capistrano 2.5.9 preview release&#8221;, la finalidad de esta pre-release era comprobar que la corrección de un <a href="https://capistrano.lighthouseapp.com/projects/8716/tickets/79-capistrano-hangs-on-shell-command-for-many-computers-on-ruby-186-p368" target="_blank">bug importante se había solucionado</a> y no provocaba ninguna destrucción <img src='http://blog.rafagarcia.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Además se añadió alguna pequeña funcionalidad y se corrigieron otros bugs.</p>
<p>Esperábamos algo de feedback y la verdad es que no ha llegado nada de nada.</p>
<p>Entonces desde aquí hago una llamada a toda la comunidad ror-es para que, por favor, probéis esta release y nos hagáis saber si os ha funcionado todo como debía o si la hemos &#8220;liao parda&#8221;.</p>
<p>Podéis reportar desde <a href="https://capistrano.lighthouseapp.com/dashboard" target="_blank">Lighthouse</a>, mandándome un email(rgo en aspgems punto com) o por twitter a @leptom.</p>
<p><br class="spacer_" /></p>
<p>Para probarla tenéis actualizar net-ssh a la versión 2.0.14 y descargar la gema desde aquí e instalarla:</p>
<p><a href="http://groups.google.com/group/capistrano/web/capistrano-2.5.9.gem" target="_blank">http://groups.google.com/group/capistrano/web/capistrano-2.5.9.gem</a></p>
<p>Para ver los cambios realizados en esta release:</p>
<p><a href="http://capistrano.googlegroups.com/web/2.5.9-Release-Notes.txt.md" target="_blank">http://capistrano.googlegroups.com/web/2.5.9-Release-Notes.txt.md</a></p>
<p><br class="spacer_" /></p>
<p>Gracias a todos!</p>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafagarcia.net/2009/09/03/capistrano-2-5-9-preview-release-probala-llamada-a-la-comunidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usemos 503 para nuestras páginas de mantenimiento</title>
		<link>http://blog.rafagarcia.net/2009/07/28/usemos-503-para-nuestras-paginas-de-mantenimiento/</link>
		<comments>http://blog.rafagarcia.net/2009/07/28/usemos-503-para-nuestras-paginas-de-mantenimiento/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 11:24:33 +0000</pubDate>
		<dc:creator>Rafa García</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.rafagarcia.net/?p=46</guid>
		<description><![CDATA[La mayor parte de la documentación que hay por ahí sobre como configurar Apache para poder usar la tarea de Capistrano deploy:web:disable es usar la directiva RewriteRule para ver si existe la página de mantenimiento. Aparentemente está bien, pero no es así porque no cambia el código de la respuesta. Los clientes recibirán un 200 [...]]]></description>
			<content:encoded><![CDATA[<p>La mayor parte de la documentación que hay por ahí sobre como configurar Apache para poder usar la tarea de Capistrano <em>deploy:web:disable</em> es usar la directiva <em>RewriteRule</em> para ver si existe la página de mantenimiento.</p>
<p>Aparentemente está bien, pero no es así porque no cambia el código de la respuesta. Los clientes recibirán un <em>200 OK</em>, indicando de que el servidor está funcionando como debe. El código de estado correcto debiera ser <em>503 Service Unavailable</em>. Con un 503, conseguiremos prevenir que los motores de búsqueda indexen nuestra página de mantenimiento, a los que usan nuestra API les haremos la vida mas fácil, las peticiones AJAX pueden ser tratadas correctamente cuando el site se ha caído, etc.</p>
<p>La configuración de apache para realizar esto es la siguiente:</p>
<script src="http://gist.github.com/157111.js"></script>
<p><span id="more-46"></span>El flag <em>redirect=503</em> parece un poco raro, aquí os pongo un extracto de la <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#redirect" target="_blank">sección de flags de la documentación de mod_rewrite</a>:</p>
<p style="padding-left: 30px;">While this is typically used for redirects, any valid status code can be given here.     If the status code is outside the redirect range (300-399), then the <em>Substitution</em> string is dropped and rewriting is stopped as if the <code>L</code> flag was used.</p>
<p>En definitiva, que a <em>RewriteRule</em> puedes ponerle como segundo argumento lo que sea y el flag <em>last</em> no es necesario porque se aplica automáticamente. Pongo como path &#8216;-&#8217; y además el flag <em>last</em> a modo informativo de todos modos.</p>
<p><br class="spacer_" /></p>
<p><strong>Nota</strong>: Esto es una traducción (muy) libre del artículo de Chris K. (http://www.shiftcommathree.com/articles/make-your-rails-maintenance-page-respond-with-a-503).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafagarcia.net/2009/07/28/usemos-503-para-nuestras-paginas-de-mantenimiento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
