Condividi tramite


Esecuzione di una distribuzione "What If"

di Jason Lee

In questo argomento viene descritto come eseguire distribuzioni "what if" (o simulata) usando lo strumento di distribuzione Web (Web Deploy) di Internet Information Services (IIS) e VSDBCMD. In questo modo è possibile determinare gli effetti della logica di distribuzione in un ambiente di destinazione specifico 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 ASP.NET MVC 3, un servizio Windows Communication Foundation (WCF) e un progetto di database.

Il metodo di distribuzione al centro di queste esercitazioni si basa sull'approccio split project file descritto in Informazioni sul file di progetto, in cui il processo di compilazione e distribuzione è controllato da due file di progetto, uno contenente istruzioni di compilazione applicabili a ogni ambiente di destinazione e una 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 indipendente dall'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 artefatti in modalità "what if", 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à della riga di comando MSDeploy.exe direttamente o eseguendo il file .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 accadrebbe se il pacchetto ContactManager.Mvc.zip è stato distribuito 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 della 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 in tempo reale.

Annotazioni

Per altre informazioni sulle opzioni della riga di comando per MSDeploy.exe, vedere Web Deploy Operation Settings .For more information on command-line options for MSDeploy.exe, see Web Deploy Operation Settings.

Se si usa il file .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 .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 in tempo reale:

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

Annotazioni

Per altre informazioni sulle opzioni della riga di comando per i file di .deploy.cmd , vedere Procedura: Installare un pacchetto di distribuzione usando il file deploy.cmd. Se si esegue il file .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 la distribuzione incrementale basata su schema del database. 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 seguente:

  • 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.

Annotazioni

Se si distribuisce un file con estensione deploymanifest anziché un file con estensione dbschema, il comportamento dell'opzione /dd è molto più complesso. In pratica, VSDBCMD ignorerà il valore dell'opzione /dd se il file con estensione deploymanifest include un elemento DeployToDatabase con valore True. Distribuzione di progetti di database descrive questo comportamento in modo 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, di conseguenza, 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 sul database corrente e sui dati contenuti. Ad esempio, potrebbe essere necessario determinare:

  • Indica se eventuali 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 divide o si uniscono 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 è consigliabile usare un file di progetto personalizzato di 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 Distribuzione Web per creare un pacchetto e distribuire l'applicazione ContactManager.Mvc.
  • Usa Distribuzione Web per creare un pacchetto e distribuire l'applicazione ContactManager.Service.
  • Distribuisce il database ContactManager .

Integrando la distribuzione di più pacchetti Web e/o database in un processo in un unico passaggio, è 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 (ricavata dal file Publish.proj e semplificata) esegue il file .deploy.cmd per distribuire un pacchetto Web. Per impostazione predefinita, il comando include un'opzione /Y ("sì" o modalità di aggiornamento). Se WhatIf è impostato su true, questa opzione viene sostituita da un'opzione /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, l'obiettivo successivo utilizza l'utilità VSDBCMD per distribuire un database. Per impostazione predefinita, un interruttore /dd non è incluso. Ciò significa che VSDBCMD genererà uno script di distribuzione ma non distribuirà il database, ovvero 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 unico 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 modifiche all'ambiente di destinazione.

Altre informazioni

Per ulteriori informazioni sulla sintassi della riga di comando di Distribuzione Web, consultare Web Deploy Operation Settings. 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 di VSDBCMD, vedere Command-Line Reference for VSDBCMD.EXE (Deployment and Schema Import).