tdd e continuous delivery sull'infrastruttura

82
@filippo TDD e Continuous Delivery sull’infrastruttura

Upload: filippo-liverani

Post on 08-Jul-2015

443 views

Category:

Software


0 download

DESCRIPTION

Grazie al fatto che molti dei valori e dei principi del movimento DevOps sono in comune con quelli di Extreme Programming, negli ultimi siamo riusciti ad applicare anche molte dellle pratiche in un contesto più ampio di quello nel quale erano state concepite. In questa sessione mi piacerebbe condividere il percorso che ho seguito per sviluppare una nuova infrastruttura in TDD e per arrivare ad un processo automatico in grado di deployare in produzione tutti i cambiamenti con un click.

TRANSCRIPT

Page 1: TDD e Continuous Delivery sull'infrastruttura

@filippo

TDD e Continuous Deliverysull’infrastruttura

Page 4: TDD e Continuous Delivery sull'infrastruttura

agile + IT operations?

photo credit: https://www.flickr.com/photos/kalexanderson/6354182139/

Page 5: TDD e Continuous Delivery sull'infrastruttura

1. test driven development2. continuous delivery3. nella pratica

Page 6: TDD e Continuous Delivery sull'infrastruttura

Test Driven Development

photo credit: https://www.flickr.com/photos/pagedooley/4308431673/

Page 7: TDD e Continuous Delivery sull'infrastruttura

le 3 leggi del TDD

photo credit: https://www.flickr.com/photos/oldpatterns/5837733407/

Page 8: TDD e Continuous Delivery sull'infrastruttura

1

Non scriverai codice di produzione finché non avrai scritto un test che fallisce

Page 9: TDD e Continuous Delivery sull'infrastruttura

2Non scriverai più di un test che sia

sufficiente a provocare un fallimento, e la non compilazione è

un fallimento

Page 10: TDD e Continuous Delivery sull'infrastruttura

3Non scriverai più codice di

produzione di quanto ne serva per passare il test corrente

Page 11: TDD e Continuous Delivery sull'infrastruttura

piccoli cambiamenti incrementali

sistema sempre funzionante

i fallimenti devono essere risolti subito

Page 12: TDD e Continuous Delivery sull'infrastruttura

perchè?abbatte la complessità

soluzione di un problema complesso → soluzione di problemi più semplici

Page 13: TDD e Continuous Delivery sull'infrastruttura

i beneficicriterio di accettazione implicito

specifica eseguibile

suite di regressione completa

feedback immediato e continuo

Page 14: TDD e Continuous Delivery sull'infrastruttura

le difficoltà?richiede disciplina

cambiare le abitudini è difficile

il management non capisce la qualità interna

Page 15: TDD e Continuous Delivery sull'infrastruttura

continuous delivery

photo credit: https://www.flickr.com/photos/afoncubierta/9049067504/

Page 16: TDD e Continuous Delivery sull'infrastruttura

beneficisi vede se abbiamo costruito la cosa giustarelease frequenti -> meno rischi per release

indicatore reale di avanzamento

Page 17: TDD e Continuous Delivery sull'infrastruttura

obiettiviaumentare la qualitàdiminuire il cycle time

CYCLE TIME = tempo per portare una modifica di una linea di codice in produzione

Page 18: TDD e Continuous Delivery sull'infrastruttura

continuous integration

photo credit: https://www.flickr.com/photos/dps/136565237/

Page 19: TDD e Continuous Delivery sull'infrastruttura

il problemail costo per l'integrazione aumenta con:

numero di bug

numero di componenti

tempo trascorso dall'ultima integrazione

Page 20: TDD e Continuous Delivery sull'infrastruttura

la soluzione?integrazioni rapide e continue senza bloccare il processo

Page 21: TDD e Continuous Delivery sull'infrastruttura

i beneficii problemi si trovano subito si trovano facilmentemeno rischi

feedback rapidonessun punto cieco nel processopredizioni più accurate

Page 22: TDD e Continuous Delivery sull'infrastruttura

le 10 pratiche

photo credit: https://www.flickr.com/photos/edenpictures/3813227079/

Page 23: TDD e Continuous Delivery sull'infrastruttura

1un solo repository

tutto quello che serve deve essere versionato

Page 24: TDD e Continuous Delivery sull'infrastruttura

2 build automatica

artefatto finale pronto per la produzioneogni passo automatizzato

Page 25: TDD e Continuous Delivery sull'infrastruttura

