Integrazione continua con TFS Build

1,023 views

Published on

Grazie a Team Foundation Build è possibile adottare pratiche di integrazione continua nel proprio progetto. In questa presentazione viene introdotta la struttura di tfs build assieme alle tecniche base per effettuare una customizzazione della build.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,023
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Integrazione continua con TFS Build

  1. 1.
  2. 2. MSBuild in action<br />Ricci Gian Maria <br />MVP Visual Studio ALM<br />
  3. 3. Essere agili in un mondo in rapido cambiamento<br />Cicli di produzione agili richiedono procedure agili<br />L’agilità richiede visibilità totale sul progetto<br />Deve essere possibile verificare in ogni momento lo “stato di salute” del progetto<br />
  4. 4. Monitoraggio costante del progetto<br />Per approcciare con successo cicli di vita agili, è necessario avere visibilità massima sul progetto<br />La situazione peggiore è quella in cui la visibilità è praticamente nulla<br />Con visibilità ridotta, il pm può solamente effettuare ping sugli sviluppatori<br />No<br />Maybe<br />Is the project finished?<br />ONE WEEK LATER<br />The customersaidit miss feature ABC<br />Toomanytests are failing<br />Westill miss the setup, oneday more<br />Just one week more<br />
  5. 5. Il concetto di “integrazione”<br />Uno dei problemi maggiori di “visibilità” è il classico IntegrationHell<br />Questo problema avviene quando le varie parti del sistema sono messe insieme per formare il prodotto finale<br />
  6. 6. Il concetto di “integrazione”<br />Solo sistemi con un design perfetto in un mondo perfetto non soffrono di problemi di integrazione<br />Nei team standard, è molto difficile raggiungere un integrazione perfetta tra le parti al primo colpo<br />
  7. 7. Il concetto di “integrazione”<br />La soluzione più semplice al problema è integrare il più spesso possibile<br />Questo approccio garantisce una maggiore visibilità, ed evita di posticipare i problemi che si possono incontrare durante l’integrazione<br />
  8. 8. La vita realedi un progetto<br />Molto spessoglisviluppatoriassumono come “statodi salute” del progettociòcheaccadenelloro pc<br />Questomododipensare è riassuntodallafrase “It works on my machine”<br />Solitamentequindimoltiaspettivengonodimenticati o sottovalutati<br />Installer<br />Deploy in produzione<br />Configurazionedei server<br />Security (sviluppatorichelavorano come admin)<br />
  9. 9. Esempiotipico Setup diapplicazioni windows<br />Creareil setup di un progetto è solitamente (purtroppo) l’ultimaoperazionechevienefatta, spessodifretta<br />Si credeerroneamentecheesista un magico tool che con due click faccia un setup perfetto<br />In applicazioni non banaliquesto non è vero<br />Creare e manutenere fin dall’inizioil setup di un progettopermettediaffrontaresubitoiproblemi<br />
  10. 10. Come integrare <br />Integrare subito il progetto, ovvero rendere il progetto fruibile al cliente fin dalla prima feature implementata<br />I problemi vengono affrontati poco a poco, il progetto è quasi sempre in uno stato “rilasciabile”<br />
  11. 11. Macchine di Integrazione o Build<br />Il maggiornumerodioperazionidiintegrazionedeveessereautomatizzatatramite script<br />Questi script verrannoeseguitiautomaticamentedamacchinedi Build<br />TFS supportanativamentequestoconcettotramitei “build agent” e Tfs build<br />BuildAgent<br />TFS<br />BuildAgent<br />
  12. 12. Integrazione continua<br /><ul><li>Gli script di integrazione vengono eseguiti ad ogni check-in
  13. 13. Requisiti:
  14. 14. Repository singolo
  15. 15. Includere nel repository tutti i tool necessari per l’integrazione
  16. 16. Un’infrastruttura per gestire l’esecuzione degli script di build
  17. 17. Si ottiene
  18. 18. Costantemente si sa se i sorgenti compilano o meno
  19. 19. Costantemente è possibile verificare lo stato dei test e delle metriche di codice
  20. 20. Si possono eseguire operazioni custom, come ad esempio mandare mail, messaggi su twitter, modificare settaggi di IIS, etc</li></li></ul><li>Integrazione continua, performances <br />L’integrazione continua puòessere resource intensive per il server di build <br />TFS permettel’usodipiù server contemporaneamente, ma potrebbe non bastare<br />
  21. 21. Crearepiù script differenti<br />Si possonocrearepiù script differenti, ogniunodeiqualideputato ad operazionidifferenti<br />Situazionetipica<br />Compilaretuttiiprogetti ad ogni check-in<br />Eseguirei test ad ogni check-in ma non piùspessodiunavoltaogniora.<br />Eseguireoperazioni molto pesanti o test dicaricounavolta al giorno (nightly build)<br />Follow the ten minute rule<br />
  22. 22. Tfs e frequenzadelle build<br />TFS supportamoltiscenari<br />Compilazione ad ognicheckin (continuous)<br />Compilazione a certiintervalli(Es. nightly build)<br />Compilazionemanuale<br />Compilare ad ogni check-in, ma non piùspessodi un datointervallo<br />Build<br />Check-In<br />Check-In<br />Check-In<br />Build<br />Check-In<br />TFS<br />Check-In<br />
  23. 23. Punti di estensione<br />Come estenderetfs build per soddisfareesigenzespecifiche<br />
  24. 24. Come estendere tfsbuild<br />TFS 2008 supportal’esensionetramiteMsBuild<br />Si possonoeseguireoperazioni custom scrivendodei Custom Task dimsbuild<br />La conoscenzadiMsBuild è comunqueimportante, perchè è possibileusareipropri Custom Task anche in TFS 2010<br />MsBuildvienecomunqueusato per la fasedicompilazione e puòessereusato per customizzare la compilazionedeiprogetti(csproj, vbproj, etc)<br />
  25. 25. Come estendere TFS 2010 build<br />Use a MSBuild Activity to call MSBuild wrapper around a MsBuild task<br />
  26. 26. Come estendere TFS 2010 build<br />Use a MSBuild Activity to call MSBuild wrapper around a MsBuild task<br />
  27. 27. Come estendere TFS 2010 build<br />Wrap MsBuild task in a custom Workflow Activity<br />
  28. 28. Come estendere TFS 2010 build<br />Wrap MsBuild task in a custom Workflow Activity<br />
  29. 29. Come estendere TFS 2010 build<br />Write a custom Workflow Activity<br />
  30. 30. Come estendere TFS 2010 build<br />Write a custom Workflow Activity<br />
  31. 31. Come estendere TFS 2010 build<br />Extract the logic into a POCO class and create wrappers<br />
  32. 32. Come estendere TFS 2010 build<br />Extract the logic into a POCO class and create wrappers<br />
  33. 33. Estensione – Twitter<br />Come eseguire un tweet in particolarimomentidella build<br />
  34. 34. Perchè twitter<br />Disponibilesumoltepiattaforme<br />Disponibilesututti I browser come plugin<br />Affidabile e facile dausare.<br />Puòesseresottoscritto o menodallepersoneinteressate<br />BuildAgent<br />
  35. 35. Tweet from MsBuild<br />Demo di tweet in una build con approccioMsBuildtask e Custom Action<br />
  36. 36. Come inserireuna custom activity<br />Nella Beta2 per inserireuna custom activity è necessarioadottareparticolariaccortezze<br />Il workflow diprocessodeveessereaggiuntoedaperto in un progettodi visual studio<br />Il progetto in cui siapreil workflow deve fare parte diunasoluzione dove è caricatoilprogettochecontiene la custom activity<br />
  37. 37. Lab – Deploy di web application<br />Deployare una web application aggiornando nel contempo il database e l’istanza di IIS nel server di test.<br />
  38. 38. Ambiente<br />Tfs<br />Visual studio <br />Database Server<br />Web Server<br />Tuttopuòcomunqueesseremessosu un unicamacchina<br />
  39. 39. Fase 1 – ilprogetto<br />Creareuna solution con due progetti<br />Un database project con lo schema dinorthwind<br />Un progetto web con unasemplicepaginachemostrai clienti<br />Creare un modello entityframework<br />Nella default.aspxinserire un entityDataSource<br />Nella default.aspxinserire una gridview<br />
  40. 40.
  41. 41. Fase 2 – Creare una build e configurare il deploy del database<br />Creare una build per la soluzione<br />Creare una copia del workflow in modo da poterlo customizzare<br />Localizzare nel workflow il punto dove vengono terminati i test.<br />
  42. 42. Fase 2 – creare la build e configurare il deploy del database<br />Quando si crea la build, la drop share folder deve trovarsi nel test web server<br />Il test web server può comunque essere per questo lab anche la macchina virtuale dove gira tfs e visual studio<br />
  43. 43. Fase 3 inserire la condizione ed una sequenza<br />Inserire una condizione (cerchiata di rosso nella schermata precedente) al cui interno inserire una sequence<br />La condizione da inserire è <br />BuildDetail.TestStatus <> BuildPhaseStatus.FailedAndAlsoBuildDetail.CompilationStatus <> BuildPhaseStatus.Failed<br />Cambiare il nome della condizione in qualche cosa di più significativo, ad esempio “If can deploy database”<br />
  44. 44. Fase 4 inserire le azioni<br />Inserire tre azioni come in figura<br />Una convertWorkspaceItem<br />Una Message<br />Un MsBuildTask<br />
  45. 45. Fase 5 – inserire la variabile<br />Cliccare su “variables” e poi aggiungere una variabile chiamata dbProject<br />
  46. 46. Fase 6 – recuperare il nome del database project<br />Configurare la ConvertWorkspaceItem precedentemente configurata<br />Come proprietà input inserire il nome del database project usando il percorso del source control system Es. "$/Demo/NorthwindTest/NorthwindTest.Database/NorthwindTest.Database.dbproj“<br />Come proprietà Result inserire il nome della proprietà creata precedentemente dbProject<br />Infine inserite Workspace come proprietà workspace<br />Ponete particolare attenzione alla sintassi ricordando sempre che si utilizza la sintassi di VisualBasic<br />Infine configurate l’azione di messaggio inserendo un messaggio tipo “Deploying database “ + dbproject<br />
  47. 47. Fase 7 – effettuare il deploy<br />Per il deploy basta configurare l’azione msbuild<br />La proprietà più importante è CommandLineArguments con la quale si specifica l’istanza, il database e dove creare i file. "/p:TargetDatabase=Northwind" +" /p:""DefaultDataPath=C:ProgramFilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATA""" +" /p:""TargetConnectionString=Data Source=10.0.0.99sql2008,49160%3Buser=sa%3Bpassword=pa$$w0rd""" +" /p:DeployToDatabase=true“<br />Inserite nella proprietà LogFile un nome di file per il logging e nella proprietà LogFileDropLocation il valore logFileDropLocation<br />Come outDir il valore BinariesDirectory<br />Come Project il valore del progetto, contenuto nella variabile dbProject<br />Come Targets il valore New String() {“Deploy”} con il quale si specifica il target che si vuole eseguire nel progetto database<br />
  48. 48. Azione MsBuild configurata<br />
  49. 49. Primo step completato<br />Tramite questa configurazione si è modificata la build aggiungendo il deploy del database project qualora i test e la compilazione fossero ok<br />Il prossimo passo è modificare il web.config dell’applicazione e far puntare IIS del web server di tset ai compilati della build corrente<br />
  50. 50. Fase 1 – Custom Action<br />Creare un progetto di tipo ClassLibrary<br />Aggiungere due Code activity, IISChangePhisicalDir e XmlPoke<br />Creare un altro progetto classlibrary dove creare due classi XmlFunctions e IISManagerService<br />Copiare il codice fornito nell’esempio nelle varie classi<br />Aggiungere un progetto Workflow console application<br />
  51. 51. Fase 2 – un piccolo test<br />Testare le azioni all’interno del workflow1.xaml creato nel progetto console workflow per verificare che tutto funzioni correttamente.<br />Provare ad esempio con un file xml di test l’azione xmlPoke che modifica parte dell’xml<br />
  52. 52. Fase 3 – il web server<br />Nel web server dovreste trovarvi il risultato di una delle build precedenti<br />Andate nella cartella dove avete fatto la share della drop folder e localizzate la cartella dove è stata deployata la web application<br />Configurate IIS puntandolo alla cartella suddetta e creare un appPool dedicato con un nome specifico Es. NorthwindTest<br />Verificate che il sito funzioni correttamente<br />
  53. 53. Fase 4 – aggiungere le custom action alla build<br />Nella beta 2, per aggiungere le custom action ad un file xaml tramite designer è necessario procedere nel seguente modo<br />Copiare il file della build Es. NorthwindTest.xaml nella cartella del progetto di test WorkflowConsoleApplication creato precedentemente<br />Aggiungere il workflow al progetto<br />Ora è possibile agire tramite designer grafico<br />Quando il file è finito, fare checkout del file nella cartella BuildProcessTemplate, copiare il file modificato e fare checkin<br />
  54. 54. Fase 5 – cambiare la directory di un sito IIS da remoto<br />Inserire dopo la azione msbuild che effettua il deploy del database una azione custom di tipo IISChangePhisicalDir<br />Compilare le proprietà, l’unica che merita una spiegazione è la NewFolder che avrà un valore del tipo "C:BuildsResultNorthWindTest" + BuildDetail.BuildNumber + "PublishedWebsitesNorthwindTest.Web“<br />Questo valore viene calcolato sulla base di <br />Dove è stata fatta la share nel web server di test<br />Si aggiunge il numero di build<br />Si aggiunge il path che porta ai compilati.<br />
  55. 55. Fase 6 - opzionale<br />Il lab potrebbe considerarsi completato, ma in una situazione di produzione, il web.config nel source control non è eguale a quello che serve al web.server<br />Es. Bisogna cambiare la stringa di connessione al sql server.<br />Aggiungre una variabile chiamata webConfigFile<br />Aggiungere una azione standard “Assign” ed assegnare a quela variabile il valore BuildDirectory + "BinariesPublishedWebsitesNorthwindTest.Webweb.config“<br />Aggiungere un azione di messaggio di build in cui si mostra il file che verrà cambiato<br />Aggiungere una azione di tipo XmlPoke e configurarla in modo da cambiare il file web.config nel modo desiderato.<br />
  56. 56. Fase 6 – opzionale <br />I valori per xmlpoke sono ad esempio<br />NewValue (Ricordare le doppie virgolette perché siamo in VisualBasic): "metadata=res://*/Model.NortwindContext.csdl|res://*/Model.NortwindContext.ssdl|res://*/Model.NortwindContext.msl;provider=System.Data.SqlClient;provider connection string=""Data Source=localhostsql2008;InitialCatalog=Northwind;IntegratedSecurity=True;MultipleActiveResultSets=True""“ <br />Xpath: "/connectionStrings/add[@name='NorthwindEntities']/@connectionString"<br />

×