Domanda

Sto cercando di usare il nuovo Pubblica il supporto del profilo (Disponibile in VS2012 e in VS2010 tramite un aggiornamento) per creare una consegna continua "Pipeline di distribuzione", per cui un pacchetto / zip viene effettuato nella prima "fase" e nello stesso pacchetto è implementato in vari ambientiutilizzando diverse configurazioni.

Quali attività / proprietà sono coinvolte nella distribuzione di un pacchetto esistente utilizzando le impostazioni definite in un file PUBUSML, dalla riga di comando e senza causare una build?Metti in un altro modo, mi piacerebbe "pubblicare" a pacchetto , quindi in seguito "Pubblica" lo stesso pacchetto in un altro profilo senza ricostruirlo.

(so che posso usare direttamente msdeploy, ma preferirei avere meno impianto idraulico su ogni progetto se possibile)

È stato utile?

Soluzione

Aggiornamento 2014-01-28

Mantenere aggiornato il mio script personalizzato con le versioni cambianti di VS / Azure SDK finì per essere troppo duro, quindi ho effettivamente ripristinato per utilizzare lo script generato deploy.cmd, con una piccola differenza:

Ho iniziato a lasciare tutti i miei valori dei parametri dal file ProfileName.pubxml e invece metterli in un ProfileName.paramters.xml (esempio generato in .SetParameters.xml con il pacchetto, Documenti qui ). Questi saranno automaticamente prelevati da Visual Studio / MSbuild per Convenzione e posso usarli in fase di esecuzione passando in -setParamFile:path\to\ProfileName.parameters.xml durante la chiamata deploy.cmd

Aggiornamento - Una versione più recente di questo script è ora mantenuta (e documentata) su GitHub - https://github.com/richardszalay/msdeploy-package-Publish

Dopo molto scavo, ho trovato che diversi problemi in Microsoft.Web.Publishing.targets (V10.5) che impedisce questo di lavorare. Per soluzionare questi problemi, ho creato il seguente script MSBuild che può essere inserito nella stessa directory dell'applicazione Web CSPROJ. Ho aggiunto commenti relativi alle correzioni e ai dettagli di implementazione.

Lo script utilizza Microsoft.Web.Publishing.target, quindi la maggior parte delle proprietà standard dovrebbe ancora funzionare. Ecco alcuni modi in cui puoi usarlo:

# Convention based
msbuild PackageDeploy.build /p:PublishProfile=Stage;WebPublishPipelineProjectName=Name_of_your_web_application

# Absolute paths to profile + package
msbuild PackageDeploy.build /p:PublishProfile=Path\To\Profile.pubxml;PackageFileName=Path\To\Package.zip;WebPublishPipelineProjectName==Name_of_your_web_application
.

Se si utilizza VS2012, assicurati di dichiarare VisualStudioVersion=v11.0 per importare il file di pubblicazione corretto.

