Добрый день. Не имея времени копаться в LinuxСтолкнувшись с пробелами в информации при поиске по сети инструкций по установке и настройке под ОС Windows сервера непрерывной сборки Jenkins для приложений Android, Git сервера и их интеграции решил поделиться информацией о том, что у меня получилось.
Можете с самого начала установить JDK, Git for Windows и Android SDK Tools с настройками по дефолту.
Простой и лёгкий git сервер под собой требует установки IIS и ASP.MVC что включает MS SQL Server Express 2008
Тут ничего необычного, добавляем роль Web Server (IIS):
Главное на следущей форме не пропустить добавить ASP.NET 4.5 в Feature:
Запускаем дистрибутив:
Попутно установится MS SQL Server 2008 Express и нас спросят пароль для УЗ sa. Надеюсь без надобности она более не потребуется:
После установки MVC нужно по новой пройтись в настройки серверных ролей (не features, а раньше) и добавить web-серверу поддержку ASP.NET4.5. До установки ASP.NET MVC 4 этого подраздела (Application Development) в компонентах IIS не было!
Всё, теперь можно перейти к непосредственно развёртыванию git сервера. Разархивируем содержимое дистрибутива в wwwroot IIS-сервера и даём права УЗ IIS_IUSERS на модификацию каталога App_Data:
Запускаем IIS Manager и конвертируем в приложение BonoboGitServer:
Если всё пошло так как надо справа в IIS Manager в Action жмём Browse: *:80(http) и попадаем (если вы не изменили имя и порт) на localhost/BonoboGitServer:
Логин и пароль для первого входа admin/admin. У сервера не так много настроек (во всяком случае через web-интерфейс), можно например поменять язык интерфейса:
и создать новых пользователей, например developer и jenkins. Под первым мы будем работать сами, второй нужен будущему серверу сборок.
Создадим новый репозиторий и дадим права на него разработчику и сборщику (УЗ jenkins, на скрине нет, но он там должен быть если делать всё по порядку...)
Пример странички репозитория с заветным адресом .git. Т.к. я заходил на сервер из браузера на этой же машине в адресе у меня фигурирует localhost, но у вас может быть нормальное DNS-имя сервера или IP.
Можно создать какой-нибудь проект в Android Studio указать в качестве удалённой ветки адрес нашего репозитория. Всю эту локальную часть я пропущу.
Jenkins устанавливается из msi и особо ни о чём не спрашивает, в конце установки автоматически открывается страничка с адресом где нам нужно скопировать из файла initialAdminPassword и вставить пароль:
В дальнейшем пароль УЗ admin тоже можно поменять.
Пришла пора установить необходимые плагины и настроить сервер. Переходим в Manage Jenkins — Manage Plugins — Avaliable и отмечаем:
После перезапуска Jenkins необходимо перейти в раздел Manage Jenkins — Configure System и прописать путь к Android SDK в двух местах:
И в самом низу этой же странички в Android SDK root:
Если данного параметра не появилось что-то не то с Android Emulator Plugin, возможно он просто не установился.
Далее перейти на страничку конфигурации Manage Jenkins — Global Tool Configuration проверить и при необходимости указать пути к компонентам:
Кажется всё?
В основном боковом меню Jenkins жмём New Item, придумываем название задачи с типом «Freestyle project» и жмём ок, попадаем в конфигурацию задачи. Не забываем поставить галочку Discard old builds а то наш сервер вскоре заполнится успешными билдами всех версий:
В разделе Source Code Management указываем URL репозитория git нашего проекта. Забегая вперёд, не заводим и не подставляем никакие учётные данные для доступа к репозиторию:
Будем собирать ветку master. Также можно настроить автоматическую сборку, в частности опрос репозитория ежеминутно и старт сборки в случае обнаружения новых коммитов. Отмечаем Poll SCM и пишем * * * * *:
В разделе build нажимаем Add build step и настраиваем сборку Gradle. Gradle version должен быть доступен тот, что мы указали в Global Tools Configurations. Пишем простой Task — «clean build». Это задачи, доступные нам в gradlew.bat tasks в корне проекта. Вы можете вызывать тут и другие задачи сборщика, в т.ч. с ключами.
Также добавляем одно Post-build Action — будем сохранять наши APK-шники — приложения Android. Так и пишем:
Сохраняем и запускам сборку и видим что-то подобное, висим 10 минут и не можем достучатся в репозиторий:
Мы же никак не авторизовались в репозитории git! Добавление пары Login/Password в хранилище Jenkins (там где мы оставили -none- в Source Code Management) не сработало, как бы я не пробовал. Надо попробовать поискать другие пути.
Командная строка запускается от имени УЗ сеанса, Jenkins от имени System и ничего об этом не знает, в хранилище Credential Manager похоже что тоже не случится. Т.е. это не поможет:
Дополнительный поиск по сети дал несколько советов:
Для этого нам потребуется PsExec.exe из набора утилит PsTools. С её помощью мы можем запустить cmd.exe из под System. Запускаем cmd.exe с повышенными правами и выполняем:
В новой консоли всё что нужно сделать это постучатся в нужный нам репозиторий, например попробовать в командной строке склонировать его. будут запрошены учётные данные:
С помощью которых Jenkins сможет обращаться к данному репозиторию. Это та самая УЗ, которую мы создавали при настройках Bonobo Git Server наряду с developer'ом. Если в дальнейшем потребуется изменить данные учётные данные придётся пройти процедуру повторно.
Может случится так что в SDK будут отсутствовать какие-нибудь модули и консоль сборки выдавать сообщения подобного характера:
В таком случае вам надо запустить с повышенными правами SDK Manager и установить недостающие компоненты:
Всё, после всех шаманств сборка прошла успешно!
Можете разводить команду Android-разработчиков.
P.S. Можно ещё более автоматизировать процесс, с помощью соответсвующего плагина настроить автоматичекую публикацию apk'шника в Google Play Store но об этом я напишу может быть в другой раз, если там будут какие-нибудь трудности.
Дистрибутивы
- В роли ОС у нас будет выступать Windows Server 2012 R2 Standard x64
- Jenkins для Windows есть в отдельном msi
- Bonobo Git Server
- JDK
- ASP.NET MVC 4
- Android SDK tools в самом низу странички, не среду а только SDK
- Git for Windows x64
Последние приготовления
Можете с самого начала установить JDK, Git for Windows и Android SDK Tools с настройками по дефолту.
Bonobo Git Server
Простой и лёгкий git сервер под собой требует установки IIS и ASP.MVC что включает MS SQL Server Express 2008
IIS Server
Тут ничего необычного, добавляем роль Web Server (IIS):
IIS![image](https://habrastorage.org/getpro/habr/post_images/daf/f67/e3c/daff67e3c336bf64b0ce809be16ff811.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/daf/f67/e3c/daff67e3c336bf64b0ce809be16ff811.jpg)
Главное на следущей форме не пропустить добавить ASP.NET 4.5 в Feature:
Feature![image](https://habrastorage.org/getpro/habr/post_images/5cd/86e/c1d/5cd86ec1da789546ba21d7d653e2e7bc.png)
![image](https://habrastorage.org/getpro/habr/post_images/5cd/86e/c1d/5cd86ec1da789546ba21d7d653e2e7bc.png)
ASP.NET MVC4
Запускаем дистрибутив:
ASP.NET MVC4 Install![image](https://habrastorage.org/getpro/habr/post_images/ca6/68e/737/ca668e7373df9d2d6cf591b2a4596b80.png)
![image](https://habrastorage.org/getpro/habr/post_images/ca6/68e/737/ca668e7373df9d2d6cf591b2a4596b80.png)
Попутно установится MS SQL Server 2008 Express и нас спросят пароль для УЗ sa. Надеюсь без надобности она более не потребуется:
MS SQL Server installation![image](https://habrastorage.org/getpro/habr/post_images/c3e/c8e/a07/c3ec8ea07b7515070ebc5233e9d9f8ef.png)
![image](https://habrastorage.org/getpro/habr/post_images/c3e/c8e/a07/c3ec8ea07b7515070ebc5233e9d9f8ef.png)
После установки MVC нужно по новой пройтись в настройки серверных ролей (не features, а раньше) и добавить web-серверу поддержку ASP.NET4.5. До установки ASP.NET MVC 4 этого подраздела (Application Development) в компонентах IIS не было!
Server Roles - IIS - Web Server - Application Development - ASP.NET 4.5![image](https://habrastorage.org/getpro/habr/post_images/7f1/fd2/cc5/7f1fd2cc5a8d0fe0d9f4e7a78cca1fa3.png)
![image](https://habrastorage.org/getpro/habr/post_images/7f1/fd2/cc5/7f1fd2cc5a8d0fe0d9f4e7a78cca1fa3.png)
Bonobo Git Server
Всё, теперь можно перейти к непосредственно развёртыванию git сервера. Разархивируем содержимое дистрибутива в wwwroot IIS-сервера и даём права УЗ IIS_IUSERS на модификацию каталога App_Data:
IIS wwwroot и права УЗ IIS_IUSERS на каталог App_Data![image](https://habrastorage.org/getpro/habr/post_images/666/251/c89/666251c898baef108578c95ec7866972.png)
![image](https://habrastorage.org/getpro/habr/post_images/666/251/c89/666251c898baef108578c95ec7866972.png)
Запускаем IIS Manager и конвертируем в приложение BonoboGitServer:
IIS Manager Convert to Application![image](https://habrastorage.org/getpro/habr/post_images/919/0c5/dd1/9190c5dd1e52d1c9fb4e8aa63cd5cda5.png)
![image](https://habrastorage.org/getpro/habr/post_images/919/0c5/dd1/9190c5dd1e52d1c9fb4e8aa63cd5cda5.png)
Если всё пошло так как надо справа в IIS Manager в Action жмём Browse: *:80(http) и попадаем (если вы не изменили имя и порт) на localhost/BonoboGitServer:
Bonobo Git Server login page![image](https://habrastorage.org/getpro/habr/post_images/7db/00a/18f/7db00a18ffb8b75951d309dcd6163e64.png)
![image](https://habrastorage.org/getpro/habr/post_images/7db/00a/18f/7db00a18ffb8b75951d309dcd6163e64.png)
Логин и пароль для первого входа admin/admin. У сервера не так много настроек (во всяком случае через web-интерфейс), можно например поменять язык интерфейса:
Bonobo Language![image](https://habrastorage.org/getpro/habr/post_images/401/ca3/fa2/401ca3fa2bcf9237ac4d9b06485184e7.png)
![image](https://habrastorage.org/getpro/habr/post_images/401/ca3/fa2/401ca3fa2bcf9237ac4d9b06485184e7.png)
и создать новых пользователей, например developer и jenkins. Под первым мы будем работать сами, второй нужен будущему серверу сборок.
Новый пользователь Bonobo Git Server![image](https://habrastorage.org/getpro/habr/post_images/084/958/f84/084958f84ea4554dcbbefeedead3e249.png)
![image](https://habrastorage.org/getpro/habr/post_images/084/958/f84/084958f84ea4554dcbbefeedead3e249.png)
Создадим новый репозиторий и дадим права на него разработчику и сборщику (УЗ jenkins, на скрине нет, но он там должен быть если делать всё по порядку...)
Новый репозиторий![image](https://habrastorage.org/getpro/habr/post_images/273/24b/043/27324b0437532f108a9e918f9c3c0e3f.png)
![image](https://habrastorage.org/getpro/habr/post_images/273/24b/043/27324b0437532f108a9e918f9c3c0e3f.png)
Пример странички репозитория с заветным адресом .git. Т.к. я заходил на сервер из браузера на этой же машине в адресе у меня фигурирует localhost, но у вас может быть нормальное DNS-имя сервера или IP.
Адрес репозитория![image](https://habrastorage.org/getpro/habr/post_images/039/ab5/442/039ab54427dc994d87d967ee346ffaec.png)
![image](https://habrastorage.org/getpro/habr/post_images/039/ab5/442/039ab54427dc994d87d967ee346ffaec.png)
Можно создать какой-нибудь проект в Android Studio указать в качестве удалённой ветки адрес нашего репозитория. Всю эту локальную часть я пропущу.
Удалённый репозиторий доступен![image](https://habrastorage.org/getpro/habr/post_images/da2/a40/ddf/da2a40ddf9db5427c99fc4ceff9b6415.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/da2/a40/ddf/da2a40ddf9db5427c99fc4ceff9b6415.jpg)
Jenkins
Jenkins устанавливается из msi и особо ни о чём не спрашивает, в конце установки автоматически открывается страничка с адресом где нам нужно скопировать из файла initialAdminPassword и вставить пароль:
Unlock Jenkins![image](https://habrastorage.org/getpro/habr/post_images/c2c/ca7/92f/c2cca792f163b47e0398a17105aca335.png)
![image](https://habrastorage.org/getpro/habr/post_images/c2c/ca7/92f/c2cca792f163b47e0398a17105aca335.png)
В дальнейшем пароль УЗ admin тоже можно поменять.
Пришла пора установить необходимые плагины и настроить сервер. Переходим в Manage Jenkins — Manage Plugins — Avaliable и отмечаем:
- JDK Parameter Plugin
- Git plugin
- Android Emulator Plugin
- Gradle plugin
Jenkins plugins![image](https://habrastorage.org/getpro/habr/post_images/b3f/050/503/b3f05050341a18f927f293fd936969c9.png)
![image](https://habrastorage.org/getpro/habr/post_images/b3f/050/503/b3f05050341a18f927f293fd936969c9.png)
После перезапуска Jenkins необходимо перейти в раздел Manage Jenkins — Configure System и прописать путь к Android SDK в двух местах:
ANDROID_HOME в Environment variables![image](https://habrastorage.org/getpro/habr/post_images/64f/07f/5e2/64f07f5e2bf5998354499e2ccd496764.png)
![image](https://habrastorage.org/getpro/habr/post_images/64f/07f/5e2/64f07f5e2bf5998354499e2ccd496764.png)
И в самом низу этой же странички в Android SDK root:
Android SDK root![image](https://habrastorage.org/getpro/habr/post_images/a25/3ae/7c4/a253ae7c4d0a38ce2bd3ced8993348db.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/a25/3ae/7c4/a253ae7c4d0a38ce2bd3ced8993348db.jpg)
Если данного параметра не появилось что-то не то с Android Emulator Plugin, возможно он просто не установился.
Далее перейти на страничку конфигурации Manage Jenkins — Global Tool Configuration проверить и при необходимости указать пути к компонентам:
Global Tool Configuration
С JDK всё прсто:
![image](https://habrastorage.org/getpro/habr/post_images/ec1/e28/a2a/ec1e28a2ab81468264151d052f34c13d.jpg)
Git можно не трогать, если в переменной path указан путь к исполняемому файлу git и он доступен в командной строке то и Jenkins сможет его использовать:
![image](https://habrastorage.org/getpro/habr/post_images/7dc/81a/c77/7dc81ac77b776d6f91be274d7387d008.jpg)
А Gradle пусть скачается автоматически. В принципе такой же фокус можно было бы сделать с JDK но при установке Android SDK требует зарегистрированной в системе JDK, а куда Jenkins скачивает JDK я не раскопал.
![image](https://habrastorage.org/getpro/habr/post_images/64a/88e/bf3/64a88ebf32079dedf979353517167ed0.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/ec1/e28/a2a/ec1e28a2ab81468264151d052f34c13d.jpg)
Git можно не трогать, если в переменной path указан путь к исполняемому файлу git и он доступен в командной строке то и Jenkins сможет его использовать:
![image](https://habrastorage.org/getpro/habr/post_images/7dc/81a/c77/7dc81ac77b776d6f91be274d7387d008.jpg)
А Gradle пусть скачается автоматически. В принципе такой же фокус можно было бы сделать с JDK но при установке Android SDK требует зарегистрированной в системе JDK, а куда Jenkins скачивает JDK я не раскопал.
![image](https://habrastorage.org/getpro/habr/post_images/64a/88e/bf3/64a88ebf32079dedf979353517167ed0.jpg)
Кажется всё?
Создание задачи на автоматическую сборку
В основном боковом меню Jenkins жмём New Item, придумываем название задачи с типом «Freestyle project» и жмём ок, попадаем в конфигурацию задачи. Не забываем поставить галочку Discard old builds а то наш сервер вскоре заполнится успешными билдами всех версий:
General![image](https://habrastorage.org/getpro/habr/post_images/cca/e45/07e/ccae4507ed8e104e7671fa2ca561dd21.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/cca/e45/07e/ccae4507ed8e104e7671fa2ca561dd21.jpg)
В разделе Source Code Management указываем URL репозитория git нашего проекта. Забегая вперёд, не заводим и не подставляем никакие учётные данные для доступа к репозиторию:
Source Code Management![image](https://habrastorage.org/getpro/habr/post_images/0c4/8f7/6f9/0c48f76f91bbda15dd081ced77111657.png)
![image](https://habrastorage.org/getpro/habr/post_images/0c4/8f7/6f9/0c48f76f91bbda15dd081ced77111657.png)
Будем собирать ветку master. Также можно настроить автоматическую сборку, в частности опрос репозитория ежеминутно и старт сборки в случае обнаружения новых коммитов. Отмечаем Poll SCM и пишем * * * * *:
Build triggers![image](https://habrastorage.org/getpro/habr/post_images/2f1/3cd/685/2f13cd6853591bbc9f8b40361d0c20ad.png)
![image](https://habrastorage.org/getpro/habr/post_images/2f1/3cd/685/2f13cd6853591bbc9f8b40361d0c20ad.png)
В разделе build нажимаем Add build step и настраиваем сборку Gradle. Gradle version должен быть доступен тот, что мы указали в Global Tools Configurations. Пишем простой Task — «clean build». Это задачи, доступные нам в gradlew.bat tasks в корне проекта. Вы можете вызывать тут и другие задачи сборщика, в т.ч. с ключами.
Gradle![image](https://habrastorage.org/getpro/habr/post_images/358/f61/f12/358f61f122477789ebe64fe437cb01ab.png)
![image](https://habrastorage.org/getpro/habr/post_images/358/f61/f12/358f61f122477789ebe64fe437cb01ab.png)
Также добавляем одно Post-build Action — будем сохранять наши APK-шники — приложения Android. Так и пишем:
**\*apk:
Post-build Action![image](https://habrastorage.org/getpro/habr/post_images/4a8/343/767/4a8343767e6f0d7a5e7d7178d19d3342.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/4a8/343/767/4a8343767e6f0d7a5e7d7178d19d3342.jpg)
Сборка
Сохраняем и запускам сборку и видим что-то подобное, висим 10 минут и не можем достучатся в репозиторий:
git.exe fetch --tags --progress http://localhost/Hello.git +refs/heads/*:refs/remotes/origin/*
Мы же никак не авторизовались в репозитории git! Добавление пары Login/Password в хранилище Jenkins (там где мы оставили -none- в Source Code Management) не сработало, как бы я не пробовал. Надо попробовать поискать другие пути.
Командная строка запускается от имени УЗ сеанса, Jenkins от имени System и ничего об этом не знает, в хранилище Credential Manager похоже что тоже не случится. Т.е. это не поможет:
Credential Manager![image](https://habrastorage.org/getpro/habr/post_images/24a/d0f/b0e/24ad0fb0e3652b5a1de20b7c39eb93b5.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/24a/d0f/b0e/24ad0fb0e3652b5a1de20b7c39eb93b5.jpg)
Дополнительный поиск по сети дал несколько советов:
- Перенос ssh-ключей из УЗ сеанса в system, которые я так и не смог найти;
- Второй способ (Авторизация git), который сработал.
Авторизация git
Для этого нам потребуется PsExec.exe из набора утилит PsTools. С её помощью мы можем запустить cmd.exe из под System. Запускаем cmd.exe с повышенными правами и выполняем:
PsExec.exe -i -s cmd.exe
В новой консоли всё что нужно сделать это постучатся в нужный нам репозиторий, например попробовать в командной строке склонировать его. будут запрошены учётные данные:
Git![image](https://habrastorage.org/getpro/habr/post_images/ac8/a70/7f1/ac8a707f1c66234a939702b6eccf70c7.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/ac8/a70/7f1/ac8a707f1c66234a939702b6eccf70c7.jpg)
С помощью которых Jenkins сможет обращаться к данному репозиторию. Это та самая УЗ, которую мы создавали при настройках Bonobo Git Server наряду с developer'ом. Если в дальнейшем потребуется изменить данные учётные данные придётся пройти процедуру повторно.
Нехватка компонентов и акцептов лицензий на компоненты Android SDK
Может случится так что в SDK будут отсутствовать какие-нибудь модули и консоль сборки выдавать сообщения подобного характера:
A problem occurred configuring project ':app'. You have not accepted the license agreements of the following SDK components: [Android SDK Platform 24, Android SDK Build-Tools 24.0.1].
В таком случае вам надо запустить с повышенными правами SDK Manager и установить недостающие компоненты:
Android SDK Manager![image](https://habrastorage.org/getpro/habr/post_images/bbb/e0f/db3/bbbe0fdb3ec8b1bd18c53328178e97a8.png)
![image](https://habrastorage.org/getpro/habr/post_images/bbb/e0f/db3/bbbe0fdb3ec8b1bd18c53328178e97a8.png)
Всё, после всех шаманств сборка прошла успешно!
Successful build!![image](https://habrastorage.org/getpro/habr/post_images/304/e92/60f/304e9260f834156bc7e06b055a8d1680.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/304/e92/60f/304e9260f834156bc7e06b055a8d1680.jpg)
Можете разводить команду Android-разработчиков.
P.S. Можно ещё более автоматизировать процесс, с помощью соответсвующего плагина настроить автоматичекую публикацию apk'шника в Google Play Store но об этом я напишу может быть в другой раз, если там будут какие-нибудь трудности.
Поделиться с друзьями
Cobolorum
А ответе на вопрос как у вас решается установок а новых версий Jenkins, Bonobo Git Server, JDK, ASP.NET, Android SDK, Git, так же руками нажал и кликнул?
Arvalon
При выходе новой версии Jenkins покажет это в интерфейсе
SicYar
Довольно интересное решение, сам собираю с помощью Powershell и такой — то матери. Стоит попробовать Ваш способ, как раз хотел дженкинс прикрутить на замену набившему оскомину Powershell. Спасибо за статью!
Arvalon
Ну собственно говоря серверы непрерывной сборки для этого и существуют. А управлять стадиями сборки из PowerShell — где тут автоматизация, запуском скриптов шедулером по расписанию, на выделенном сервере? Какой сборщик, Gradle или Maven?
Всё вышеописанное необходимо для командной разработки. Если разработчик один то у него всё собрано в Android Studio с Gradle (или Eclipse с ADT и Maven) и ни Jenkins, ни git-сервер, ни PowerShell не нужны.
SicYar
Полностью с Вами согласен, сборщик Maven. Автоматизация в том, что прошлая версия бекапится, логи сохраняются, новая накатывается, при ошибке откатывается все, логи пишутся… Стремный костыль, я его не похвалиться тут озвучил, а застыдить себя.
Arvalon
А, тогда только Git-сервера не хватает. Там же будут все коммиты и ветки по которым можно переключаться. Можно сидеть и пилить develop или feature-ветку до успешной протестированной сборки, хоть убить её всю.
И Bonobo Git Server тут не единственное решение, ниже писали про SCMManager, он похоже ещё легче будет.
SicYar
В моей схеме есть git, Bitbucket'ом пользуюсь.
Или локальным гит сервером, что не принципиально, т.к. по стечению обстоятельств приходится пользоваться параллельно и битбакетом и локальным из-за разницы в доступе для других разработчиков. В Powershell скрипте есть файлик с настройкой, где можно быстро заменить один на другой.
P.S. все равно статья Ваша очень интересная, мое решение было таким, теперь попробую реализовать Ваш вариант и работать с ним, мне он кажется более адекватным.
sshikov
>Простой и лёгкий git сервер под собой требует установки IIS и ASP.MVC что включает MS SQL Server Express 2008
Какой-то он не слишком простой и легкий )
На SCMManager смотрели? Там просто оболочка над svn/git/hg, в виде web UI, сделанного на основа Java. Все что нужно — это JRE для запуска. Устанавливать больше вообще не нужно ничего.
Arvalon
Да, надо было «простой и лёгкий» взять в кавычки.
SCMManager не смотрел, посмотрю.
Master_Dante
Пользуюсь Bonobo Git больше года, раз в квартал выходят обновления, хороший софт рекомендую.