Как предотвратить одновременное выполнение определенных заданий Дженкинса?


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

учитывая задания от A до E, например, есть ли способ указать, что A и C никогда не следует запускать одновременно?

кроме вышеупомянутого ресурса, сборки независимы друг от друга (например, не в восходящем/нисходящем отношении).

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

6 56

6 ответов:

в настоящее время есть 2 способа сделать это:

посмотреть Диспетчер Внешних Ресурсов Дженкинс плагин, который был впервые опубликован в ноябре 2012 года. Этот (относительно) новый плагин, кажется, точно охватывает этот случай использования.

Это старый вопрос, но тема все еще может быть актуальной, особенно при запуске тестов приложений на Дженкинсе.

The Блокируемый Плагин Ресурсов позволяет определить заблокированные ресурсы,которые могут использоваться сборками. Если ваша сборка требует ресурса, он принимает блокировку. Если для второй сборки требуется тот же ресурс (который затем уже заблокирован), он будет помещен в очередь для освобождения ресурса.

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

В напротив замки и защелки плагин упомянутый в ответах с 2012 года, этот пакет, похоже, в настоящее время поддерживается (в настоящее время ~2016).

N. B. вам не нужно физическое или виртуальное оборудование для ведомого устройства/узла, вы можете настроить "ведомые устройства", которые работают на главном сервере.

управление Дженкинс > управление узлами > новый узел

и сделать "тупые рабы" каждый со своим собственным корневым каталогом.

Создайте несколько ведомых устройств, выполните их при загрузке сервера, а затем вы по существу создали пулы исполнителей.

вы могли бы, скажем...

db-только один исполнитель в вашем случай. compile-ограничение в соответствии с оборудованием или # процессоров. скрипты-есть много исполнителей для всех тех маленьких заданий, которые Дженкинс хорошо делает.

старый вопрос, и будет ли это работать для вашего приложения я не могу быть уверен, как вы не упомянули детали вашего приложения. Тем не менее, я хотел добавить способ, которым я справился с этим в нашем наборе тестов приложений Rails.

конфигурация базы данных нашего приложения (database.yml) не находится в исходном репозитории. Вместо этого он живет в /var/lib/configs/uniquing_database.yml на виртуальной машине, которая запускает наш экземпляр Дженкинса.

один из шагов нашего процесса сборки включает копирование этого файла конфигурации в рабочая область проекта:

cp /var/lib/jenkins/configs/myapp_unique_database.yml config/database.yml

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

test:
  adapter: postgresql
  encoding: unicode
  host: 127.0.0.1
  port: 5432
  database: myapp_test<%= ENV['JOB_NAME'].split('/').last %><%= ENV['BUILD_NUMBER'] %>

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

RAILS_ENV=test bundle exec rake db:drop