SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Condividere settings dei tool di Red-Gate al team con TFS

Nel post precedente abbiamo illustrato come condividere la cartella degli snippet di SQL Prompt a tutto il team. Abbiamo utilizzato dropbox per condividere e powershell per copiare i file e spostare i puntamenti direttamente sul registry.
Ma se il team lavora con un'installazione di Team Foundation Server oppure se sfrutta Team Foundation Service, la cosa è ancora più semplice poiché non c'è da installare nessun tool aggiuntivo per lo sharing.
Nel post di cui sopra facevamo riferimento a come sfruttare un HD condiviso "in-the-cloud" per ottenere lo sharing nel team, ma lo stesso risultato si ottiene utilizzando, appunto, TFS/TFService (nel caso di Team Foundation Service e TFS Express è tutto free).

Il principio è il medesimo:
- una cartella deve esistere e deve essere sincronizzata per tutti gli sviluppatori del team
- il tool deve dare la possibilità di configurare i puntamenti alle cartelle di configurazione
- uno script deve poter cambiare questi puntamenti

Visto che stiamo parlando sempre di tool di terze parti "attaccati" a SQL Server, cerchiamo di capire come spostare tutti i puntamenti alle configurazioni di ogni plugin di Red-Gate che si utilizza per il ciclo di vita del database. Andremo a configurare nella fattispecie:
SQL Prompt snippets (utilizzati per creare frammenti di codice t-sql)
SQL Compare filter e project file (utilizzati per creare i diff script sulle strutture e per escludere oggetti durante l'operazione di deploy)
SQL Data Compare project file (utilizzato per creare i diff script sui dati)

Con SQL Prompt andremo ad impostare la cartella di caricamento degli snippet (copiandoli anche dalla base per non perdere eventuali modifiche già applicate).
Con SQL Compare andremo ad impostare la cartella di caricamento dei progetti e dei filtri (file .scp e .scpf).
Con SQL Data Compare andremo ad impostare la cartella di caricamento dei progetti (file .sdc).

Ma andiamo per passo. Come Source Control Manager utilizzeremo Team Foundation Service nel nostro esempio.

1) Creazione delle cartelle sotto source control
Immaginiamo di creare una cartella SQLTools sotto il progetto $SampleProject sul TFService dimostrativo.


Una volta fatto il checkin, ogni qual volta abbia luogo una get, la struttura verrà sincronizzata. Chiunque faccia la get latest version si troverà la seguente situazione sul proprio workspace:



2) Copia dei file sulle cartelle sotto controllo del codice sorgente
Prendiamo i nostri file e copiamoli sul source control:
facciamo checkin e tutti avranno, dopo una get, la cartella sincronizzata anche nel contenuto.


