2013-04-26 3 views
1

У нас есть решение, которое содержит +10 проектов, от которых 2 являются веб-сайтами. Теперь мне нужно настроить определение (ы) сборки, связанную с нашим сервером TFS, которая строит решение и разворачивает 2 сайта на нужный веб-сайт Azure. Я пробовал несколько разных подходов, но доставка, кажется, терпит неудачу каждый раз. Построение проекта на сервере TFS не проблема, но когда лазур нужно доставить правильный проект asp, на правильный веб-сайт Azure, он терпит неудачу ... Может ли кто-нибудь указать мне в правильном направлении, как создать такое определение сборки, и где указать параметры доставки?Непрерывное развертывание и доставка

EDIT:

Для иллюстрации с изображением из нашей сборки.

docl builddefinition

Так у нас есть 2 веб-сайтов в этой папке: enter image description here

Я хотел бы опубликовать эти два веб-сайта в этой папке, чтобы правильно лазурного месте. Кто-нибудь знает хороший подход для достижения успешной доставки с двумя веб-сайтами?

+0

вы можете указать некоторую информацию о том, как это происходит. – Alistair

+0

Я не думаю, что это имеет большое значение, когда я потерпел неудачу, потому что я уверен, что есть лучший способ создать непрерывное определение построения интеграции. Я новичок в этой концепции, но одна из ошибок была ERROR_APPPOOL_VERSION_MISMATCH. Я не хочу, чтобы люди исправляли мое плохое определение, я бы хотел, чтобы некоторые указатели на то, как решить такую ​​проблему (не мои ошибки, но как убедиться, что решение отлаживается на TFS, и что azure развертывает все, где это должно быть). – Chris

+0

В отличие от сайтов на форуме, мы не используем «Спасибо», или «Любая помощь оценена», или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts). –

ответ

3

Мы используем API-интерфейс Azure Service Managetment для этого во время сборки TFS. Мы адаптировали этот пример кода - Windows Azure ServiceManagement Sample - как инструмент командной строки для запуска в задаче построения.

HostedServiceList hostedServices = new HostedServiceList(); 
Dictionary<string, IServiceManagement> servicesOperations = new Dictionary<string, IServiceManagement>(); 

ParseArguments(args); 
ProcessCheckServerCertificate(); 

// upload the package created during the build to Azure BLOB 
var packageUrl = UploadFileToBlob(package); 
var services = new ListHostedServicesCommand(); 
services.Run(); 
hostedServices = services.HostedServices; 
. 
. 
. 
foreach (var hostedService in hostedServices) 
{ 
    Console.WriteLine("updating: " + hostedService.ServiceName); 
    // get the deployment unique name - required for upgrade 
    AzureCommand.HostedServiceName = hostedService.ServiceName; 
    AzureCommand.DeploymentName = null; 
    var getDeployment = new GetDeploymentCommand(); 
    getDeployment.Run(); 
    AzureCommand.DeploymentName = getDeployment.Deployment.Name; 

    // upgrade the existing deployment  
    var upgradeDeployment = new UpgradeDeploymentCommand(); 
    upgradeDeployment.Run(); 
    servicesOperations.Add(upgradeDeployment.TrackingId, upgradeDeployment.ServiceManagement); 
} 
. 
. 
. 
// check status of all operations submitted 
foreach (var servicesOperation in servicesOperations) 
{ 
    // check status of operations 
    AzureCommand.WaitForAsyncOperation(servicesOperation.Value, servicesOperation.Key); 
} 

Вот код UploadFileToBlob ...

private string UploadFileToBlob(string file) 
{ 
    // Retrieve storage account from connection string 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 

    // Create the blob client 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    // Retrieve reference to a previously created container 
    CloudBlobContainer container = blobClient.GetContainerReference("mydeployments"); 

    // Retrieve reference to a blob 
    var date = DateTime.UtcNow.ToString("yyyyMMdd-hhmmss-"); 
    var fileinfo = new FileInfo(file); 
    if (fileinfo.Exists) 
    { 
     var fileToUpload = new FileInfo(file).Name; 
     var filename = date + fileToUpload; 
     try 
     { 
      CloudBlob blob = container.GetBlobReference(filename); 

      // Create or overwrite the blob with contents from a local file 
      using (var fileStream = System.IO.File.OpenRead(file)) 
      { 
       blob.UploadFromStream(fileStream); 
      } 

      return blob.Uri.AbsoluteUri; 
     } 
     catch (Exception ex) 
     { 
      LogError("Error uploading file to blog: ", ex.Message); 
      return ""; 
     } 
    } 

    LogError("Error - specified file does not exist: ", file); 
    return ""; 
} 

И добавить задачу сборки в файле .proj для облачной службы, указал на "YourCommandLineTool.exe":

<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" /> 
    <Target Name="AzureDeploy" AfterTargets="CorePublish" DependsOnTargets="CorePublish" Condition="$(DeployToAzure) == 'true'"> 
    <Exec WorkingDirectory="$(MSBuildProjectDirectory)" Command="C:\WindowsAzure\Deploy\YourCommandLineTool.exe /log:$(MSBuildProjectDirectory)\AzureDeploy.log /package:$(MSBuildProjectDirectory)\$(PublishDir)$(AssemblyName).cspkg /config:$(MSBuildProjectDirectory)\$(PublishDir)ServiceConfiguration.$(Configuration).cscfg" /> 
    </Target> 
Смежные вопросы