Как получить имя раба на вольной работе groovy - PullRequest
0 голосов
/ 26 марта 2020

Позвольте мне изложить мою ситуацию и то, что я пытался до сих пор, чтобы лучше понять. У меня есть мастер jenkins, установленный в kubernetes, и у меня есть работа по фристайлу с включенными параллельными сборками. У меня есть 3 узла (узел1, узел2, узел3), где может выполняться это задание. Каждый узел может одновременно выполнять 5 сборок задания.

Теперь проблема в том, что я хочу назначить рабочую область из файловой системы хоста, на которой запущены модули (например, -v / ws / ws1). : / ws / ws1 в стиле Docker), потому что мне нужно сохранить рабочее пространство для последующего повторного использования. Я должен сделать это, чтобы предотвратить копирование огромных файлов из сети при каждом запуске сборки.

Поэтому я хочу назначить выделенное рабочее пространство для каждого модуля, чтобы предотвратить любые помехи в работающих сборках. Идея состоит в том, чтобы использовать блокируемые ресурсы, которые предоставляют переменную (например, LOCKED_RESOURCE), содержащую полученный ресурс, позволяющий установить для рабочей области значение /ws/$LOCKED_RESOURCE.

Задача состоит в том, чтобы предоставить список ресурсов. Я не могу предоставить список c, например. ws1 ws2 ws3 ws4 ws5, поскольку он ограничивает емкость кластера до 5 сборок за раз, хотя он может одновременно выполнять 3 * 5 = 15 сборок. Тогда решение может состоять в том, чтобы расширить список ресурсов до узла1-ws1 узла1-ws2 .... узла1-ws5 узла2-ws1 узла2-ws2 ... узла3-ws5. Это позволяет кластеру работать на полную мощность (15 одновременных сборок), однако рано или поздно каждый узел будет иметь рабочие пространства / ws / node1-ws1, / ws / node1-ws2, .... / ws / node3-ws5. И это проблема, потому что она будет заполнять диск.

Поэтому мне нужно предоставить список ресурсов, например, $ NODE-ws1 $ NODE-ws2 ... $ NODE-ws5. Это устранит избыточные рабочие пространства и все еще позволит кластеру работать на полную мощность (= 15 сборок одновременно). $ NODE - это переменные окружения внутри модуля.

Жаль, что плагин блокируемых ресурсов не поддерживает экстраполяцию переменных, поэтому он использует $ NODE-ws1 в качестве литерального значения вместо его расширения, например, на. node2-ws1. К сожалению, разработчики плагинов просто не могут или не будут добавлять эту функцию в плагин в течение 2-3 лет, поэтому этот путь выглядит как тупик.

Затем я попытался использовать поле groovy для запросите переменную NODE env из запущенного модуля. Тем не менее, я нашел только примеры, перебирающие все запущенные модули, например.

Jenkins.instance.slaves.find { agent ->
   // do something
}

Это нехорошо, потому что мне нужно найти одного агента / модуля, выполняющего эту специфицированную c сборку задания. Итак, вопрос в том, как получить имя этого специфицированного c только раба?

Спасибо, что прочитали его до сих пор. Btw. Я открыт для предложений, поэтому, если проблема может быть решена по-другому (эффективно), я бы с удовольствием принял ее.

...