У меня есть конвейер Jenkins для сборки, тестирования и фиксации изменений кода в git хранилище. Несмотря на то, что конвейер одинаковый (общий), при успешной сборке и тестировании изменения кода могут быть зафиксированы в одном из трех git репозиториев на основе входных данных, предоставленных пользователем во время запуска задания.
Хотя я знаю, что в конвейере Jenkins есть конфигурация, запрещающая одновременные сборки (Do not allow concurrent builds
), я не хочу ее использовать. Причина, скажем, если первое задание выполняется для git_repo1
, а второе - для git_repo2
, я не хочу останавливать второе задание для git_repo2
, выбрав вышеуказанную опцию. Поскольку для двух разных репозиториев git выполняются два задания, им должно быть разрешено одновременное выполнение.
Поэтому я решил создать блокировку для задания Jenkins на основе моего кода, т.е. приостановить / остановить / дождитесь второй сборки, если первая сборка уже запущена для того же репо git.
Пример кода такой:
#!/usr/bin/perl
my $repo_name = "git_repo1";
my $dir = "/my/local/path/$repo_name";
my $cmd = "mkdir $dir";
if (-d $dir)
{
print "directory exists.. \n";
while (-d $dir)
{
# wait until $dir is deleted by the job which is already in progress. Until that time this Jenkins job will wait for its deletion.
sleep 10;
print ".";
}
}
else
{
print "directory does not exists..\n";
system ($cmd);
print "directory created..\n";
# Current Jenkins job may proceed.
}
print "end of file.. \n";
Пожалуйста, предложите, если этот код устойчив и сохранится в любых условиях.