【问题标题】:Continuous deployment & delivery持续部署和交付
【发布时间】:2013-04-20 10:37:08
【问题描述】:

我们有一个包含 +10 个项目的解决方案,其中 2 个是网站。现在我需要设置一个链接到我们的 TFS 服务器的构建定义,它构建解决方案并将 2 个站点部署到正确的 Azure 网站。我尝试了几种不同的方法,但交付似乎每次都失败。在 TFS 服务器上构建项目没有问题,但是当 azure 需要将正确的 asp 项目交付到正确的 Azure 网站时,它会失败......任何人都可以为我指出如何创建这样一个构建定义的正确方向,以及在哪里指定交付选项?

编辑:

用我们构建的图像来说明。

所以我们在这个文件夹中有 2 个网站:

我想将此文件夹中的这两个网站发布到正确的天蓝色位置。 有人知道用 2 个网站成功实现持续交付的好方法吗?

【问题讨论】:

  • 您可能想提供一些有关它如何失败的信息。
  • 我认为失败的地方并不重要,因为我确信有更好的方法来创建连续集成构建定义。我对这个概念很陌生,但其中一个错误是 ERROR_APPPOOL_VERSION_MISMATCH。我不希望人们纠正我的错误定义,我想要一些关于如何处理这样一个问题的指示(不是我的错误,而是如何确保解决方案在 TFS 上调试,并且 azure 将一切部署在它应该在的地方)。
  • 与论坛网站不同,我们不使用“谢谢”、“任何帮助表示赞赏”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
  • 哪个版本的 TFS?
  • Team Foundation Service,免费版。

标签: c# asp.net azure tfs


【解决方案1】:

我们在 TFS 构建期间为此使用 Azure 服务管理 API。我们修改了这个示例代码 - 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>

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多