Создание пользовательской блокировки для заданий Jenkins - PullRequest
1 голос
/ 02 мая 2020

У меня есть конвейер 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";

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

1 Ответ

1 голос
/ 02 мая 2020

Я бы просто изолировал git pu sh на его собственной стадии "publi sh".

Значение всего до этой стадии "publi sh" запускаться одновременно.

Но для самого этапа "publi sh" вы можете использовать плагин Jenkins Lockable Resource и объявить блокировку ( как здесь ), чтобы предотвратить подталкивание к одному и тому же репо в одно и то же время. Это и использование этап этапа .

stage('Publish') {
    lock(resource: "repo ${REPO_NAME}", inversePrecedence: true) {
      milestone 1
      sh "git push ..."
    }
}

Итак:

  • нет perl зависимость
  • нет поддержки сценариев
  • все одновременно (даже для того же репо)
  • , за исключением части pu sh.
...