Многократное развертывание 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);
                }
            }
Другие вопросы по тегам