Как ускорить развертывание Azure из Visual Studio 2010 - PullRequest
7 голосов
/ 19 декабря 2010

У меня есть Visual Studio 2010 решение с Azure Service и ASP.NET MVC 3 решением, которое служит Web Role для службы Azure.Никаких других ролей, связанных с этой службой, кроме этой.

Каждое развертывание в промежуточной (или производственной) среде Azure занимает до 20 минут, начиная с момента нажатия кнопки «Опубликовать» в Visual Studio довсе экземпляры (2) запускаются.

Как вы можете себе представить, это делает PITA частой публикацией или быстрым исправлением некоторых ошибок.Есть ли способ ускорить процесс?Будет ли быстрее загрузить пакет в хранилище de Blob и обновить его оттуда?Как мне добиться этого?

Мне кажется, что онлайн-документы по Azure оставляют желать лучшего.Особенно, когда речь идет об устранении неисправностей.

Спасибо.

Ответы [ 5 ]

7 голосов
/ 20 декабря 2010

Одной из идей снижения потребности (и частоты) в повторном развертывании является перемещение статического содержимого в хранилище BLOB-объектов, внешнее по отношению к пакету.Например, перенесите ваши CSS и JavaScript в хранилище BLOB-объектов вместе с изображениями.Как только это будет сделано, вам нужно будет перекомпилировать / повторно развернуть только изменения кода .NET.Вы можете в любое время загрузить обновленную css в хранилище BLOB-объектов.Если вы хотите проверить это в стадии подготовки, у вас всегда может быть имя промежуточного и рабочего контейнера для статического содержимого и сохранить это имя контейнера в настройке конфигурации.

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

4 голосов
/ 18 сентября 2011

Вы должны включить Web Deploy в своем проекте Azure. Это работает так:

1 / Создайте учетную запись RDP (не забудьте, вам нужно загрузить сертификат с его закрытым ключом, чтобы Azure мог расшифровать пароль). Это скрыто в диалоговом окне «Развертывание» для проекта развертывания Azure.

2 / Включить веб-развертывание - то же место

После того, как вы опубликовали приложение таким образом, щелкните правой кнопкой мыши веб-приложение (не проект развертывания Azure) и выберите Опубликовать. Во всплывающем окне определено все, кроме пароля, введите его, и вы за несколько секунд загрузите свои изменения в Azure.

CAVEAT: это предназначено для веб-приложений с одним экземпляром, определенно не для стратегии производственного обновления, и уже упоминавшийся ответ хранилища BLOB-объектов - лучший вариант в этом случае.

Pierre

3 голосов
/ 21 декабря 2010

Мое решение этой проблемы - только выдвинуть новый пакет, когда я изменяю код в RoleEntryPoint или с помощью определения сервиса. В Azure 1.3 у вас теперь есть возможность использовать подключение к удаленному рабочему столу. Используя RDC, я буду компилировать свой код локально и использовать копирование / вставку, чтобы разместить его на сервере Azure в соответствующем каталоге. После того, как рабочий код работает правильно, я могу перенести полностью протестированную версию в стадию и затем выполнить VIP-своп. Это ограничивает количество раз, когда мне действительно нужно развернуть пакет.

На самом деле у вас довольно длинное окно, в котором вы можете продолжать изменять свой код в Azure, прежде чем публиковать новый пакет. Новый пакет действительно нужен только в тех случаях, когда Azure должен выключить / перезапустить экземпляр роли.

1 голос
/ 19 декабря 2010

Хорошая идея - сначала попробовать загрузить свой проект в хранилище BLOB-объектов, но, к сожалению, это то, что Visual Studio в любом случае делает для вас за кулисами. Как указывалось в другом месте, большую часть времени при развертывании выполняет не сама загрузка, а остановка и запуск всех ваших доменов обновлений.

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

Чтобы мне не приходилось развертываться в облаке для тестирования незначительных изменений, я обнаружил, что неплохо сработает сайт, чтобы он работал при работе в локальном IIS, как и любой другой сайт MVC.

Самым большим препятствием для этой работы являются настройки, которые вы имеете в облачной конфигурации. Чтобы обойти это, нужно сделать копию всех настроек в вашем облачном конфиге и поместить их в ваш web.config в appSettings. Затем вместо использования RoleEnvironment.GetConfigurationSettingValue() создайте класс-оболочку, который вы вызываете вместо этого. Этот класс-оболочка проверяет RoleEnvironment.IsAvailable, чтобы увидеть, работает ли он в структуре Azure, если он есть, он вызывает обычную функцию конфигурации, описанную выше, если нет, он вызывает WebConfigurationManager.AppSettings[].

Есть несколько других вещей, которые вы хотите сделать, чтобы получать события изменения настроек конфигурации, которые, мы надеемся, вы можете выяснить из кода ниже:

public class SmartConfigurationManager
{
    private static bool _addConfigChangeEvents;
    private static string _configName;

    private static Func<string, bool> _configSetter;

    public static bool AddConfigChangeEvents
    {
        get { return _addConfigChangeEvents; }
        set
        {
            _addConfigChangeEvents = value;

            if (value)
            {
                RoleEnvironment.Changing += RoleEnvironmentChanging;
            }
            else
            {
                RoleEnvironment.Changing -= RoleEnvironmentChanging;
            }
        }
    }

    public static string Setting(string configName)
    {
        if (RoleEnvironment.IsAvailable)
        {
            return RoleEnvironment.GetConfigurationSettingValue(configName);
        }
        return WebConfigurationManager.AppSettings[configName];
    }

    public static Action<string, Func<string, bool>> GetConfigurationSettingPublisher()
    {
        if (RoleEnvironment.IsAvailable)
        {
            return AzureSettingsGet;
        }
        return WebAppSettingsGet;
    }

    public static void WebAppSettingsGet(string configName, Func<string, bool> configSetter)
    {
        configSetter(WebConfigurationManager.AppSettings[configName]);
    }

    public static void AzureSettingsGet(string configName, Func<string, bool> configSetter)
    {
        // We have to store these to be used in the RoleEnvironment Changed handler
        _configName = configName;
        _configSetter = configSetter;

        // Provide the configSetter with the initial value
        configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));

        if (AddConfigChangeEvents)
        {
            RoleEnvironment.Changed += RoleEnvironmentChanged;
        }
    }


    private static void RoleEnvironmentChanged(object anotherSender, RoleEnvironmentChangedEventArgs arg)
    {

        if ((arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>().Any(change => change.ConfigurationSettingName == _configName)))
        {
            if ((_configSetter(RoleEnvironment.GetConfigurationSettingValue(_configName))))
            {
                RoleEnvironment.RequestRecycle();
            }
        }
    }


    private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
    {
        // If a configuration setting is changing
        if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
        {
            // Set e.Cancel to true to restart this role instance
            e.Cancel = true;
        }
    }
}
0 голосов
/ 19 декабря 2010

Сама загрузка занимает чуть больше минуты большую часть времени.Это запуск экземпляров, которые занимают большую часть времени.

То, что вы можете сделать, - это сначала развернуть свои исправления до стадии (обратите внимание, что это стоит денег, поэтому не позволяйте этому оставаться там слишком долго).Переход от постановки к производству занимает всего пару секунд.Поэтому, пока ваше приложение все еще работает, вы можете загрузить исправленную версию, и пусть ваши тестеры тестируют ее на стадии подготовки, а когда они дают ход, то просто заменяют ее на производство.Сначала загрузите в хранилище BLOB-объектов.Но я думаю, что это накладные расходы, поскольку это не ускоряет запуск инстансов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...