В работе jenkins создайте файл с помощью системы groovy в текущей рабочей области

Моя задача - собрать детали node и перечислить их в формате certail. Мне нужно записать данные в файл и сохранить его как файл csv и прикрепить его как артефакты. Но я не могу создать файл с помощью сценариев groovy в jenkins, используя плагин "Execute System Groovy" в качестве шага сборки

import jenkins.model.Jenkins
import hudson.model.User
import hudson.security.Permission
import hudson.EnvVars

EnvVars envVars = build.getEnvironment(listener);

filename = envVars.get('WORKSPACE') + "\\node_details.txt";
//filename = "${manager.build.workspace.remote}" + "\\node_details.txt"
targetFile = new File(filename);
println "attempting to create file: $targetFile"

if (targetFile.createNewFile()) {
    println "Successfully created file $targetFile"
} else {
    println "Failed to create file $targetFile"
}
print "Deleting ${targetFile.getAbsolutePath()} : "
println targetFile.delete()

Полученный результат

attempting to create file: /home/jenkins/server-name/workspace/GET_NODE_DETAILS\node_details.txt
FATAL: No such file or directory
java.io.IOException: No such file or directory
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:947)
    at java_io_File$createNewFile.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at Script1.run(Script1.groovy:13)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:682)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:666)
    at hudson.plugins.groovy.SystemGroovy.perform(SystemGroovy.java:81)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:772)
    at hudson.model.Build$BuildExecution.build(Build.java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.java:160)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:535)
    at hudson.model.Run.execute(Run.java:1732)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:234)

Некоторое время я вижу, как люди используют объект "manager", как я могу получить к нему доступ? Алос какие-нибудь идеи о том, как выполнить задачу?

Ответы

Ответ 1

Проблема Groovy system script всегда запускается в jenkins master node, а рабочая область - это путь к файлу в вашем подчиненном устройстве jenkins node, который не существует в вашем master node.

Вы можете проверить по коду

theDir = new File(envVars.get('WORKSPACE'))
println theDir.exists()

Он вернет false

Если вы не используете ведомый node, он вернет true

Решение. Поскольку мы не можем использовать обычный File, мы должны использовать FilePath http://javadoc.jenkins-ci.org/hudson/FilePath.html

if(build.workspace.isRemote())
{
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/node_details.txt")
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/node_details.txt"))
}

if(fp != null)
{
    fp.write("test data", null); //writing to file
} 

Затем он работает в обоих случаях.

Ответ 2

Я подозреваю, что ошибка была вызвана форматом пути, вы можете попробовать ниже:

изменить

filename = envVars.get('WORKSPACE') + "\\node_details.txt";

к

filename = envVars.get('WORKSPACE') + "/node_details.txt";

Потому что, когда я пытался на моем локальном сервере jenkins, я его успешно выполнил.

enter image description here

enter image description here

Ответ 3

Ответа на этот вопрос @Larry Cai с помощью одной части для записи файла на slave node из System Groovy Script (как он работает на Master Node).

Часть, на которую я отвечаю, - "Некоторое время я вижу, как люди используют объект" manager ", как я могу получить к нему доступ" Это объект, уже доступный в Post Build Groovy Script для доступа к множеству вещей, таких как переменные среды, статус сборки, построение отображаемого имени и т.д.

Цитата из https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin:

"Groovy Script может использовать диспетчер переменных, который предоставляет различные методы для украшения ваших сборников. Эти методы могут быть классифицированы как "белые списки" и "не-белые" методы ".

Чтобы получить к нему доступ, мы можем напрямую вызвать его в post build Groovy script. например

manager.build.setDescription( "пользовательское описание" ) manager.addShortText( "добавьте ваше сообщение здесь" )

Все методы, доступные в объектах менеджера, описаны здесь.

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin#GroovyPostbuildPlugin-Whitelistedmethods