Esecuzione di una distribuzione di simulazione

di Jason Lee

In questo argomento viene descritto come eseguire distribuzioni "what if" (o simulated) usando lo strumento di distribuzione Web IIS (Internet Information Services) (Distribuzione Web) e VSDBCMD. Ciò consente di determinare gli effetti della logica di distribuzione in un determinato ambiente di destinazione prima di distribuire effettivamente l'applicazione.

Questo argomento fa parte di una serie di esercitazioni basate sui requisiti di distribuzione aziendali di una società fittizia denominata Fabrikam, Inc. Questa serie di esercitazioni usa una soluzione di esempio, la soluzione Contact Manager, per rappresentare un'applicazione Web con un livello realistico di complessità, tra cui un'applicazione MVC 3 ASP.NET, un servizio Windows Communication Foundation (WCF) e un progetto di database.

Il metodo di distribuzione al centro di queste esercitazioni si basa sull'approccio di suddivisione del file di progetto descritto in Informazioni sul file di progetto, in cui il processo di compilazione e distribuzione è controllato da due file di progetto, uno contenente le istruzioni di compilazione applicabili a ogni ambiente di destinazione e uno contenente le impostazioni di compilazione e distribuzione specifiche dell'ambiente. In fase di compilazione, il file di progetto specifico dell'ambiente viene unito al file di progetto agnostico dell'ambiente per formare un set completo di istruzioni di compilazione.

Esecuzione di una distribuzione "What If" per i pacchetti Web

Distribuzione Web include funzionalità che consentono di eseguire distribuzioni in modalità "what if" (o versione di valutazione). Quando si distribuiscono elementi in modalità "what if", La distribuzione Web genera un file di log come se fosse stata eseguita la distribuzione, ma non cambia effettivamente nulla nel server di destinazione. La revisione del file di log consente di comprendere l'impatto della distribuzione sul server di destinazione, in particolare:

  • Cosa verrà aggiunto.
  • Cosa verrà aggiornato.
  • Cosa verrà eliminato.

Poiché una distribuzione "what if" non cambia effettivamente nulla nel server di destinazione, ciò che non può sempre fare è prevedere se una distribuzione avrà esito positivo.

Come descritto in Distribuzione di pacchetti Web, è possibile distribuire pacchetti Web usando Distribuzione Web in due modi, usando l'utilità da riga di comando MSDeploy.exe direttamente o eseguendo il file con estensione deploy.cmd generato dal processo di compilazione.

Se si usa direttamente MSDeploy.exe, è possibile eseguire una distribuzione "what if" aggiungendo il flag –whatif al comando. Ad esempio, per valutare cosa succede se è stato distribuito il pacchetto ContactManager.Mvc.zip in un ambiente di staging, il comando MSDeploy dovrebbe essere simile al seguente. Si noti che l'esempio seguente usa $CREDENTIAL_PLACEHOLDER$ come segnaposto per la coppia chiave-valore password:

MSDeploy.exe
  -whatif
  -source:package="[path]\ContactManager.Mvc.zip"
  -dest:auto,
        computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
        username="FABRIKAM\stagingdeployer",
        password=$CREDENTIAL_PLACEHOLDER$,
        authtype="Basic",
        includeAcls="False"
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
  -allowUntrusted

Quando si è soddisfatti dei risultati della distribuzione "what if", è possibile rimuovere il flag –whatif per eseguire una distribuzione live.

Nota

Per altre informazioni sulle opzioni della riga di comando per MSDeploy.exe, vedere Impostazioni operazione di distribuzione Web.

Se si usa il file con estensione deploy.cmd , è possibile eseguire una distribuzione "what if" includendo il flag /t (modalità di valutazione) anziché il flag /y ("sì" o la modalità di aggiornamento) nel comando. Ad esempio, per valutare cosa accadrebbe se è stato distribuito il pacchetto ContactManager.Mvc.zip eseguendo il file con estensione deploy.cmd , il comando dovrebbe essere simile al seguente:

ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM

Quando si è soddisfatti dei risultati della distribuzione in modalità di valutazione, è possibile sostituire il flag /t con un flag /y per eseguire una distribuzione dinamica:

ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM

Nota

Per altre informazioni sulle opzioni della riga di comando per i file con estensione deploy.cmd , vedere Procedura: Installare un pacchetto di distribuzione usando il file deploy.cmd. Se si esegue il file con estensione deploy.cmd senza specificare alcun flag, il prompt dei comandi visualizzerà un elenco di flag disponibili.

Esecuzione di una distribuzione "What If" per i database

In questa sezione si presuppone che si usi l'utilità VSDBCMD per eseguire una distribuzione di database basata su schema incrementale. Questo approccio è descritto in modo più dettagliato in Distribuzione di progetti di database. È consigliabile acquisire familiarità con questo argomento prima di applicare i concetti descritti qui.

Quando si usa VSDBCMD in modalità di distribuzione , è possibile usare il flag /dd (o /DeployToDatabase) per controllare se VSDBCMD distribuisce effettivamente il database o genera semplicemente uno script di distribuzione. Se si distribuisce un file con estensione dbschema, si tratta del comportamento:

  • Se si specifica /dd+ o /dd, VSDBCMD genererà uno script di distribuzione e distribuirà il database.
  • Se si specifica /dd- o si omette l'opzione, VSDBCMD genererà solo uno script di distribuzione.

Nota

Se si distribuisce un file con estensione deploymanifest anziché un file con estensione dbschema, il comportamento dell'opzione /dd è molto più complicato. In sostanza, VSDBCMD ignorerà il valore dell'opzione /dd se il file .deploymanifest include un elemento DeployToDatabase con un valore True. La distribuzione di progetti di database descrive il comportamento completo.

