SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
Integración Continua
       y Rails
     David Calavera
         11870.com
ego slide

• desarrollador en 11870.com
• open source: Hudson, Netbeans
• commiter de la Fundación Apache
sobre mi
sobre la charla
sobre que

     NO
trata esta charla
nada que nos enganche


        Texto




                más a Rails
como configurar




    un servidor de CI
sobre que trata
  esta charla
usar menos herramientas
automatizar tareas
calidad del código
¿qué es integración
    continua?
“   practica de reunir el código
    que estamos desarrollando
    frecuentemente, para
    verificarlo y evitar errores
                                  ”
                          David Calavera
“   Continuous Integration is a software development
    practice where members of a team integrate their work
    frequently, usually each person integrates at least daily
    - leading to multiple integrations per day. Each
    integration is verified by an automated build (including
    test) to detect integration errors as quickly as possible.
    Many teams find that this approach leads to significantly



                                                           ”
    reduced integration problems and allows a team to
    develop cohesive software more rapidly.


                                                   Martin Fowler
¿para qué sirve?
reducir riesgos
falta de cohesión
descubrir errores pronto




    http://www.agitar.com/solutions/why_unit_testing.html
baja calidad del código
evitar repetir
procesos manuales
generar deploys



en cualquier momento
automatizar el build

• reducir el número de procesos manuales
• ¡¡Rails --tasks --silent | wc -l a ejecutar!!
           incorpora 71 tareas
  • rake
• ¡¡Capistrano añade 22 -tareas más!!
   • expr `cap --tasks | wc -l` 7
¡¡autodestrucción!!
reducir su duración

• usar una máquina dedicada para CI
• mejorar el rendimiento de nuestros tests
• separar los tests por categorías
• ejecutar el build por etapas
ejecutar los test en
            paralelo
• sudo gem install deep_test
DeepTest::TestTask.new 'deep_test:functionals' do |t|
  t.pattern = quot;test/functional/**/*_test.rbquot;
  t.number_of_workers = 2
end
ejecutar los test en
            paralelo
• también para RSpec
Spec::Rake::SpecTask.new 'deep_spec:functionals' do |t|
  t.spec_files = FileList['spec/functional/**/*_spec.rb']
  t.deep_test :number_of_workers => 2
end
ejecutar los test en
            paralelo
• ¡con una base de datos para cada worker!
DeepTest::TestTask.new 'deep_test:functionals' do |t|
  t.pattern = quot;test/functional/**/*_test.rbquot;
  t.worker_listener = 'DeepTest::Database::MysqlSetupListener'
end
usar un servidor de CI

• preguntar por cambios en el repositorio
• realizar acciones en horarios determinados
• soportar diferentes herramientas
• mostrar builds históricos
• soportar diferentes tipos de informes
• soportar diferentes tipos de notificaciones
CruiseControl.rb
CruiseControl.rb

• muy POCO “user friendly”
• plugins perdidos por internet
• pero muy fáciles de desarrollar
• http://cruisecontrolrb.thoughtworks.com
Hudson
Hudson

• MUY “user friendly”
• plugins muy fácilmente localizables
• pero algo más complicado de desarrollar
• http://hudson.dev.java.net
Run Code Run


•
Run Code Run

• de momento solo proyectos open source
• de momento solo se integra con github
• soporte de CI para la última Rails Rumble
• http://runcoderun.com
mejorar la perspectiva
aumentar la confianza
¿cuáles son las
reglas básicas?
commit frecuente
no subir

código roto
arreglar el build

    inmediatamente
escribir test automáticos
hacer builds en local
evitar usar código roto
¿qué pasos hay
 que seguir para
montar un sistema
     de CI?
1. integración de la
   base de datos
lo que hay que hacer

• automatizar los cambios de la base de datos
  • crear la base de datos


  • modificar la base de datos
• testing e inspección
Migraciones

 • muchas mejoras desde Rails 2.1
create   db/migrate/20081112232842_modify_user.rb

class ModifyUser < ActiveRecord::Migration
  def self.up
    change_table :user do |user|
      t.rename :surname, :last_name
      t.remove :age
      ...
    end
  end
end
2. Testing continuo
test unitarios

• enfocados en un objeto
• comprobar installes totalmente unitario
             que
    •
    sudo gem        unit_record

ActiveRecord::Base.disconnect!




