Conferencia Rails: Integracion Continua Y Rails

69
Integración Continua y Rails David Calavera 11870.com

description

 

Transcript of Conferencia Rails: Integracion Continua Y Rails

Page 1: Conferencia Rails: Integracion Continua Y Rails

Integración Continua y Rails

David Calavera11870.com

Page 2: Conferencia Rails: Integracion Continua Y Rails

ego slide

• desarrollador en 11870.com

• open source: Hudson, Netbeans

• commiter de la Fundación Apache

Page 3: Conferencia Rails: Integracion Continua Y Rails

sobre mi

Page 4: Conferencia Rails: Integracion Continua Y Rails
Page 5: Conferencia Rails: Integracion Continua Y Rails

sobre la charla

Page 6: Conferencia Rails: Integracion Continua Y Rails

sobre que

NO trata esta charla

Page 7: Conferencia Rails: Integracion Continua Y Rails

Texto

nada que nos enganche

más a Rails

Page 8: Conferencia Rails: Integracion Continua Y Rails

como configurar

un servidor de CI

Page 9: Conferencia Rails: Integracion Continua Y Rails

sobre que trata esta charla

Page 10: Conferencia Rails: Integracion Continua Y Rails

usar menos herramientas

Page 11: Conferencia Rails: Integracion Continua Y Rails

automatizar tareas

Page 12: Conferencia Rails: Integracion Continua Y Rails

calidad del código

Page 13: Conferencia Rails: Integracion Continua Y Rails

¿qué es integración continua?

Page 14: Conferencia Rails: Integracion Continua Y Rails

practica de reunir el código que estamos desarrollando frecuentemente, para verificarlo y evitar errores

”David Calavera

Page 15: Conferencia Rails: Integracion Continua Y Rails

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

Page 16: Conferencia Rails: Integracion Continua Y Rails

¿para qué sirve?

Page 17: Conferencia Rails: Integracion Continua Y Rails

reducir riesgos

Page 18: Conferencia Rails: Integracion Continua Y Rails

falta de cohesión

Page 19: Conferencia Rails: Integracion Continua Y Rails

descubrir errores pronto

http://www.agitar.com/solutions/why_unit_testing.html

Page 20: Conferencia Rails: Integracion Continua Y Rails

baja calidad del código

Page 21: Conferencia Rails: Integracion Continua Y Rails

evitar repetir

procesos manuales

Page 22: Conferencia Rails: Integracion Continua Y Rails

generar deploys

en cualquier momento

Page 23: Conferencia Rails: Integracion Continua Y Rails

automatizar el build

• reducir el número de procesos manuales

• ¡¡Rails incorpora 71 tareas a ejecutar!!• rake --tasks --silent | wc -l

• ¡¡Capistrano añade 22 tareas más!!• expr `cap --tasks | wc -l` - 7

Page 24: Conferencia Rails: Integracion Continua Y Rails

¡¡autodestrucción!!

Page 25: Conferencia Rails: Integracion Continua Y Rails

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

Page 26: Conferencia Rails: Integracion Continua Y Rails

ejecutar los test en paralelo

• sudo gem install deep_test

DeepTest::TestTask.new 'deep_test:functionals' do |t| t.pattern = "test/functional/**/*_test.rb" t.number_of_workers = 2end

Page 27: Conferencia Rails: Integracion Continua Y Rails

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 => 2end

Page 28: Conferencia Rails: Integracion Continua Y Rails

ejecutar los test en paralelo

• ¡con una base de datos para cada worker!

DeepTest::TestTask.new 'deep_test:functionals' do |t| t.pattern = "test/functional/**/*_test.rb" t.worker_listener = 'DeepTest::Database::MysqlSetupListener'end

Page 29: Conferencia Rails: Integracion Continua Y Rails

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

Page 30: Conferencia Rails: Integracion Continua Y Rails

CruiseControl.rb

Page 31: Conferencia Rails: Integracion Continua Y Rails

CruiseControl.rb

• muy POCO “user friendly”

• plugins perdidos por internet

• pero muy fáciles de desarrollar

• http://cruisecontrolrb.thoughtworks.com

Page 32: Conferencia Rails: Integracion Continua Y Rails

Hudson

Page 33: Conferencia Rails: Integracion Continua Y Rails

Hudson

• MUY “user friendly”

• plugins muy fácilmente localizables

• pero algo más complicado de desarrollar

• http://hudson.dev.java.net

Page 34: Conferencia Rails: Integracion Continua Y Rails

Run Code Run

Page 35: Conferencia Rails: Integracion Continua Y Rails

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