dai sorgenti ai test che giranonessun intervento manuale

nessuna modifica dell'ambiente

3test automatici

Page 26: TDD e Continuous Delivery sull'infrastruttura

4commit frequenti

al MASSIMO una volta al giorno

lavorare sul trunk

Page 27: TDD e Continuous Delivery sull'infrastruttura

build di riferimentomonitor dello stato del repository

massima priorità alla build funzionante

5 integrazione a ogni commit

Page 28: TDD e Continuous Delivery sull'infrastruttura

<10minfeedback immediatodivisione in stage (pipeline)

6build veloce

Page 29: TDD e Continuous Delivery sull'infrastruttura

stessi problemi che si verificherebbero in produzioneambiente identico

7su un clone di produzione

sistema operativo libreriehardware rete

Page 30: TDD e Continuous Delivery sull'infrastruttura

demo e test sempre disponibili

chiaramente identificabile da tutti

8 ultimo artefatto accessibile

Page 31: TDD e Continuous Delivery sull'infrastruttura

comunicazione immediata dello stato

pubblicamente accessibile

9 tutti vedono cosa succede

Page 32: TDD e Continuous Delivery sull'infrastruttura

riduzione dei tempiriduzione degli errorirollback

10 deploy automatico

Page 33: TDD e Continuous Delivery sull'infrastruttura

1. TESTARE2. AUTOMATIZZARE3. VELOCIZZARE

come arrivarci?

Page 34: TDD e Continuous Delivery sull'infrastruttura

delivery pipeline

photo credit: https://www.flickr.com/photos/abuaiman/6267986277/

Page 35: TDD e Continuous Delivery sull'infrastruttura

pipelineimplementazione automatizzata

del processo di build, deploy, test e rilascio

Page 36: TDD e Continuous Delivery sull'infrastruttura

1. visibilità2. feedback3. controllo

Page 37: TDD e Continuous Delivery sull'infrastruttura

strutturasequenza di stage

se uno stage fallisce la pipeline si blocca

ogni commit genera una nuova pipeline

Page 38: TDD e Continuous Delivery sull'infrastruttura
Page 39: TDD e Continuous Delivery sull'infrastruttura

infrastructure as code

photo credit: https://www.flickr.com/photos/mwichary/2348383457/

Page 40: TDD e Continuous Delivery sull'infrastruttura

DevOps+

virtualizzazione e cloud

->

anche l’infrastruttura è codice

Page 41: TDD e Continuous Delivery sull'infrastruttura

collaborazione + automazione

trasferimento della conoscenza

tooling

la potenza del testo

Page 42: TDD e Continuous Delivery sull'infrastruttura

i beneficiripetibilità

tracciabilità

manutenibilità

velocità

Page 43: TDD e Continuous Delivery sull'infrastruttura

immutable servers

photo credit: https://www.flickr.com/photos/mwichary/2348383457/

Page 44: TDD e Continuous Delivery sull'infrastruttura

approccio tradizionalecambiamenti e disallineamenti -

>

snowflake server

Page 45: TDD e Continuous Delivery sull'infrastruttura

sincronizzazione

creazione immagine

provisioning istanza

applicazione cambiamento

applicazione cambiamento

cambiamento cambiamento

Page 46: TDD e Continuous Delivery sull'infrastruttura

immutable server

creazione immagine

provisioning istanza

cambiamento

creazione immagine

provisioning istanza

Page 47: TDD e Continuous Delivery sull'infrastruttura

nella pratica

photo credit: https://www.flickr.com/photos/jurvetson/489257240/

Page 48: TDD e Continuous Delivery sull'infrastruttura

source coderepository

CI serverproduction

image

commit

test image

dev box

checkout

provision run tests

provision

Page 49: TDD e Continuous Delivery sull'infrastruttura
Page 50: TDD e Continuous Delivery sull'infrastruttura

$ git init git-cookbook$ cd git-cookbook

Page 51: TDD e Continuous Delivery sull'infrastruttura

name "git"version "0.1.0"

git-cookbook/metadata.rb

Page 52: TDD e Continuous Delivery sull'infrastruttura

Test Kitchen

Page 53: TDD e Continuous Delivery sull'infrastruttura

$ kitchen init --driver=kitchen-vagrant

Page 54: TDD e Continuous Delivery sull'infrastruttura

---driver: name: vagrant

provisioner: name: chef_solo

platforms: - name: ubuntu-14.04

suites: - name: default run_list: - recipe[git::default]

git-cookbook/.kitchen.yml

