1

+10 個のプロジェクトを含むソリューションがあり、うち 2 個が Web サイトです。ここで、TFS サーバーにリンクされたビルド定義をセットアップする必要があります。これにより、ソリューションがビルドされ、2 つのサイトが適切な Azure Web サイトにデプロイされます。いくつかの異なるアプローチを試しましたが、配信は毎回失敗するようです。TFSサーバーでプロジェクトを構築することは問題ありませんが、Azureが適切なaspプロジェクトを適切なAzure Webサイトに配信する必要がある場合、失敗します...そのようなビルド定義を作成する方法について、誰かが私を正しい方向に向けることができますか?配信オプションを指定する場所

編集:

ビルドの画像で説明します。

ドキュメントビルド定義

したがって、このフォルダーには 2 つの Web サイトがあります。 ここに画像の説明を入力

このフォルダー内の 2 つの Web サイトを正しい Azure の場所に公開したいと考えています。2 つの Web サイトで一定の配信を成功させるための良い方法を知っている人はいますか?

4

1 に答える 1

3

これには、TFS ビルド中に Azure Service Management API を使用します。このサンプル コード ( Windows Azure ServiceManagement サンプル) をビルド タスクで実行するコマンド ライン ツールとして採用しました。

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 "";
}

そして、「YourCommandLineTool.exe」を指すクラウド サービスの .proj ファイルにビルド タスクを追加します。

  <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>
于 2013-04-26T19:08:44.680 に答える