Как Jenkins выполняет код на удаленных подчиненных? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть фрагмент кода для перечисления всех файлов в каталоге /tmp на двух узлах, например так (синтаксис в скрипте):

stage('Demo') {
    node('node1') {
        println new File('/tmp/').listFiles().toList()
    }

    node('node2') {
        println new File('/tmp/').listFiles().toList()
    }
}

Однако результаты на обоих узлах идентичны.Похоже, что код выполняется на ведущем устройстве, только функция println выполняется на 2 узлах.

Вопрос в следующем: это правда?и если да, то как узнать, выполняется ли код на главном или подчиненном устройстве?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Все шаги Jenkins, которые используют контекст node, будут выполняться на этих агентах (из блоков node). Например, sh 'ls -1 /tmp/' будет запускать ls -1 /tmp/ command на том агенте, который находится в блоке. Но фактический метод Groovy sh и код JVM выполняются на мастере Jenkins.

Все Groovy внутри конвейера Jenkins выполняются на мастере особым образом преобразованным из плагина Pipeline Groovy Plugin . Следовательно, почему new File('/tmp') выполняется на главном сервере, а не на агенте. Если бы вы выполняли свой конвейер, используя изолированную программную среду безопасности, вы бы получили исключение безопасности, потому что new File по умолчанию запрещено. Фактически, любой из нормальных методов стиля JVM запрещен. Например, не было бы ужасно, если бы конвейер мог вызвать System.exit(0) и закрыть Jenkins для всех пользователей?

Похожие вопросы:

0 голосов
/ 12 сентября 2018

Конвейерный DSL-контекст работает на главном узле, даже если вы записываете node('someAgentName') в свой конвейер. new File будет работать только на мастере.

Но вы можете прочитать данные из файла через sh () . Что-то вроде:

def list = sh(returnStdout: true, script: 'ls').trim()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...