Ad esempio, per generare uno script di distribuzione per il database ContactManager senza distribuire effettivamente il database, il comando VSDBCMD dovrebbe essere simile al seguente:

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /dd-
            /script:"…\Publish-ContactManager-Db.sql"

VSDBCMD è uno strumento di distribuzione differenziale del database e, ad esempio, lo script di distribuzione viene generato dinamicamente per contenere tutti i comandi SQL necessari per aggiornare il database corrente, se presente, allo schema specificato. La revisione dello script di distribuzione è un modo utile per determinare l'impatto della distribuzione nel database corrente e sui dati contenuti. Ad esempio, è possibile determinare:

  • Se le tabelle esistenti verranno rimosse e se ciò comporterà la perdita di dati.
  • Se l'ordine delle operazioni comporta un rischio di perdita di dati, ad esempio se si suddivideno o si unisceno tabelle.

Se si è soddisfatti dello script di distribuzione, è possibile ripetere VSDBCMD con un flag /dd+ per apportare le modifiche. In alternativa, è possibile modificare lo script di distribuzione per soddisfare i requisiti e quindi eseguirlo manualmente nel server di database.

Integrazione della funzionalità "What If" nei file di progetto personalizzati

Negli scenari di distribuzione più complessi si vuole usare un file di progetto personalizzato Microsoft Build Engine (MSBuild) per incapsulare la logica di compilazione e distribuzione, come descritto in Informazioni sul file di progetto. Ad esempio, nella soluzione di esempio Contact Manager , il file Publish.proj :

  • Compila la soluzione.
  • Usa La distribuzione Web per il pacchetto e la distribuzione dell'applicazione ContactManager.Mvc.
  • Usa La distribuzione Web per il pacchetto e la distribuzione dell'applicazione ContactManager.Service.
  • Distribuisce il database ContactManager .

Quando si integra la distribuzione di più pacchetti Web e/o database in un processo a singolo passaggio in questo modo, è anche possibile scegliere di eseguire l'intera distribuzione in modalità "what if".

Il file Publish.proj illustra come eseguire questa operazione. Prima di tutto, è necessario creare una proprietà per archiviare il valore "what if":

<PropertyGroup>
  <WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>

In questo caso, è stata creata una proprietà denominata WhatIf con un valore predefinito false. Gli utenti possono eseguire l'override di questo valore impostando la proprietà su true in un parametro della riga di comando, come si vedrà a breve.

La fase successiva consiste nel parametrizzare tutti i comandi Distribuzione Web e VSDBCMD in modo che i flag riflettano il valore della proprietà WhatIf . Ad esempio, la destinazione successiva (presa dal file Publish.proj e semplificata) esegue il file con estensione deploy.cmd per distribuire un pacchetto Web. Per impostazione predefinita, il comando include un commutatore /Y ("sì", o modalità di aggiornamento). Se WhatIf è impostato su true, questa opzione viene sostituita da un commutatore /T (versione di valutazione o modalità "what if").

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <PropertyGroup>
    <_WhatIfSwitch>/Y</_WhatIfSwitch>
    <_WhatIfSwitch Condition=" '$(WhatIf)'=='true' ">/T</_WhatIfSwitch>
    <_Cmd>%(PublishPackages.FullPath) $(_WhatifSwitch)  
         /M:$(MSDeployComputerName) 
         /U:$(MSDeployUsername) 
         /P:$(MSDeployPassword) 
         /A:$(MSDeployAuth) 
         %(PublishPackages.AdditionalMSDeployParameters)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

Analogamente, la destinazione successiva usa l'utilità VSDBCMD per distribuire un database. Per impostazione predefinita, non è inclusa un'opzione /dd . Ciò significa che VSDBCMD genererà uno script di distribuzione, ma non distribuirà il database, in altre parole, uno scenario "what if". Se la proprietà WhatIf non è impostata su true, viene aggiunta un'opzione /dd e VSDBCMD distribuirà il database.

<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">
  <PropertyGroup>
    <_DbDeployOrScript></_DbDeployOrScript>
    <_DbDeployOrScript Condition=" '$(Whatif)'!='true' ">/dd</_DbDeployOrScript>
    <_Cmd>"$(VsdbCmdExe)" /a:Deploy 
           /cs:"%(DbPublishPackages.DatabaseConnectionString)" 
           /p:TargetDatabase=%(DbPublishPackages.TargetDatabase) 
           /manifest:"%(DbPublishPackages.FullPath)" 
           /script:"$(_CmDbScriptPath)" 
           $(_DbDeployOrScript)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

È possibile usare lo stesso approccio per parametrizzare tutti i comandi pertinenti nel file di progetto. Quando si vuole eseguire una distribuzione "what if", è possibile specificare semplicemente un valore della proprietà WhatIf dalla riga di comando:

MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj

In questo modo, è possibile eseguire una distribuzione "what if" per tutti i componenti del progetto in un singolo passaggio.

Conclusione

Questo argomento descrive come eseguire distribuzioni "what if" usando Distribuzione Web, VSDBCMD e MSBuild. Una distribuzione "what if" consente di valutare l'impatto di una distribuzione proposta prima di apportare effettivamente modifiche all'ambiente di destinazione.

Altre informazioni

Per altre informazioni sulla sintassi della riga di comando di Distribuzione Web, vedere Impostazioni operazione di distribuzione Web. Per indicazioni sulle opzioni della riga di comando quando si usa il file deploy.cmd , vedere Procedura: Installare un pacchetto di distribuzione usando il file deploy.cmd. Per indicazioni sulla sintassi della riga di comando VSDBCMD, vedere Riferimento alla riga di comando per VSDBCMD.EXE (Distribuzione e importazione schema).