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
  ...
“   Continuous Integration is a software development
    practice where members of a team integrate their work
    frequen...
¿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!!
           ...
¡¡autodestrucción!!
reducir su duración

• usar una máquina dedicada para CI
• mejorar el rendimiento de nuestros tests
• separar los tests po...
ejecutar los test en
            paralelo
• sudo gem install deep_test
DeepTest::TestTask.new 'deep_test:functionals' do |...
ejecutar los test en
            paralelo
• también para RSpec
Spec::Rake::SpecTask.new 'deep_spec:functionals' do |t|
  t...
ejecutar los test en
            paralelo
• ¡con una base de datos para cada worker!
DeepTest::TestTask.new 'deep_test:fun...
usar un servidor de CI

• preguntar por cambios en el repositorio
• realizar acciones en horarios determinados
• soportar ...
CruiseControl.rb
CruiseControl.rb

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

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


•
Run Code Run

• de momento solo proyectos open source
• de momento solo se integra con github
• soporte de CI para la últi...
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 d...
Migraciones

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

class ModifyUser < Activ...
2. Testing continuo
test unitarios

• enfocados en un objeto
• comprobar installes totalmente unitario
             que
    •
    sudo gem    ...
test unitarios

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

def setup
  @controller...
test funcionales

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

Factory.define :...
test funcionales

• ¡¡hay que hacerlos modelotodas lasde datos
                          para           clases!!
  •  inte...
3. Inspección continua
reducir la complejidad

• Flog
def flog(output, *directories)
  `find #{directories.join(quot; quot;)} -name *.rb|xargs fl...
eliminar código
      duplicado o sin usar
• Dust
def unused_lvar
  a = 1
  1 + 2
end

d = Dust::LocalVariableDuster.new(O...
eliminar código
      duplicado o sin usar
• PMD-CPD
def cpd(*directories)
  `java net.sourceforge.pmd.cpd.CPD --minimum-t...
comprobar cobertura

• Rcov
desc 'Test coverage report'
task :coverage do
  rm_f quot;coveragequot;
  rm_f quot;coverage.d...
all in one

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

• etiquetar el repositorio
• producir un entorno limpio
• etiquetar cada build
• tener la capacidad de vo...
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/phot...
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y Rails
Upcoming SlideShare
Loading in...5
×

Conferencia Rails: Integracion Continua Y Rails

2,073

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,073
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
25
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Conferencia Rails: Integracion Continua Y Rails"

  1. 1. Integración Continua y Rails David Calavera 11870.com
  2. 2. ego slide • desarrollador en 11870.com • open source: Hudson, Netbeans • commiter de la Fundación Apache
  3. 3. sobre mi
  4. 4. sobre la charla
  5. 5. sobre que NO trata esta charla
  6. 6. nada que nos enganche Texto más a Rails
  7. 7. como configurar un servidor de CI
  8. 8. sobre que trata esta charla
  9. 9. usar menos herramientas
  10. 10. automatizar tareas
  11. 11. calidad del código
  12. 12. ¿qué es integración continua?
  13. 13. “ practica de reunir el código que estamos desarrollando frecuentemente, para verificarlo y evitar errores ” David Calavera
  14. 14. “ 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
  15. 15. ¿para qué sirve?
  16. 16. reducir riesgos
  17. 17. falta de cohesión
  18. 18. descubrir errores pronto http://www.agitar.com/solutions/why_unit_testing.html
  19. 19. baja calidad del código
  20. 20. evitar repetir procesos manuales
  21. 21. generar deploys en cualquier momento
  22. 22. 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
  23. 23. ¡¡autodestrucción!!
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. 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
  29. 29. CruiseControl.rb
  30. 30. CruiseControl.rb • muy POCO “user friendly” • plugins perdidos por internet • pero muy fáciles de desarrollar • http://cruisecontrolrb.thoughtworks.com
  31. 31. Hudson
  32. 32. Hudson • MUY “user friendly” • plugins muy fácilmente localizables • pero algo más complicado de desarrollar • http://hudson.dev.java.net
  33. 33. Run Code Run •
  34. 34. 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
  35. 35. mejorar la perspectiva
  36. 36. aumentar la confianza
  37. 37. ¿cuáles son las reglas básicas?
  38. 38. commit frecuente
  39. 39. no subir código roto
  40. 40. arreglar el build inmediatamente
  41. 41. escribir test automáticos
  42. 42. hacer builds en local
  43. 43. evitar usar código roto
  44. 44. ¿qué pasos hay que seguir para montar un sistema de CI?
  45. 45. 1. integración de la base de datos
  46. 46. 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
  47. 47. 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
  48. 48. 2. Testing continuo
  49. 49. test unitarios • enfocados en un objeto • comprobar installes totalmente unitario que • sudo gem unit_record ActiveRecord::Base.disconnect! • usar mocks en lugar de fixtures
  50. 50. test unitarios • ¡¡hay que hacerlos para cualquier clase!! •sudo gem install unit_controller def setup @controller = UserController.new @controller.do_not_render_vew end
  51. 51. 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
  52. 52. 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
  53. 53. 3. Inspección continua
  54. 54. 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
  55. 55. 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
  56. 56. 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
  57. 57. 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
  58. 58. all in one • Metrics_fu para cruisecontrol.rb • Saikuro • Flog • Rcov • Rails stats • RubyMetrics para hudson • Rcov • Rails stats
  59. 59. revisión de código
  60. 60. 4. Deploy continuo
  61. 61. deploy continuo • etiquetar el repositorio • producir un entorno limpio • etiquetar cada build • tener la capacidad de volver atrás
  62. 62. 5. Feedback continuo
  63. 63. feedback continuo • la información correcta • a la persona indicada • en el momento esperado • de la forma correcta
  64. 64. ¿alguna pregunta?
  65. 65. 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/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×