Доступ к файлам на подчиненном узле от мастера Jenkins с помощью Groovy
Я использую плагин Jenkins Build Flow для достижения распараллеливания. Groovy DSL выполняет определенные файловые операции. Хотя вариант Restrict where this project can be run
настроен для запуска задания на определенном ведомом устройстве, DSL работает на ведущем устройстве. Это не предназначено.
Может кто-нибудь сказать мне, как я могу ограничить запуск DSL на указанном ведомом устройстве? Даже если есть способ получить доступ к подчиненной файловой системе через DSL, это должно сработать.
В общем, как мы можем получить доступ к файлам на подчиненном узле от мастера Jenkins, используя Groovy?
def fp = new hudson.FilePath(build.workspace.channel, "/srv/jenkins/workspace/myworkspace_on_slave_node")
assert fp.exists() // returns true :)
def ant = new AntBuilder()
if (fp != null) {
def scanner = ant.fileScanner { // fails here :(, says /srv/jenkins/workspace/myworkspace_on_slave_node not found
// grab ALL files requested to be run
fileset(dir: "$fp", includes: "**/*.java")
}
// now lets iterate over - print - and count test files
int numFiles = 0
for (f in scanner) {
println("Found file $f")
numFiles++
}
println("Total files $numFiles")
}
Рабочая область находится на подчиненном узле, но приведенный выше код завершается ошибкой, когда я пытаюсь открыть FileSet для удаленного FilePath.
4 ответа
Groovy DSL всегда выполняется на master (в каталоге tomcats). Даже если вы установите плагин Node Label Parameter и настроите выполнение сборки на каком-то конкретном ведомом устройстве. Если вы хотите получить доступ из Groovy DSL к рабочему пространству задания на ведомом устройстве, вы можете использовать канал. Вот мой пример создания файла в рабочей области потока сборки:
if(build.workspace.isRemote()){
channel = build.workspace.channel
}
String fp = build.workspace.toString() + "\\" + "newfile.txt"
newFile = new hudson.FilePath(channel, fp)
newFile.write("xyz", null)
Более простой способ - выполнение операций с файлами в последующих заданиях в скрипте Execute Groovy (не в задании потока сборки), выполняемом на конкретном подчиненном устройстве. Вы должны установить плагин узла и передать имя ведомого в качестве параметра в сценарии DSL: build("jobA", paramNode: "nodename")
Это почти замена для чтения содержимого файла с ведомого устройства в Groovy:
def workspace = build.getEnvVars()["WORKSPACE"];
def nodeChannel = build.workspace.channel;
String svnVersion = new hudson.FilePath(nodeChannel, workspace + '/relative/path/svn-revision').readToString();
Где
relative/path/svn-revision
это файл, созданный удаленно (на ведомом устройстве).
Для локальных файлов эквивалент будет:
svnVersion = new File(workspace, 'artifacts/svn-revision').text;
. Так что немного короче, но ненамного.
Как отмечали другие, сценарии Groovy всегда выполняются на главном сервере, а не на подчиненном сервере. Следовательно, вы должны использовать
hudson.FilePath
и используйте команды, которые понимают FilePath API.
Есть также
act(FileCallable)
который, кажется, запускает команды File на ведомом устройстве, но не пробовал этого.
Установите плагин параметров NodeLabel. Предоставляет параметр параметра Label.
Затем вы можете использовать этот параметр в вашем скрипте DSL для передачи имени или значения узла.
Плагин Workflow "Первоначально вдохновленный плагином Build Flow " имеет следующий раздел в своем руководстве:
Использование рабов
Параметр может быть именем ведомого, или одной меткой, или даже выражением метки, например:
node('unix && 64bit') { // as before }
Следующий вопрос в комментариях к плагину Build Flow остается без ответа с 27 января 2014 года:
Александр Увижев говорит:
Есть ли способ указать, где должна выполняться конкретная сборка? Предоставляя метку или имя узла.