То, что я пытаюсь достичь
- У меня есть
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
.
Вопросы
- Почему он не может найти доступный ресурс?Я неправильно это использую?
- Я в правильном направлении?