• usar mocks en lugar de fixtures
test unitarios

• ¡¡hay que hacerlos para cualquier clase!!
    •sudo gem install unit_controller

def setup
  @controller = UserController.new
  @controller.do_not_render_vew
end
test funcionales

• usa factories en lugar de fixtures
    •
    sudo gem install thoughtbot-factory_girl

Factory.define :user do |u|
  u.first_name 'Joe'
  u.last_name 'Doe'
  u.email {|att| quot;#{att.first_name}@example.comquot;.downcase }
end
test funcionales

• ¡¡hay que hacerlos modelotodas lasde datos
                          para           clases!!
  •  interacción entre el      y la base
  • interacción entre el modelo y el controlador
  • interacción entre el controlador y la vista
3. Inspección continua
reducir la complejidad

• Flog
def flog(output, *directories)
  `find #{directories.join(quot; quot;)} -name *.rb|xargs flog
       > #{RAILS_ROOT}/tmp/flog/#{output}.txt`
end

desc quot;Flog models, controller, helpers and libquot;
task :flog do
  flog quot;allquot;, *%w[app/models app/controllers app/helpers lib]
end
eliminar código
      duplicado o sin usar
• Dust
def unused_lvar
  a = 1
  1 + 2
end

d = Dust::LocalVariableDuster.new(Object, :unused_lvar)
d.dust!
d.warnings
eliminar código
      duplicado o sin usar
• PMD-CPD
def cpd(*directories)
  `java net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 -files
#{directories.map(quot; --files quot;)} --language ruby`
end
task :cpd do
  cpd *%w[app/models app/controllers app/helpers lib]
end
comprobar cobertura

• Rcov
desc 'Test coverage report'
task :coverage do
  rm_f quot;coveragequot;
  rm_f quot;coverage.dataquot;
  rcov = quot;rcov --rails --aggregate coverage.data -Ilibquot;
  `#{rcov} --no-html test/unit/*_test.rb`
  `#{rcov} --no-html test/functional/*_test.rb`
  `#{rcov} --html test/integration/*_test.rb`
  `open coverage/index.html` if PLATFORM['darwin']
end
all in one

• Metrics_fu para cruisecontrol.rb
  • Saikuro
  • Flog
  • Rcov
  • Rails stats
• RubyMetrics para hudson
  • Rcov
  • Rails stats
revisión de código
4. Deploy continuo
deploy continuo

• etiquetar el repositorio
• producir un entorno limpio
• etiquetar cada build
• tener la capacidad de volver atrás
5. Feedback continuo
feedback continuo

• la información correcta
• a la persona indicada
• en el momento esperado
• de la forma correcta
¿alguna pregunta?
Fotos
• http://flickr.com/photos/chicanerii/507573394
• http://flickr.com/photos/3epmedia/1160364177
• http://flickr.com/photos/cathycracks/183170786
• http://flickr.com/photos/smitty/2245445147/
• http://flickr.com/photos/fcw/384316867/
• http://www.flickr.com/photos/auxesis/2965947278/
• http://www.flickr.com/photos/penguin_man44/1203331011/
• http://flickr.com/photos/rekha6/2902282813/
• http://flickr.com/photos/teepee1/1508261796/
• http://flickr.com/photos/teepee1/2614839885/
• http://flickr.com/photos/_saturnine/2294717858/
• http://flickr.com/photos/ezra/459279198/
• http://flickr.com/photos/x180/1397019888
• http://flickr.com/photos/soulcheck/384769773/
• http://flickr.com/photos/znachor/255143511/
• http://flickr.com/photos/julianbleecker/156303245/

Mais conteúdo relacionado

Mais procurados

E2E testing frameworks:lo bueno, lo malo y lo feo
E2E testing frameworks:lo bueno, lo malo y lo feoE2E testing frameworks:lo bueno, lo malo y lo feo
E2E testing frameworks:lo bueno, lo malo y lo feoAbel Quintana Lopez
 
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Iván López Martín
 
Testing como parte de la cultura DevOps
Testing como parte de la cultura DevOpsTesting como parte de la cultura DevOps
Testing como parte de la cultura DevOpsAbel Quintana Lopez
 
Cómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebasCómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebasAbel Quintana Lopez
 
Presentacion de integracion continua (lima agile)
Presentacion de integracion continua (lima agile)Presentacion de integracion continua (lima agile)
Presentacion de integracion continua (lima agile)Gustavo Veliz
 
Casper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalCasper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalDavid Gil Sánchez
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJSRodrigo Pimentel
 
Capacidades de programación de procesos Asíncronos
Capacidades de programación de procesos AsíncronosCapacidades de programación de procesos Asíncronos
Capacidades de programación de procesos AsíncronosEsteve Graells
 
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de PruebasGlobant
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Continuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioContinuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioOsvaldo
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7Luis Ruiz Pavón
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaJorge Pacheco Mengual
 
Capistrano drupalcamp-jerez-2015
Capistrano drupalcamp-jerez-2015Capistrano drupalcamp-jerez-2015
Capistrano drupalcamp-jerez-2015David Gil Sánchez
 

Mais procurados (20)

E2E testing frameworks:lo bueno, lo malo y lo feo
E2E testing frameworks:lo bueno, lo malo y lo feoE2E testing frameworks:lo bueno, lo malo y lo feo
E2E testing frameworks:lo bueno, lo malo y lo feo
 
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
 
Jenkins, no me rompas los builds!
Jenkins, no me rompas los builds!Jenkins, no me rompas los builds!
Jenkins, no me rompas los builds!
 
Testing como parte de la cultura DevOps
Testing como parte de la cultura DevOpsTesting como parte de la cultura DevOps
Testing como parte de la cultura DevOps
 
Cómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebasCómo iniciarme en el mundo de la automatización de pruebas
Cómo iniciarme en el mundo de la automatización de pruebas
 
Jenkins ci + selenium
Jenkins ci + seleniumJenkins ci + selenium
Jenkins ci + selenium
 
Presentacion de integracion continua (lima agile)
Presentacion de integracion continua (lima agile)Presentacion de integracion continua (lima agile)
Presentacion de integracion continua (lima agile)
 
Integracion Continua
Integracion ContinuaIntegracion Continua
Integracion Continua
 
Casper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalCasper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end Drupal
 
Spring boot et. al. para el impaciente
Spring boot et. al. para el impacienteSpring boot et. al. para el impaciente
Spring boot et. al. para el impaciente
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
Capacidades de programación de procesos Asíncronos
Capacidades de programación de procesos AsíncronosCapacidades de programación de procesos Asíncronos
Capacidades de programación de procesos Asíncronos
 
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Continuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioContinuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudio
 
Integración Continua
Integración ContinuaIntegración Continua
Integración Continua
 
Scrum overview
Scrum overview Scrum overview
Scrum overview
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en Autentia
 
Capistrano drupalcamp-jerez-2015
Capistrano drupalcamp-jerez-2015Capistrano drupalcamp-jerez-2015
Capistrano drupalcamp-jerez-2015
 

Destaque

BDD: Descubriendo qué requiere realmente tu cliente
BDD: Descubriendo qué requiere realmente tu clienteBDD: Descubriendo qué requiere realmente tu cliente
BDD: Descubriendo qué requiere realmente tu clienteJorge Gamba
 
Introducción a Ganglia
Introducción a GangliaIntroducción a Ganglia
Introducción a GangliaDardo Valdez
 
Alta disponibilidad con MySQL
Alta disponibilidad con MySQLAlta disponibilidad con MySQL
Alta disponibilidad con MySQLDennis Cohn
 
Software Debt: Qué Es y Cómo Gestionarlo Holísticamente
Software Debt: Qué Es y Cómo Gestionarlo HolísticamenteSoftware Debt: Qué Es y Cómo Gestionarlo Holísticamente
Software Debt: Qué Es y Cómo Gestionarlo HolísticamenteAngel Nuñez
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Ricard Clau
 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP applicationJavier López
 
Automatizacion de proyectos con gradle
Automatizacion de proyectos con gradleAutomatizacion de proyectos con gradle
Automatizacion de proyectos con gradleEdson Chávez Montaño
 
Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDDsergiopolo
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesMarcello Duarte
 
Building and Deploying Application to Apache Mesos
Building and Deploying Application to Apache MesosBuilding and Deploying Application to Apache Mesos
Building and Deploying Application to Apache MesosJoe Stein
 
A new model for Docker image distribution
A new model for Docker image distributionA new model for Docker image distribution
A new model for Docker image distributionDocker, Inc.
 

Destaque (18)

Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Introducción a LDAP
Introducción a LDAPIntroducción a LDAP
Introducción a LDAP
 
BDD: Descubriendo qué requiere realmente tu cliente
BDD: Descubriendo qué requiere realmente tu clienteBDD: Descubriendo qué requiere realmente tu cliente
BDD: Descubriendo qué requiere realmente tu cliente
 
Introducción a Ganglia
Introducción a GangliaIntroducción a Ganglia
Introducción a Ganglia
 
Alta disponibilidad con MySQL
Alta disponibilidad con MySQLAlta disponibilidad con MySQL
Alta disponibilidad con MySQL
 
Software Debt: Qué Es y Cómo Gestionarlo Holísticamente
Software Debt: Qué Es y Cómo Gestionarlo HolísticamenteSoftware Debt: Qué Es y Cómo Gestionarlo Holísticamente
Software Debt: Qué Es y Cómo Gestionarlo Holísticamente
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
OAUTH introducción y entretenida explicación.
OAUTH introducción y entretenida explicación.OAUTH introducción y entretenida explicación.
OAUTH introducción y entretenida explicación.
 
Conferencia Monitoreo de Servidores con Nagios
Conferencia Monitoreo de Servidores con NagiosConferencia Monitoreo de Servidores con Nagios
Conferencia Monitoreo de Servidores con Nagios
 
TDD with phpspec2
TDD with phpspec2TDD with phpspec2
TDD with phpspec2
 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP application
 
Maven Overview
Maven OverviewMaven Overview
Maven Overview
 
Automatizacion de proyectos con gradle
Automatizacion de proyectos con gradleAutomatizacion de proyectos con gradle
Automatizacion de proyectos con gradle
 
Integrando sonar
Integrando sonarIntegrando sonar
Integrando sonar
 
Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDD
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Building and Deploying Application to Apache Mesos
Building and Deploying Application to Apache MesosBuilding and Deploying Application to Apache Mesos
Building and Deploying Application to Apache Mesos
 
A new model for Docker image distribution
A new model for Docker image distributionA new model for Docker image distribution
A new model for Docker image distribution
 

Semelhante a Conferencia Rails: Integracion Continua Y Rails

Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesJobsket
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y BackEric Zeidan
 
Programa en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier RamirezPrograma en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier Ramirezjavier ramirez
 
Javier Ramirez Rails Plugins Pdf
Javier Ramirez Rails Plugins PdfJavier Ramirez Rails Plugins Pdf
Javier Ramirez Rails Plugins Pdfjavier ramirez
 
Rails Plugins. Javier Ramirez
Rails Plugins. Javier RamirezRails Plugins. Javier Ramirez
Rails Plugins. Javier Ramirezjavier ramirez
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Nelson Rojas Núñez
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishJordi Llonch
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishJordi Llonch
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishAkamon Engineering
 
Test Driven Infrastructure
Test Driven InfrastructureTest Driven Infrastructure
Test Driven InfrastructureAngel Nuñez
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Integracion Continua
Integracion ContinuaIntegracion Continua
Integracion ContinuaLenin Lozano
 
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CICalidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CIYannick Warnier
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...Plain Concepts
 
Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Ignacio Muñoz Vicente
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el diaFrancisco Aranda
 

Semelhante a Conferencia Rails: Integracion Continua Y Rails (20)

Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y Back
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Programa en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier RamirezPrograma en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier Ramirez
 
Javier Ramirez Rails Plugins Pdf
Javier Ramirez Rails Plugins PdfJavier Ramirez Rails Plugins Pdf
Javier Ramirez Rails Plugins Pdf
 
Rails Plugins. Javier Ramirez
Rails Plugins. Javier RamirezRails Plugins. Javier Ramirez
Rails Plugins. Javier Ramirez
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
Test Driven Infrastructure
Test Driven InfrastructureTest Driven Infrastructure
Test Driven Infrastructure
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Conociendo Nuestro Fua interno
Conociendo Nuestro Fua internoConociendo Nuestro Fua interno
Conociendo Nuestro Fua interno
 
Integracion Continua
Integracion ContinuaIntegracion Continua
Integracion Continua
 
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CICalidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI
Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
 
Framework Catalyst
Framework CatalystFramework Catalyst
Framework Catalyst
 
Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia
 

Mais de David Calavera

Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9David Calavera
 
GTAC: AtomPub, testing your server implementation
GTAC: AtomPub, testing your server implementationGTAC: AtomPub, testing your server implementation
GTAC: AtomPub, testing your server implementationDavid Calavera
 
ApacheCon: Abdera A Java Atom Pub Implementation
ApacheCon: Abdera A Java Atom Pub ImplementationApacheCon: Abdera A Java Atom Pub Implementation
ApacheCon: Abdera A Java Atom Pub ImplementationDavid Calavera
 
Taller sobre la api 11870.com
Taller sobre la api 11870.comTaller sobre la api 11870.com
Taller sobre la api 11870.comDavid Calavera
 
atomPub, ruby y la api de 11870
atomPub, ruby y la api de 11870atomPub, ruby y la api de 11870
atomPub, ruby y la api de 11870David Calavera
 

Mais de David Calavera (8)

Trinidad
TrinidadTrinidad
Trinidad
 
JRuby hacking guide
JRuby hacking guideJRuby hacking guide
JRuby hacking guide
 
My name is Trinidad
My name is TrinidadMy name is Trinidad
My name is Trinidad
 
Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9
 
GTAC: AtomPub, testing your server implementation
GTAC: AtomPub, testing your server implementationGTAC: AtomPub, testing your server implementation
GTAC: AtomPub, testing your server implementation
 
ApacheCon: Abdera A Java Atom Pub Implementation
ApacheCon: Abdera A Java Atom Pub ImplementationApacheCon: Abdera A Java Atom Pub Implementation
ApacheCon: Abdera A Java Atom Pub Implementation
 
Taller sobre la api 11870.com
Taller sobre la api 11870.comTaller sobre la api 11870.com
Taller sobre la api 11870.com
 
atomPub, ruby y la api de 11870
atomPub, ruby y la api de 11870atomPub, ruby y la api de 11870
atomPub, ruby y la api de 11870
 

Último

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 

Último (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 

Conferencia Rails: Integracion Continua Y Rails

  • 1. Integración Continua y Rails David Calavera 11870.com
  • 2. ego slide • desarrollador en 11870.com • open source: Hudson, Netbeans • commiter de la Fundación Apache
  • 4.
  • 6. sobre que NO trata esta charla
  • 7. nada que nos enganche Texto más a Rails
  • 8. como configurar un servidor de CI
  • 9. sobre que trata esta charla
  • 14. practica de reunir el código que estamos desarrollando frecuentemente, para verificarlo y evitar errores ” David Calavera
  • 15. Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly ” reduced integration problems and allows a team to develop cohesive software more rapidly. Martin Fowler
  • 19. descubrir errores pronto http://www.agitar.com/solutions/why_unit_testing.html
  • 20. baja calidad del código
  • 23. automatizar el build • reducir el número de procesos manuales • ¡¡Rails --tasks --silent | wc -l a ejecutar!! incorpora 71 tareas • rake • ¡¡Capistrano añade 22 -tareas más!! • expr `cap --tasks | wc -l` 7
  • 25. reducir su duración • usar una máquina dedicada para CI • mejorar el rendimiento de nuestros tests • separar los tests por categorías • ejecutar el build por etapas
  • 26. ejecutar los test en paralelo • sudo gem install deep_test DeepTest::TestTask.new 'deep_test:functionals' do |t| t.pattern = quot;test/functional/**/*_test.rbquot; t.number_of_workers = 2 end
  • 27. ejecutar los test en paralelo • también para RSpec Spec::Rake::SpecTask.new 'deep_spec:functionals' do |t| t.spec_files = FileList['spec/functional/**/*_spec.rb'] t.deep_test :number_of_workers => 2 end
  • 28. ejecutar los test en paralelo • ¡con una base de datos para cada worker! DeepTest::TestTask.new 'deep_test:functionals' do |t| t.pattern = quot;test/functional/**/*_test.rbquot; t.worker_listener = 'DeepTest::Database::MysqlSetupListener' end
  • 29. usar un servidor de CI • preguntar por cambios en el repositorio • realizar acciones en horarios determinados • soportar diferentes herramientas • mostrar builds históricos • soportar diferentes tipos de informes • soportar diferentes tipos de notificaciones
  • 31. CruiseControl.rb • muy POCO “user friendly” • plugins perdidos por internet • pero muy fáciles de desarrollar • http://cruisecontrolrb.thoughtworks.com
  • 33. Hudson • MUY “user friendly” • plugins muy fácilmente localizables • pero algo más complicado de desarrollar • http://hudson.dev.java.net
  • 35. Run Code Run • de momento solo proyectos open source • de momento solo se integra con github • soporte de CI para la última Rails Rumble • http://runcoderun.com
  • 41. arreglar el build inmediatamente
  • 45. ¿qué pasos hay que seguir para montar un sistema de CI?
  • 46. 1. integración de la base de datos
  • 47. lo que hay que hacer • automatizar los cambios de la base de datos • crear la base de datos • modificar la base de datos • testing e inspección
  • 48. Migraciones • muchas mejoras desde Rails 2.1 create db/migrate/20081112232842_modify_user.rb class ModifyUser < ActiveRecord::Migration def self.up change_table :user do |user| t.rename :surname, :last_name t.remove :age ... end end end
  • 50. test unitarios • enfocados en un objeto • comprobar installes totalmente unitario que • sudo gem unit_record ActiveRecord::Base.disconnect! • usar mocks en lugar de fixtures
  • 51. test unitarios • ¡¡hay que hacerlos para cualquier clase!! •sudo gem install unit_controller def setup @controller = UserController.new @controller.do_not_render_vew end
  • 52. test funcionales • usa factories en lugar de fixtures • sudo gem install thoughtbot-factory_girl Factory.define :user do |u| u.first_name 'Joe' u.last_name 'Doe' u.email {|att| quot;#{att.first_name}@example.comquot;.downcase } end
  • 53. test funcionales • ¡¡hay que hacerlos modelotodas lasde datos para clases!! • interacción entre el y la base • interacción entre el modelo y el controlador • interacción entre el controlador y la vista
  • 55. reducir la complejidad • Flog def flog(output, *directories) `find #{directories.join(quot; quot;)} -name *.rb|xargs flog > #{RAILS_ROOT}/tmp/flog/#{output}.txt` end desc quot;Flog models, controller, helpers and libquot; task :flog do flog quot;allquot;, *%w[app/models app/controllers app/helpers lib] end
  • 56. eliminar código duplicado o sin usar • Dust def unused_lvar a = 1 1 + 2 end d = Dust::LocalVariableDuster.new(Object, :unused_lvar) d.dust! d.warnings
  • 57. eliminar código duplicado o sin usar • PMD-CPD def cpd(*directories) `java net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 -files #{directories.map(quot; --files quot;)} --language ruby` end task :cpd do cpd *%w[app/models app/controllers app/helpers lib] end
  • 58. comprobar cobertura • Rcov desc 'Test coverage report' task :coverage do rm_f quot;coveragequot; rm_f quot;coverage.dataquot; rcov = quot;rcov --rails --aggregate coverage.data -Ilibquot; `#{rcov} --no-html test/unit/*_test.rb` `#{rcov} --no-html test/functional/*_test.rb` `#{rcov} --html test/integration/*_test.rb` `open coverage/index.html` if PLATFORM['darwin'] end
  • 59. all in one • Metrics_fu para cruisecontrol.rb • Saikuro • Flog • Rcov • Rails stats • RubyMetrics para hudson • Rcov • Rails stats
  • 62. deploy continuo • etiquetar el repositorio • producir un entorno limpio • etiquetar cada build • tener la capacidad de volver atrás
  • 64. feedback continuo • la información correcta • a la persona indicada • en el momento esperado • de la forma correcta
  • 65.
  • 66.
  • 67.
  • 69. Fotos • http://flickr.com/photos/chicanerii/507573394 • http://flickr.com/photos/3epmedia/1160364177 • http://flickr.com/photos/cathycracks/183170786 • http://flickr.com/photos/smitty/2245445147/ • http://flickr.com/photos/fcw/384316867/ • http://www.flickr.com/photos/auxesis/2965947278/ • http://www.flickr.com/photos/penguin_man44/1203331011/ • http://flickr.com/photos/rekha6/2902282813/ • http://flickr.com/photos/teepee1/1508261796/ • http://flickr.com/photos/teepee1/2614839885/ • http://flickr.com/photos/_saturnine/2294717858/ • http://flickr.com/photos/ezra/459279198/ • http://flickr.com/photos/x180/1397019888 • http://flickr.com/photos/soulcheck/384769773/ • http://flickr.com/photos/znachor/255143511/ • http://flickr.com/photos/julianbleecker/156303245/