Successfully reported this slideshow.
Your SlideShare is downloading. ×

Entregas Contínuas com feature toggles

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
DRY up your views
DRY up your views
Loading in …3
×

Check these out next

1 of 37 Ad
Advertisement

More Related Content

Viewers also liked (20)

Advertisement

Entregas Contínuas com feature toggles

  1. 1. Entregas contínuas com Feature Toggles
  2. 2. Who am I?Solon Aguiar @solonbaneto saguiar@thoughtworks.com www.solonaguiar.com
  3. 3. Once upon a time…
  4. 4. 49 repos!
  5. 5. How to avoid unfinished/unaccepted features to impact UX?
  6. 6. What if… if!
  7. 7. - if toggle_on?(:boleto) li = f.radio_button :type …
  8. 8. Inside the view!
  9. 9. def toggle_on?(key) @toggles ||= @redis.smembers TOGGLE_SET @toggles.include? key.to_s end
  10. 10. toggle_off :boleto it 'does not show boleto as a payment method' do rendered.should_not have_field ‘boleto’ end
  11. 11. toggle_on :boleto it ’shows boleto as a payment method' do rendered.should have_field ‘boleto’ end
  12. 12. Not so easy, mes amis
  13. 13. Develop story Create toggle Manage toggle
  14. 14. declare in puppet set value and description in csv
  15. 15. 1 + 2 = 4
  16. 16. toggles: customer_qa: - payment_with_boleto tw_qa: - payment_with_installments
  17. 17. toggles: active_groups: - accepted - customer_qa overrides: payment_with_installments: on
  18. 18. Toggles Groups Overrides Environments divided activate withinactivate deactivate

Editor's Notes

  • Explicar um pouco o contextoprojetoNãopossofalarnomesnemexemplosreais
  • Explicarporcima a arquiteturaTem váriosserviçosecommerce é o que o usuáriovê
  • Ruby, rails, sinatraPuppet paraprovisionamentoRedisparaconfiguracoesMongo para storage
  • Pessoasespalhadasem 3 lugaresdiferentesQueria-se diminuir o tempo gastofazendo merges de código
  • Time grandeEstóriasemparaleloNo release manager (cherry picking)
  • Where all the people came from
  • Processo de QA lentoEstóriasdemoravam a seraceitospeloclienteBoletos (demoroumuitoparaseraceito)Nãoqueria-se demorarparaintegrar o código.
  • Jáestávamosemprodução.Deployments constantes e/ouemergenciais com bug fixes.Pipeline nãopoderiaficarbloqueadoporalgonãoterminado
  • Resumindo…Varioslugates (tw e cliente)Estavanaproducao (poderiaprecisar de um bugfix a qualquermomento)Processo de qa lentoTime diverso
  • While maintaining one branch
  • E se vocêtivesseumamaneira de sóligaroudesligarcoisasquenãoestivessemprontas. E se vocêsópudessedecidir: “Issonãoestá pronto, o usuárionãodeveutilizar” ou “Issojáestá pronto, mas euqueroexperimentar um pouco”.
  • Decidimosutilizar feature toggles (feature flippers, gatekeepers)Ideiabastante simplesEsconder a funcionalidadeportrás de algoquecontrole
  • Digamosque se estejaadicionando um novo tipo de pagamento (boleto)Demora a implementarMexeemváriosrepositoriosNão se podeirpara prod semtestarbem (muitoscenarios)
  • Implementaçãoqueusa toggles
  • Enfatizarqueéfeitodiretonainterfacetbexiste o cenarioonde o toggle simplesmenteesconde o link parauma nova area q estásendodesenvolvida;
  • Ferramentasutilizadas.Puppet paraconfigurar e redisparaguardar as chavesvalores.Jáeramutilizadasparaoutrasconfiguraçoes da aplicação.Foramadotadastambémpara toggles
  • ImplementaçãoquetornaissopossívelUsa um cache paraevitarbater no redistodahora e sermaisrápidoSóvê se a chaveestánalista de toggles
  • A mudançaparece simples, mas éprecisoalterar a cultura.Tivemosqueadquirirnovoshábitos (o clientetambém).Foipreciso tempo e disciplinaparapoderdeixar o processofluido
  • Healthy code: always deployable.Keep build always green and new functionalities behind a toggle (might need emergency deployments)Parte da estóriaemsi era criar um toggle e deixá-lo desligado.
  • Comunicação e alignementdentro do time: - saber o quedeveriaestarligadoounãoemcadaambiente; - saber qual o toggle de cadaestória; - garantirqueestavaatrás de um toggleAlinhar com o cliente o quedeveriairparaprodução
  • Toggles adicionamcomplexidade no código e nostestestb se devetestarqualquercombinacao de toggles, muitocuidado c/ a explosao combinatorial!Éprecisotestarduassituações: - toggle ligado - toggle desligado
  • No exemplo anterior precisamostestarque se o toggle estádesligado, nãoémostrado a opção de pagar com boleto…Dizerque o hook sohtira o cara da lista e repoe o estado anterior
  • No exemplo anterior precisamostestarque se o toggle estádesligado, nãoémostrado a opção de pagar com boleto…Dizerque o hook sohcoloca o caranalista e voltaaoestado anterior
  • Nãofoitudo um mar de rosas no início
  • Fluxopadrão.Primeiro e o segundopoderiamserinvertidosProblemaspoderiamocorreremváriosdessesestágios
  • Fluxopadrão.Primeiro e o segundopoderiamserinvertidosProblemaspoderiamocorreremváriosdessesestágios
  • Problemaéquenemsemprequemcriava a estóriagerenciava o toggleComo saber o queestáligado?Como saber o queestádisponível?Como trocarestadosfacilmente?
  • Essadificuldade fez degerenciamento fez com quetivéssemoserros (coisasligadasquedeveriamestardesligadas)
  • Decidimosque o processoestavaconfuso (muitacoisapraconfigurar e difícilconhecerestados).Partimosparaumaimplementaçãoqueusayaml e feature groups paraos toggles (agrupavaporestados) e ambientestinhamosestadosquedeveriamestarativados e potencias overrides
  • Toggles foramagrupadosparafacilitar (propriadivisao do yamlfacilitouisso)
  • Toggles agrupadosformam a configuracao de um ambiente
  • Implementaçãoutilizada (groups: tw_qa, custormer_qa, accepted, development). Saber o queestáligadooudisponívelpodeserfacilmentevisto com operaçoes de setMaisfácil o controle de versao e alteracaodiretoem prod
  • EmalgumassituaçoesnaofoifácilMudar um modelo, porexemplo, foicomplicado.Nãopoderíamossimplesmenteesconder a UI parapreencheressescampos. Quando fosse salvar o modelo, dariaproblemaporquealgunscamposseriamnecessarios. Para workaround disso, tivemosqueColocarvalores default paraeeles e esconder o preenchimentojunto do toggle.servicosnaoeramexternos (poderialimitar o toggle aoservico)schemalessQuando se tem muitospontos de entradatambémnãoérecommendávelusar toggles.
  • Antes de cada deploy era precisoverificar se todas as estóriasestavamligadas, alinhar com o cliente o quedeveriairligadoounao e colocarisso no código.Quandotirar o toggle do código?

×