3) Creazione del powershell per lo spostamento dei puntamenti alle cartelle di default (scaricarlo direttamente da qui se preferite)
Perfetto, abbiamo tutto quello che serve per condividere i file. I tool però continueranno a puntare alle rispettive cartelle di configurazione di default, ragion per cui dovremo cambiarle direttamente nel registry (e questo è il caso dei plugin di Red-Gate, non è detto che tutti si comportino allo stesso modo). Il powershell script seguente effettua la riconfigurazione dei plugin e del puntamento alle cartelle di configurazione, in base a quali sono i parametri che gli vengono passati (input da tastiera, vi verranno fatte domande durante l'esecuzione).
Vediamolo nel dettaglio:

La prima parte si occupa di richiedere la folder del workspace su cui vogliamo salvare i dati e quella che conterrà gli snippet.

Write-Host "This program will ask some folder information about the RedGate products. Please be sure that you've installed at least the SQL Developer Bundle." -ForegroundColor "cyan"

Write-Host "Press any key to continue (ESC to quit).." -ForegroundColor "cyan"

# comment when executing via ISE

$x = $host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")

if ($x.VirtualKeyCode -eq [char]27) {

    Return

}

 

#region PREREQUISITES

#TFS workspace folder

$WorkspacePath = Split-Path $MyInvocation.MyCommand.Definition -Parent


#ask for the snippet destination folder name

$NewSnippetFolder = $WorkspacePath + "\Snippets"

if(!(Test-Path $NewSnippetFolder))

{

    Write-Host "Destination Snippet folder does not exist (" $SnippetFolderName ")" -ForegroundColor "red"

    Return

}

#endregion

 

Questa sezione si occupa di effettuare la copia dei file snippet dalla folder di default a quella nuova, immessa durante l'esecuzione. Infine viene segnata la nuova folder come proprietà di registro.

#region SNIPPETS MANAGEMENT

#ask for the sql prompt folder name

Write-Host

Write-Host "Please enter the name of the SQL Prompt folder located into ProgramFiles/RedGate path" -ForegroundColor "darkcyan"

$SQLPromptFolder = Read-Host

#copies the snippet files into the dropboxfolder

$LocalAppDataSnippetFolder = $env:LOCALAPPDATA + "\Red Gate\" + $SQLPromptFolder

if(!(Test-Path $LocalAppDataSnippetFolder))

{

    Write-Host "Snippet folder does not exist, you may not have SQL Prompt installed or you specified a wrong SQL Prompt folder name.." -ForegroundColor "red"

    Return

}

#snippets are there, so gather the list and copy them all to the new folder (fallback)

$LocalAppDataSnippets = $LocalAppDataSnippetFolder + "\Snippets\*.sqlpromptsnippet"

Write-Host "Copying *.sqlpromptsnippet files from " $LocalAppDataSnippets " to " $NewSnippetFolder ".." -ForegroundColor "gray" -NoNewline

Copy-Item $LocalAppDataSnippets $NewSnippetFolder

Write-Host "Done." -ForegroundColor "green"

#registry property

$SQLpromptRegistryFolder = "HKCU:\Software\Red Gate\" + $SQLPromptFolder

if(!(Test-Path $SQLpromptRegistryFolder-or !$SQLPromptFolder)

{

    Write-Host "Registry path missing, you may not have Red-gate products installed or you specified a wrong folder name.." -ForegroundColor "red"

    Return

}

Set-Location $SQLpromptRegistryFolder

 

Write-Host "Moving to " $SQLpromptRegistryFolder ".." -ForegroundColor "gray"

 

Write-Host "Changing registry setting for Snippet default folder to " $NewSnippetFolder ".." -ForegroundColor "gray" -NoNewline

Set-ItemProperty . "Snippets Folder" $NewSnippetFolder

Write-Host "Done." -ForegroundColor "green"

#endregion

 

Questa parte si occupa di impostare la nuova cartella per il Compare ed i suoi filtri, scrivendo anche qui la proprietà di registro.

#region COMPARE AND FILTERS MANAGEMENT

#destination folder (the same as the Workspace tool folder)

$NewCompareFolder = $WorkspacePath

#ask for the sql compare folder name

Write-Host

Write-Host "Please enter the name of the SQL Compare folder located into ProgramFiles/RedGate path" -ForegroundColor "darkcyan"

$SQLCompareFolder = Read-Host

#registry property

$SQLCompareRegistryFolder = "HKCU:\Software\Red Gate\" + $SQLCompareFolder + "\UI\"

if(!(Test-Path $SQLCompareRegistryFolder-or !$SQLCompareFolder)

{

    Write-Host "Registry path missing, you may not have Red-gate products installed or you specified a wrong folder name.." -ForegroundColor "red"

    Return

}

Set-Location $SQLCompareRegistryFolder

Write-Host "Moving to " $SQLCompareRegistryFolder ".." -ForegroundColor "gray"

Write-Host "Changing registry setting for Compare default project folder to " $NewCompareFolder ".." -ForegroundColor "gray" -NoNewline

Set-ItemProperty . "SharedProjectDirectory" $NewCompareFolder

Write-Host "Done." -ForegroundColor "green"

Write-Host "Changing registry setting for Compare Filters default folder to " $NewCompareFolder ".." -ForegroundColor "gray" -NoNewline

Set-ItemProperty . "DefaultFilterFolder" $NewCompareFolder

Write-Host "Done." -ForegroundColor "green"

#endregion


Questa parte, come la precedente, si occupa di impostare la nuova cartella per il Data Compare, scrivendo anche qui la proprietà di registro.

#region DATA COMPARE AND FILTERS MANAGEMENT

#destination folder (the same as the Workspace tool folder)

$NewDataCompareFolder = $WorkspacePath

 

#ask for the sql data compare folder name

Write-Host

Write-Host "Please enter the name of the SQL Data Compare folder located into ProgramFiles/RedGate path" -ForegroundColor "darkcyan"

$SQLDataCompareFolder = Read-Host

#registry property

$SQLDataCompareRegistryFolder = "HKCU:\Software\Red Gate\" + $SQLDataCompareFolder + "\UI\"

if(!(Test-Path $SQLDataCompareRegistryFolder-or !$SQLDataCompareFolder)

{

    Write-Host "Registry path missing, you may not have Red-gate products installed or you specified a wrong folder name.." -ForegroundColor "red"

    Return

}

Set-Location $SQLDataCompareRegistryFolder

Write-Host "Moving to " $SQLDataCompareRegistryFolder ".." -ForegroundColor "gray"

Write-Host "Changing registry setting for Data Compare default project folder to " $NewDataCompareFolder ".." -ForegroundColor "gray" -NoNewline

Set-ItemProperty . "SharedProjectDirectory" $NewDataCompareFolder

Write-Host "Done." -ForegroundColor "green"

Write-Host "Changing registry setting for Data Compare Filters default folder to " $NewDataCompareFolder ".." -ForegroundColor "gray" -NoNewline

Set-ItemProperty . "DefaultFilterFolder" $NewDataCompareFolder

Write-Host "Done." -ForegroundColor "green"

#endregion

 

Set-Location "C:"

 

Write-Host "Process completed successfully." -ForegroundColor "yellow"

Write-Host "Restart SQL Server Management Studio and Red-Gate product to apply the changes.." -ForegroundColor "yellow" 


Note: 
Per ragioni di spazio il codice non è molto leggibile. Ma scaricando da qui il file sarà tutto molto più chiaro.
Come prerequisito è necessario avere installato tutti i prodotti elencati sopra, in alternativa la modifica è nulla per le applicazioni che non sono presenti sulla macchina (verranno restituiti messaggi di errore).

Lo script deve essere condiviso col team e ogni membro deve poterlo eseguire. Una buona pratica da seguire è quella di includere anch'esso nel source control, in modo che ogni sviluppatore possa usufruirne.
Per controllare se il tutto funziona, ecco i test da fare sulle vostre macchine:
- apertura di SQL Compare:
    1) vi dovreste trovare, quando premuto Open Project.. la folder corretta così come indicata nello script powershell. Nel caso del mio esempio "C:\TFS_Workspace\SampleProject\SQLTools"
     
    2) nelle proprietà dell'applicazione (Tools -> Application Options..) dovreste trovare la Filter Folder impostata a quella che avete definito voi nello script:
       

- apertura di SQL Data Compare vi dovreste trovare, quando premuto Open Project.. la folder corretta così come indicata nello script powershell. Nel caso del mio esempio "C:\TFS_Workspace\SampleProject\SQLTools"

- direttamente da SQL Server Management Studio, aprire il menu "SQL Prompt" e selezionare la voce "Snippet Manager"..

Premendo la voce "Locate on disk" si apre la cartella da cui vengono letti gli snippet. Se tutto è configurato correttamente, la folder specificata corrisponderà a quella immessa al prompt dello script powershell. Inoltre, essa conterrà tutti gli snippet copiati direttamente dalla cartella di default. Nel nostro esempio "C:\TFS_Workspace\SampleProject\SQLTools\Snippets".

Una volta che il binding delle cartelle è terminato, ogni modifica farà apparire i file nei pending changes. Ad esempio, cambiando il file di filtro del SQL Compare, otterremo quanto segue:

Per quanto riguarda invece l'aggiunta di nuovi file, la gestione è un po' differente. Immaginiamo di creare un nuovo snippet direttamente dallo snippet manager:
Premendo "Save" un nuovo file, chiamato PRV.sqlpromptsnippet verrà aggiunto alla cartella. 
Come fare per vederlo nei pending changes e poi effettuarne il checkin?
Sempre nel team explorer sui pending changes, vi è una voce Detected: n add, direttamente nelle Excluded Changes:


A questo punto basta premere "Promote" e l'aggiunta verrà spostata direttamente sui pending changes. Da qui in poi è tutto come se fosse una normale modifica ad un file già esistente. 
Alternativamente è sempre possibile utilizzare i power tools ed andare ad aggiungere i file al source control dall’esplora risorse di windows con l’apposita integrazione.

Conlusioni
Rendere disponibile al team le impostazioni dei software che tutti i membri condivideranno non è una pratica da sottovalutare. Con una get ed un semplice script preconfezionato ci si trova ad essere allineati in un paio di click. Questo non vale solo per i nuovi colleghi, i quali si trovano un vero e proprio "welcome kit", ma anche per chi già lavora da tempo nel team. Nell'esempio che abbiamo trattato, ogni tool di terze parti per la gestione del ciclo di vita del database è allineato e pronto per essere "visto" da tutti i membri allo stesso modo.
I prodotti di compare o data compare sono fondamentali nel processo di deploy e ogni modifica ai file di progetto si riflette su tutti gli sviluppatori, che, grazie a questo, sono in grado di recepire i cambiamenti ed eseguire in automatico i vari componenti necessari alla pubblicazione del database. Anche durante la stesura del codice, avere snippet ed utilità già pronte aumenta la produttività di ogni membro del team stesso. 
Insomma, non sottovalutate mai le suddette possibilità, poichè la presenza di procedure simili, porta ad un conseguente modus operandi uniforme, più tracciabile e più coerente.

Stay Tuned! 
Categoria: ALM
giovedì, 11 lug 2013 Ore. 10.27
Statistiche
  • Views Home Page: 601.390
  • Views Posts: 1.068.579
  • Views Gallerie: 641.208
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003