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?