Page 36: Conferencia Rails: Integracion Continua Y Rails

mejorar la perspectiva

Page 37: Conferencia Rails: Integracion Continua Y Rails

aumentar la confianza

Page 38: Conferencia Rails: Integracion Continua Y Rails

¿cuáles son las reglas básicas?

Page 39: Conferencia Rails: Integracion Continua Y Rails

commit frecuente

Page 40: Conferencia Rails: Integracion Continua Y Rails

no subir

código roto

Page 41: Conferencia Rails: Integracion Continua Y Rails

arreglar el build

inmediatamente

Page 42: Conferencia Rails: Integracion Continua Y Rails

escribir test automáticos

Page 43: Conferencia Rails: Integracion Continua Y Rails

hacer builds en local

Page 44: Conferencia Rails: Integracion Continua Y Rails

evitar usar código roto

Page 45: Conferencia Rails: Integracion Continua Y Rails

¿qué pasos hay que seguir para

montar un sistema de CI?

Page 46: Conferencia Rails: Integracion Continua Y Rails

1. integración de la base de datos

Page 47: Conferencia Rails: Integracion Continua Y Rails

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

Page 48: Conferencia Rails: Integracion Continua Y Rails

Migraciones

• muchas mejoras desde Rails 2.1create 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 endend

Page 49: Conferencia Rails: Integracion Continua Y Rails

2. Testing continuo

Page 50: Conferencia Rails: Integracion Continua Y Rails

test unitarios

• enfocados en un objeto

• comprobar que es totalmente unitario• sudo gem install unit_record

• usar mocks en lugar de fixtures

ActiveRecord::Base.disconnect!

Page 51: Conferencia Rails: Integracion Continua Y Rails

test unitarios

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

def setup @controller = UserController.new @controller.do_not_render_vewend

Page 52: Conferencia Rails: Integracion Continua Y Rails

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| "#{att.first_name}@example.com".downcase }end

Page 53: Conferencia Rails: Integracion Continua Y Rails

test funcionales

• ¡¡hay que hacerlos para todas las clases!!• interacción entre el modelo y la base de datos

• interacción entre el modelo y el controlador

• interacción entre el controlador y la vista

Page 54: Conferencia Rails: Integracion Continua Y Rails

3. Inspección continua

Page 55: Conferencia Rails: Integracion Continua Y Rails

reducir la complejidad

• Flog

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

desc "Flog models, controller, helpers and lib"task :flog do flog "all", *%w[app/models app/controllers app/helpers lib]end

Page 56: Conferencia Rails: Integracion Continua Y Rails

eliminar código duplicado o sin usar

• Dust

def unused_lvar a = 1 1 + 2end d = Dust::LocalVariableDuster.new(Object, :unused_lvar)d.dust!d.warnings

Page 57: Conferencia Rails: Integracion Continua Y Rails

eliminar código duplicado o sin usar

• PMD-CPD

def cpd(*directories) `java net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 -files #{directories.map(" --files ")} --language ruby`endtask :cpd do cpd *%w[app/models app/controllers app/helpers lib]end

Page 58: Conferencia Rails: Integracion Continua Y Rails

comprobar cobertura

• Rcovdesc 'Test coverage report'task :coverage do rm_f "coverage" rm_f "coverage.data" rcov = "rcov --rails --aggregate coverage.data -Ilib" `#{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

Page 59: Conferencia Rails: Integracion Continua Y Rails

all in one

• Metrics_fu para cruisecontrol.rb• Saikuro

• Flog

• Rcov

• Rails stats

• RubyMetrics para hudson• Rcov

• Rails stats

Page 60: Conferencia Rails: Integracion Continua Y Rails

revisión de código

Page 61: Conferencia Rails: Integracion Continua Y Rails

4. Deploy continuo

Page 62: Conferencia Rails: Integracion Continua Y Rails

deploy continuo

• etiquetar el repositorio

• producir un entorno limpio

• etiquetar cada build

• tener la capacidad de volver atrás

Page 63: Conferencia Rails: Integracion Continua Y Rails

5. Feedback continuo

Page 64: Conferencia Rails: Integracion Continua Y Rails

feedback continuo

• la información correcta

• a la persona indicada

• en el momento esperado

• de la forma correcta

Page 65: Conferencia Rails: Integracion Continua Y Rails
Page 66: Conferencia Rails: Integracion Continua Y Rails
Page 67: Conferencia Rails: Integracion Continua Y Rails
Page 68: Conferencia Rails: Integracion Continua Y Rails

¿alguna pregunta?

Page 69: Conferencia Rails: Integracion Continua Y Rails

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/