Какой сервер непрерывной интеграции может ставить задания в очередь?
Автор вопроса: Gill BatesОтветов: 5
Вариант использования:
Сервер CI опрашивает некоторый репозиторий VSC и запускает набор тестов для каждой версии. И если две или более ревизии были зафиксированы, даже за относительно небольшой промежуток времени, я хочу, чтобы сервер CI ставил каждую из них в очередь, запускал тесты для каждой, сохранял результаты и никогда больше не запускал тесты для этих коммитов. И я не хочу, чтобы сервер CI запускал задания параллельно, чтобы избежать проблем с производительностью и сбоев в случае множества одновременных заданий.
Какой CI-сервер может справиться с этим?
Моим дополнительным, менее важным требованием является то, что я использую Python и желательно использовать программное обеспечение, написанное на Python, поэтому я посмотрел проект Buildbot, и особенно хочу увидеть отзывы об этом инструменте в плане его использования в целом и способен ли он заменить самые популярные решения, такие как Travis или Jenkins.
Я использовал jenkins для этого. (в основном с подрывной деятельностью, сборкой c/c++, а также заданиями по сценарию bash/python)
Самая простая и стандартная обработка изменений VCS/SCM в jenkins - опрос изменений в установленное время. Сборка запускается, если есть какие-либо изменения. При использовании этого метода в сборку может быть включено более одного коммита (например, если 2 коммита выполняются близко друг к другу). Jenkins показывает ссылки на выполненное обновление scm и scm, а также показывает журналы сборки, и вы можете легко настроить выходные данные сборки и представление результатов тестирования.
TeamCity бесплатна (до нескольких сборок и агентов сборки) и многофункциональна. Его очень легко установить и настроить, хотя может потребоваться некоторое время, чтобы разобраться в богатстве опций. Он очень хорошо задокументирован: http://www.jetbrains.com/teamcity/documentation/
По умолчанию он запускает один агент сборки и запускает одну сборку за раз на этом агенте сборки. Вы можете запустить больше агентов сборки для ускорения. Если вы не хотите запускать более одной сборки на машине, запустите только один агент сборки на каждой машине.
Ответ 3 · рейтинг 3 · hithwen
Я не хочу, чтобы CI-сервер запускал задания параллельно, чтобы избежать проблем с производительностью и сбоев в случае множества одновременных заданий.
В buildbot вы можете ограничить количество запущенных заданий в подчинении с помощью max_build или блокировки
Ответ 4 · рейтинг 2 · Yair Nevet
Что касается Buildbot и Python, вы можете координировать параллельные сборки по конфигурации, например:
Моделирование параллельных процессов: шаги
svn up
configure
make
make test
make dist
Кроме того, вы также можете попробовать использовать триггерный планировщик для вашего компоновщика, который выполняет шаги U, V, W.
Из документов:
Планировщик Triggerable ожидает запуска на шаге Trigger (см. Запуск планировщиков) в другой сборке. Этот шаг может дополнительно дождаться завершения сборки планировщика. Это дает два преимущества по сравнению с зависимыми планировщиками.
Существует плагин Throttle Concurrent Builds Plugin для Jenkins и Hudson. Это позволяет указать количество одновременных сборок для каждого задания. Вот что написано на странице плагина:
Следует отметить, что Jenkins по умолчанию никогда не выполняет одно и то же задание параллельно, поэтому вам не нужно ничего регулировать, если вы используете значение по умолчанию. Тем не менее, есть опция Выполнить параллельные сборки, если это необходимо, что позволяет запускать одно и то же задание несколько раз параллельно, и, конечно, если вы используете категории ниже, вы также сможете ограничить несколько заданий.)
Существует также Gitlab CI, очень хороший современный проект Ruby, который использует бегунов для распространения сборок, так что вы могли бы, я думаю, ограничить количество бегунов до 1, чтобы получить нужный вам эффект. Он тесно интегрирован с Gitlab, поэтому я не знаю, насколько сложно будет использовать его как отдельный сервис.
www.gitlab.com
www.gitlab.com/gitlab-ci
Чтобы запускать тесты только один раз для каждой ревизии, вы можете сделать что-то вроде этого:
строить
post-build
check if the revision of the build is in /tmp/jenkins-test-run
если ревизия есть в файле пропустить тесты
если ревизия НЕ в файле запускает тесты
если мы запускали тесты то пишем ID в /tmp/jenkins-test-run