Page 55: TDD e Continuous Delivery sull'infrastruttura
Page 56: TDD e Continuous Delivery sull'infrastruttura

require 'serverspec'

set :backend, :exec

describe package('git') do it { should be_installed }end

git-cookbook/test/integration/server/serverspec/git_spec.rb

Page 57: TDD e Continuous Delivery sull'infrastruttura

$ kitchen test

Page 58: TDD e Continuous Delivery sull'infrastruttura

====================================== Recipe Compile Error ======================================== Chef::Exceptions::RecipeNotFound -------------------------------- could not find recipe default for cookbook git>>>>>> Converge failed on instance <default-ubuntu-1404>.

Page 59: TDD e Continuous Delivery sull'infrastruttura

include_recipe "apt"

package "git"

git-cookbook/recipes/default.rb

Page 60: TDD e Continuous Delivery sull'infrastruttura

name "git"version "0.1.0"

depends "apt"

git-cookbook/metadata.rb

Page 61: TDD e Continuous Delivery sull'infrastruttura

source "https://api.berkshelf.com" metadata

git-cookbook/Berksfile

Page 62: TDD e Continuous Delivery sull'infrastruttura

$ kitchen test

Page 63: TDD e Continuous Delivery sull'infrastruttura

Package "git" should be installed Finished in 0.21441 seconds (files took 0.36317 seconds to load) 1 example, 0 failuresFinished verifying <default-ubuntu-1404> (0m33.52s).-----> Kitchen is finished. (1m31.77s)

Page 64: TDD e Continuous Delivery sull'infrastruttura
Page 65: TDD e Continuous Delivery sull'infrastruttura

{ "variables": { "aws_access_key": null, "aws_secret_key": null },

...

packer.json - 1

Page 66: TDD e Continuous Delivery sull'infrastruttura

...

"builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "eu-west-1", "ami_virtualization_type": "hvm", "source_ami": "ami-28ff505f", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "git" }]

...

packer.json - 2

Page 67: TDD e Continuous Delivery sull'infrastruttura

... "provisioners": [ { "type": "chef-solo", "cookbook_paths": ["berks-cookbooks"], "run_list": ["git::default"] } ]}

packer.json - 3

Page 68: TDD e Continuous Delivery sull'infrastruttura

source 'https://api.berkshelf.com' cookbook 'git', path: './git-cookbook'

Berksfile

Page 69: TDD e Continuous Delivery sull'infrastruttura

$ berks vendor

Page 70: TDD e Continuous Delivery sull'infrastruttura

$ packer build \ -var 'aws_access_key=YOUR ACCESS KEY' \ -var 'aws_secret_key=YOUR SECRET KEY' \ packer.json

Page 71: TDD e Continuous Delivery sull'infrastruttura

==> Builds finished. The artifacts of successful builds are: --> amazon-ebs: AMIs were created:

eu-west-1: ami-ac3199db

Page 72: TDD e Continuous Delivery sull'infrastruttura
Page 73: TDD e Continuous Delivery sull'infrastruttura

{ "AWSTemplateFormatVersion" : "2010-09-09",

"Description" : "Git box",

"Parameters" : { "AmiId" : { "Type" : "String" } },

...

cloudformation.json - 1

Page 74: TDD e Continuous Delivery sull'infrastruttura

...

"Resources" : { "Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Ref" : "AmiId" }, "KeyName" : "git-box-key", "InstanceType" : "t2.micro" } } }}

cloudformation.json - 2

Page 75: TDD e Continuous Delivery sull'infrastruttura

$ aws cloudformation create-stack \ --stack-name git-box \ --region eu-west-1 \ --template-body file://./cloudformation.json --parameters ParameterKey=AmiId,ParameterValue=ami-ac3199db

Page 76: TDD e Continuous Delivery sull'infrastruttura

{ "StackId": "arn:aws:cloudformation:eu-west-1:422553113847:stack/git-box/978445e0-5f78-11e4-95a6-507bb00bdca0"}

Page 77: TDD e Continuous Delivery sull'infrastruttura

risorse

Page 78: TDD e Continuous Delivery sull'infrastruttura

https://github.com/filippo-liverani/test-driven-infrastructure

Page 79: TDD e Continuous Delivery sull'infrastruttura
Page 80: TDD e Continuous Delivery sull'infrastruttura
Page 81: TDD e Continuous Delivery sull'infrastruttura
Page 82: TDD e Continuous Delivery sull'infrastruttura

grazie!