Tdd e continuous delivery sull'infrastruttura
-
Upload
codemotion -
Category
Technology
-
view
70 -
download
0
Transcript of Tdd e continuous delivery sull'infrastruttura
Filippo Liverani@filippo
2Non scriverai più di un test che sia
sufficiente a provocare un fallimento, e la non compilazione è
un fallimento
piccoli cambiamenti incrementali
sistema sempre funzionante
i fallimenti devono essere risolti subito
perchè?abbatte la complessità
soluzione di un problema complesso → soluzione di problemi più semplici
i beneficicriterio di accettazione implicito
specifica eseguibile
suite di regressione completa
feedback immediato e continuo
le difficoltà?richiede disciplina
cambiare le abitudini è difficile
il management non capisce la qualità interna
beneficisi vede se abbiamo costruito la cosa giustarelease frequenti -> meno rischi per release
indicatore reale di avanzamento
obiettiviaumentare la qualitàdiminuire il cycle time
CYCLE TIME = tempo per portare una modifica di una linea di codice in produzione
il problemail costo per l'integrazione aumenta con:
numero di bug
numero di componenti
tempo trascorso dall'ultima integrazione
i beneficii problemi si trovano subito si trovano facilmentemeno rischi
feedback rapidonessun punto cieco nel processopredizioni più accurate
dai sorgenti ai test che giranonessun intervento manuale
nessuna modifica dell'ambiente
3test automatici
build di riferimentomonitor dello stato del repository
massima priorità alla build funzionante
5 integrazione a ogni commit
stessi problemi che si verificherebbero in produzioneambiente identico
7su un clone di produzione
sistema operativo libreriehardware rete
strutturasequenza di stage
se uno stage fallisce la pipeline si blocca
ogni commit genera una nuova pipeline
sincronizzazione
creazione immagine
provisioning istanza
applicazione cambiamento
applicazione cambiamento
cambiamento cambiamento
immutable server
creazione immagine
provisioning istanza
cambiamento
creazione immagine
provisioning istanza
source coderepository
CI serverproduction
image
commit
test image
dev box
checkout
provision run tests
provision
---driver: name: vagrant
provisioner: name: chef_solo
platforms: - name: ubuntu-14.04
suites: - name: default run_list: - recipe[git::default]
git-cookbook/.kitchen.yml
require 'serverspec'
set :backend, :exec
describe package('git') do it { should be_installed }end
git-cookbook/test/integration/server/serverspec/git_spec.rb
====================================== Recipe Compile Error ======================================== Chef::Exceptions::RecipeNotFound -------------------------------- could not find recipe default for cookbook git>>>>>> Converge failed on instance <default-ubuntu-1404>.
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)
...
"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
... "provisioners": [ { "type": "chef-solo", "cookbook_paths": ["berks-cookbooks"], "run_list": ["git::default"] } ]}
packer.json - 3
$ packer build \ -var 'aws_access_key=YOUR ACCESS KEY' \ -var 'aws_secret_key=YOUR SECRET KEY' \ packer.json
==> Builds finished. The artifacts of successful builds are: --> amazon-ebs: AMIs were created:
eu-west-1: ami-ac3199db
{ "AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Git box",
"Parameters" : { "AmiId" : { "Type" : "String" } },
...
cloudformation.json - 1
...
"Resources" : { "Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Ref" : "AmiId" }, "KeyName" : "git-box-key", "InstanceType" : "t2.micro" } } }}
cloudformation.json - 2
$ aws cloudformation create-stack \ --stack-name git-box \ --region eu-west-1 \ --template-body file://./cloudformation.json --parameters ParameterKey=AmiId,ParameterValue=ami-ac3199db
{ "StackId": "arn:aws:cloudformation:eu-west-1:422553113847:stack/git-box/978445e0-5f78-11e4-95a6-507bb00bdca0"}