ANT - скорость улучшения существующего скрипта - PullRequest
1 голос
/ 25 октября 2011

Я собрал набор универсальных сценариев развертывания, которые отлично работают для большинства наших вещей.Однако мы только что представили наш самый крупный проект для установки, и теперь мы находим, что времена слишком разнообразны и длинны для нашего вкуса.

Размер проекта в его нынешнем виде составляет 33 226 файлов при размере 400 МБ плюс,Время в настоящее время занимает от 13 минут до 55 минут (время последнего развертывания), в зависимости от определенных решений, принятых ANT (подробнее ниже).

Что касается шагов, которые мы в настоящее время делаем на серверах x2: -

1) ANT экспортирует проект из SVN на оба сервера (состоит из 3 частей).

2) Начинает закрывать веб-службы на сервере № 1.Это был обходной путь, который мы применили, чтобы остановить блокировку файлов Windows (2003) при сбое развертывания.

3) ANT запускает задачу «переместить» в текущей версии (все части) во временные папки и перемещает экспортированный новыйверсия на свое место.

4) Выполняется настроенный код развертывания - одна часть состоит в перемещении постоянных функций из временной папки в новую (т. е. системные файлы / инструменты администратора веб-сервера).

5) Удалите временную папку.

6) Переведите веб-службы в оперативный режим

... промойте и повторите для 2-го сервера шаги 2 -> 6.

7) Сохраните журналы ANT.

Основная проблема, с которой я столкнулся, заключается в том, что задача перемещения ANT, по-видимому, принимает одно из двух решений.Это либо:

a) Очень просто поменять версии и продолжить - потратить минуту или две на то, чтобы обработать их, или b) пройти некоторую проверку целостности, что он перемещает каждый файл и папку из одного места вдругой.Это затопляет журналы и занимает достаточно много времени, чтобы завершить.Отсюда добавлено 40 с лишним минут.

Я не могу найти в Интернете ничего, что объясняет, почему ANT / OS принимает это решение.Вариант А был бы идеальной ситуацией с полной занятостью.

Я пробовал копировать, удалять отдельно.Я пробовал задачу синхронизации.Кажется, что у всех такая низкая производительность.

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

Большое спасибо, Джеймс

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Спасибо за ввод всех.

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

ПервыйЯ изменил, как происходит перестановка на обратной стороне комментария, который я упоминал ранее.Кажется, что ANT попытается сделать следующее: -

"Если целевой каталог еще не существует, Ant выполнит переименование каталога. Но если целевой каталог существует, он вместо этого копирует ввместо этого каталог и удалите его из исходного каталога. "

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


Несколько других вещей, которые я добавил, чтобы сделать ANT немного умнее: -)

1) Я настроил егопоэтому ANT не будет развертывать какую-либо часть сборки, которая совпадает с той, что существует в настоящее время.Таким образом, если часть 1 выбрана и уже находится в тестовой среде, она удаляется из сборки и экспорта SVN.

2) При отключении / запуске службы ANT читает ответ, который возвращается.Если служба сообщает, что она уже запущена при вызовах, как это иногда случается, если служба полагается на другие, Windows автоматически загружает их, тогда я сказал ANT, чтобы они зависали и переходили к следующему.


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

Еще раз спасибо, Джеймс

0 голосов
/ 28 августа 2012

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

Итак, мы сделали следующие вещи, такие как: 1. Параллельная очистка и остановка всехtomcats 2. выполните svn swith 3. параллельно запустите все tomcats 4. убедитесь, что все веб-приложения правильно развернуты с использованием jmx

, вот фрагмент кода:

    <target name="all_clean_parallel">
      <parallel>
        <antcall target="x1_clean"/>
        <antcall target="x2_clean"/>
        <antcall target="x3_clean"/>            
    </parallel>  
  </target> 

  <target name="all_start_parallel">
    <parallel>
      <antcall target="x1_start"/>
      <antcall target="x2_start"/>
      <antcall target="x3_start"/>        
   </parallel>
  </target>

и фрагмент кодачтобы проверить, правильно ли развернуто webapp или нет, с помощью справки jmx:

 <macrodef name="mStatus">
   <attribute name="aModule" />
   <attribute name="aHost" default="localhost"/>
   <attribute name="aPort" default="9012"/>
   <attribute name="aMaxWait" default="240"/>
   <attribute name="aTomcat" default=""/>
   <attribute name="aState" default="1"/>
   <sequential>
     <waitfor maxwait="@{aMaxWait}" maxwaitunit="second" timeoutproperty="@{aHost}.@{aTomcat}.@{aModule}.@{aPort}.server.timeout" >
     <and>
       <jmx:equals
                host="@{aHost}"
                port="@{aPort}"
                ref="@{aHost}.@{aTomcat}.@{aModule}.@{aPort}"
                        name="Catalina:j2eeType=WebModule,name=//localhost/@{aModule},J2EEApplication=none,J2EEServer=none" 
                attribute="state"
                value="@{aState}"
    />
  </and>

</waitfor>
<if>
  <equals arg1="${@{aHost}.@{aTomcat}.@{aModule}.@{aPort}.server.timeout}" arg2="true" />
  <then>
    <var name="failBuild" value="true"/>
    <echo message="*************************Host.Tomcat.Module = @{aHost}.@{aTomcat}.@{aModule} is not deployed into the tomcat" />
  </then>
  <else>
    <echo message="@{aHost}.@{aModule} is deployed into the tomcat" />
  </else>
 </if>
</sequential>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...