Дженкинс заблокировать по метке - PullRequest
0 голосов
/ 19 февраля 2019

То, что я пытаюсь достичь

  • У меня есть jobA, для которого требуется 1 исполнитель на одной машине.
  • У меня jobB, для которого требуется 2 исполнителя на одной машинемашина и 1 исполнитель на машинах X.
  • Я хочу, чтобы они могли использовать одни и те же машины (но не одновременно) -> В настоящее время они используют разные машины.
  • Все ихзадачи используют 100% CPU.Таким образом, на одной машине не может одновременно существовать две сборки.

Как я решаю проблему

  • Поскольку для jobB требуется как минимум 2 исполнителя на одномдля узла и jobA требуется 1, мне нужно изменить количество исполнителей, чтобы иметь 2 на узел.
  • Должен быть механизм блокировки, так что если jobA или jobB build выполняется на узле,ни jobA, ни jobB сборка не может начаться на нем.

Что я сделал

Я изменил число исполнителей на моих машинах с 1 до 2.

Решение 1: Блокировка ресурса

В конвейере jobA у меня есть:

node('windows-agent-label') {
    lock("${env.NODE_NAME}-exclusive") {
        //...
    }
}

Запуск задания (первый раз) дает мне:

[Pipeline] Start of Pipeline
[Pipeline] node
Running on build1 in J:\jenkins\workspace\jobA
[Pipeline] {
[Pipeline] lock
Trying to acquire lock on [build1-exclusive]
Resource [build1-exclusive] did not exist. Created.
Lock acquired on [build1-exclusive]

И второй раз (пока первый еще строится):

[Pipeline] Start of Pipeline
[Pipeline] node
Running on build1 in J:\jenkins\workspace\jobA@2
[Pipeline] {
[Pipeline] lock
Trying to acquire lock on [build1-exclusive]
Found 0 available resource(s). Waiting for correct amount: 1.
[build1-exclusive] is locked, waiting...

Работает!Вторая сборка блокируется, пока первая не снимет блокировку.Однако второй уже отправлен узлу и использует слот исполнителя .На самом деле не приятно!Если я переместу директиву lock() за пределы директивы node(), у меня еще не будет env.NODE_NAME, поэтому блокировка не может работать.

Очевидно, есть другой способ ...

Решение 2. Блокировка путем запроса метки

У меня есть метка с именем windows-agent-label, которая содержит 2 узла: build1 и build2.

In jobAконвейер, у меня есть:

lock(label: 'windows-agent-label', quantity: 1) {
    node('windows-agent-label') {
        //...
    }
}

Запуск задания дает мне:

[Pipeline] Start of Pipeline
[Pipeline] lock
Trying to acquire lock on [Label: windows-agent-label, Quantity: 1]
Found 0 available resource(s). Waiting for correct amount: 1.
[Label: windows-agent-label, Quantity: 1] is locked, waiting...

Абсолютно ничего не работает на build1.

Все мои /lockable-resources/ FREE.

Вопросы

  • Почему он не может найти доступный ресурс?Я неправильно это использую?
  • Я в правильном направлении?

1 Ответ

0 голосов
/ 20 февраля 2019

Решение

В документации lock отсутствует (недокументированный) параметр: variable.При использовании с label он сохраняет в переменной env имя полученной блокировки.

Отсутствует здесь: https://plugins.jenkins.io/lockable-resources

Видимо там: https://issues.jenkins -ci.org/browse/JENKINS-40997

lock(label: 'windows-agent-label', quantity: 1, variable: 'LOCK_NAME') {
    node(env.LOCK_NAME - '-exclusive') {
        //...
    }
}

Итак, это запрашивает блокировку у всех, которые находятся под определенной меткой.Они всегда формируются (по выбору) как ${NODE_NAME}-exclusive.Если я не могу получить блокировку ресурса, это означает, что они все израсходованы.Если я его получу, это значит, что NODE_NAME (может быть build1, build2, ...) доступно.Итак, я иду к данному узлу.

...