Многократное развертывание Windows Azure
Вот сценарий: - Слишком много веб-сайтов с одинаковым исходным кодом и собственной базой данных (каждый клиент имеет свою собственную систему со своей базой данных, но все клиенты используют один и тот же исходный код)
- У меня есть только один проект TFS, потому что все клиенты используют один и тот же код (не физически, потому что я должен развертывать для каждого клиента на каждом сайте)
Вопрос: Как я могу выполнить развертывание на одном веб-сайте (с VS 2012 - Web Deploy), и он автоматически обновляет все другие веб-сайты, корректно изменяя web.config (в настоящее время каждый параметр развертывания имеет свою конфигурацию для изменения web.config connectionString),
Чтобы упростить, в настоящее время у меня есть все параметры развертывания (Customer1 - WEb Deploy, Customer2 - Web Deploy....) Это работает, но я должен развернуть для каждого отдельного клиента... Что я хочу сделать, это сделать цикл развертывания для всех клиентов, нажав только один раз).
1 ответ
Мы делаем очень похожий процесс, используя одну и ту же кодовую базу для более чем 50 сайтов. Мы используем API управления REST Azure для выполнения развертываний. Я бы порекомендовал перенести специфические настройки сайта из web.config в отдельные файлы ServiceConfiguration..cscfg и затем использовать CloudConfigurationManager.GetSetting("settingsKey")
чтобы получить значение конфигурации. Создайте простой список ключей, вероятно, на основе домена, чтобы получить доступ к вашим настройкам.
Вот отличный пример кода от команды Azure об использовании API управления здесь. Мы адаптировали это для нашей базы кода для создания консольного приложения и вызова этого консольного приложения во время процесса сборки TFS. Вот соответствующий код, который мы используем, чтобы получить список размещенных служб в подписке, а затем обновлять каждое развертывание размещенных служб:
var packageUrl = UploadFileToBlob(package);
var services = new ListHostedServicesCommand();
services.Run();
hostedServices = services.HostedServices;
var date = DateTime.UtcNow.ToString("yyyyMMdd-hhmmss-");
var label = date + "some-deployment-name";
var fileinfo = new FileInfo(config);
if (!string.IsNullOrEmpty(packageUrl) && fileinfo.Exists)
{
// get the url of the package uploaded to blob
AzureCommand.PackageLocation = packageUrl;
AzureCommand.ConfigFileLocation = fileinfo.FullName;
AzureCommand.DeploymentSlot = "production";
AzureCommand.Mode = "auto";
AzureCommand.Label = label;
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);
}
}