Utilizzando questo script, non è necessario ricontrollare la tua applicazione Web nelle fasi successive nella tua pipeline di distribuzione. Avrai solo bisogno di mantenere i seguenti artefatti dopo la fase di build / package:

    .
  • packagegersey.build (sotto)
  • I tuoi profili pubblicitari
  • Il pacchetto dell'applicazione Web zip

    Ecco la fonte per packagegersey.build:

    <!--
    This build script supports deployment of a website package to a publish profile without rebuilding the project or package
    
    If placed in the same directory as a web project that uses publish profiles, the following arguments will need to be defined:
    
    Convention based required arguments:
      PublishProfile: the name of the publish profile (or a path to a pubxml file if using non-convention based)
      Configuration: Debug/Release
    
    Convention based optional arguments:
      VisualStudioVersion: Property specific to this build script that determines which WPP version to use (v10.5 [default] for VS2010+Azure updates, v11.0 for VS2012)
      WebPublishPipelineProjectName:
      WebPublishPipelineProjectDirectory: The root to the web project directory if this build script isn't there and PublishProfile isn't a path (to auto-detect publish profile directory)
    
    Non-convention based optional arguments:
      PackageFileName: The full path to the website package zip
      UseDeclareParametersXMLInMsDeploy: true to save the parameters to a file and then use that file; false to inline the parameters
      UseMsDeployExe: true to use msdeploy.exe; false to use the VS MSBuild task
    
    -->
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="DeployFromPackage">
    
      <PropertyGroup>
        <!-- IMPL: Set this to v11.0 to use VS2012 -->
        <VisualStudioVersion>v10.5</VisualStudioVersion>
      </PropertyGroup>
    
      <PropertyGroup>
        <!-- IMPL: Declared in Microsoft.Web.Publishing.targets, but we need to declare PublishProfileRootFolder before it's imported -->
        <WebPublishPipelineProjectDirectory Condition="'$(WebPublishPipelineProjectDirectory)'==''">$(MSBuildProjectDirectory)</WebPublishPipelineProjectDirectory>
    
        <!-- IMPL: Usually detected by ".csproj" vs ".vbproj", but PackageDeploy.build is neither -->
        <PublishProfileRootFolder Condition="'$(PublishProfileRootFolder)' == '' and Exists('My Project\PublishProfiles')">$(WebPublishPipelineProjectDirectory)\My Project\PublishProfiles</PublishProfileRootFolder>
        <PublishProfileRootFolder Condition="'$(PublishProfileRootFolder)' == '' and Exists('Properties\PublishProfiles')">$(WebPublishPipelineProjectDirectory)\Properties\PublishProfiles</PublishProfileRootFolder>
      </PropertyGroup>
    
      <!-- IMPL: Select the correct version of Microsoft.Web.Publishing.targets (usually done by the csproj via WebApplication.targets) -->
      <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
    
      <!-- FIX: MSDeployPublish depends on building the package (can be skipped by clearing MSDeployPublishDependsOn) -->
      <!-- IMPL: ImportPublishingParameterValues transforms all the MSDeployParameterValue+ParameterValue to MsDeployDeclareParameters+Value -->
      <Target Name="DeployFromPackage" Condition="'$(PublishProfile)' != ''" DependsOnTargets="ImportPublishingParameterValues">
    
        <PropertyGroup>
          <_PublishMsDeployServiceUrl>$(MsDeployServiceUrl)</_PublishMsDeployServiceUrl>
          <_PublishMsDeployServiceUrl Condition="('$(MSDeployPublishMethod)'=='INPROC')"></_PublishMsDeployServiceUrl>
        </PropertyGroup>
    
        <ItemGroup>
          <!-- IMPL: Always uses "package" source -->
          <MsDeploySourceProviderSetting Remove="@(MsDeploySourceProviderSetting)" />
          <MsDeploySourceProviderSetting Include="package">
            <Path>@(_MSDeployPackageFile->'%(FullPath)')</Path>
            <EncryptPassword>$(DeployEncryptKey)</EncryptPassword>
            <WebServerAppHostConfigDirectory>$(_MSDeploySourceWebServerAppHostConfigDirectory)</WebServerAppHostConfigDirectory>
            <WebServerManifest>$(_MSDeploySourceWebServerManifest)</WebServerManifest>
            <WebServerDirectory>$(_MSDeploySourceWebServerDirectory)</WebServerDirectory>
          </MsDeploySourceProviderSetting>
    
          <MsDeployDestinationProviderSetting Remove="@(MsDeployDestinationProviderSetting)" />
          <MsDeployDestinationProviderSetting Include="auto">
            <Path></Path>
            <ComputerName>$(_PublishMsDeployServiceUrl)</ComputerName>
            <UserName>$(UserName)</UserName>
            <Password>$(Password)</Password>
            <EncryptPassword>$(DeployEncryptKey)</EncryptPassword>
            <IncludeAcls>False</IncludeAcls>
            <AuthType>$(AuthType)</AuthType>
            <WebServerAppHostConfigDirectory>$(_MSDeployDestinationWebServerAppHostConfigDirectory)</WebServerAppHostConfigDirectory>
            <WebServerManifest>$(_MSDeployDestinationWebServerManifest)</WebServerManifest>
            <WebServerDirectory>$(_MSDeployDestinationWebServerDirectory)</WebServerDirectory>
          </MsDeployDestinationProviderSetting>
        </ItemGroup>
    
        <!--Debug/Diagnostic message is not localized-->
        <Message Text="MSDeployPublish MsDeploySourceProviderSetting is @(MsDeploySourceProviderSetting)" Condition="$(EnablePackageProcessLoggingAndAssert)" />
        <Message Text="MSDeployPublish MsDeployDestinationProviderSetting is @(MsDeployDestinationProviderSetting)" Condition="$(EnablePackageProcessLoggingAndAssert)"/>
    
        <ExportParametersFile
          Condition="!$(UseDeclareParametersXMLInMsDeploy) And $(EnablePackageProcessLoggingAndAssert)"
          Parameters="@(MsDeployDeclareParameters)"
          DeclareSetParameterFile="$(PackageLogDir)\MSDeployPublish.parameters.xml"
          GenerateFileEvenIfEmpty="True"
          />
    
        <!--First delete the ParameterFile-->
        <Delete Files="$(PublishParametersFile)"  Condition="Exists($(PublishParametersFile))" ContinueOnError="true"/>
    
        <!-- FIX: Use SetParameterFile (rather than DeclareSetParameterFile), which isn't used anywehere in Microsoft.Web.Publishing.targets -->
        <ExportParametersFile
          Parameters="@(MsDeployDeclareParameters)"
          SetParameterFile="$(PublishParametersFile)"
          GenerateFileEvenIfEmpty="True"
          Condition="$(UseDeclareParametersXMLInMsDeploy)"
          />
    
        <PropertyGroup>
          <_VsPublishParametersFile></_VsPublishParametersFile>
          <_VsPublishParametersFile Condition="$(UseDeclareParametersXMLInMsDeploy) and '$(_VsPublishParametersFile)'==''">$(PublishParametersFile)</_VsPublishParametersFile>
        </PropertyGroup>
    
        <ItemGroup Condition="!$(UseDeclareParametersXMLInMsDeploy)">
          <_VsPublish_MsDeployDeclareParameters Remove="@(_VsPublish_MsDeployDeclareParameters)" />
          <_VsPublish_MsDeployDeclareParameters Include="@(MsDeployDeclareParameters)" />
    
          <!-- IMPL: Utilising the real version of this has way too much baggage (simplifying it could have repercussions, though) -->
          <_VsPublish_MsDeployDeclareParameters Include="$(DeployParameterIISAppName)" Condition="'$(DeployIisAppPath)' != ''">
            <Value>$(DeployIisAppPath)</Value>
          </_VsPublish_MsDeployDeclareParameters>
        </ItemGroup>
    
        <!-- FIX: Microsoft.Web.Publishing.targets uses "SetParameterItems", which doens't appear to work. This uses SimpleSetParameterItems instead  -->
        <VSMSDeploy
          Condition="!$(UseMsdeployExe)"
          MSDeployVersionsToTry="$(_MSDeployVersionsToTry)"
          Source="@(MsDeploySourceProviderSetting)"
          Destination="@(MsDeployDestinationProviderSetting)"
          DisableLink="$(PublishDisableLinks)"
          EnableLink="$(PublishEnableLinks)"
          AllowUntrustedCertificate="$(AllowUntrustedCertificate)"
          BuildingInsideVisualStudio="$(BuildingInsideVisualStudio)"
          SkipExtraFilesOnServer="$(SkipExtraFilesOnServer)"
          SkipRuleItems="@(MsDeploySkipRules)"
          OptimisticParameterDefaultValue="$(EnableOptimisticParameterDefaultValue)"
          SimpleSetParameterItems="@(_VsPublish_MsDeployDeclareParameters)"
          ImportSetParametersItems="$(_VsPublishParametersFile)"
          RetryAttempts="$(RetryAttemptsForDeployment)"
          InvokedByPublish="true"
        >
          <Output TaskParameter="Result" PropertyName="_PublishResult" />
        </VSMSDeploy>
    
        <!-- FIX: Microsoft.Web.Publishing.targets uses "SetParameterItems", which doens't appear to work. This uses SimpleSetParameterItems instead  -->
        <MSdeploy
              Condition="$(UseMsdeployExe)"
              Verb="sync"
              Source="@(MsDeploySourceProviderSetting)"
              Destination="@(MsDeployDestinationProviderSetting)"
              DisableLink="$(PublishDisableLinks)"
              EnableLink="$(PublishEnableLinks)"
              EnableRule="$(MsDeployDoNotDeleteRule)"
              AllowUntrusted="$(AllowUntrustedCertificate)"
              SkipRuleItems="@(MsDeploySkipRules)"
              OptimisticParameterDefaultValue="$(EnableOptimisticParameterDefaultValue)"
              SimpleSetParameterItems="@(_VsPublish_MsDeployDeclareParameters)"
              ImportSetParametersItems="$(_VsPublishParametersFile)"
              RetryAttempts="$(RetryAttemptsForDeployment)"
              ExePath="$(MSDeployPath)" />
      </Target>
    
    </Project>
    
    .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top