Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins(linux)和EnvInject对节点(Windows)文件的访问_Linux_Windows_Jenkins_Groovy - Fatal编程技术网

Jenkins(linux)和EnvInject对节点(Windows)文件的访问

Jenkins(linux)和EnvInject对节点(Windows)文件的访问,linux,windows,jenkins,groovy,Linux,Windows,Jenkins,Groovy,我已经在Linux主机上安装了Jenkins,并在Jenkins安装中添加了一个Windows节点。通过将标签应用于节点,我可以控制在哪个节点上构建项目 我还在Jenkins服务器上使用EnvInject插件,并且(在多次尝试使用脚本内容之后)使用Groovy脚本准备版本号信息,以便在正在构建的项目中使用,并在Jenkins构建流中能够跟踪构建的版本。对于后者,我需要读取一个存储版本号的文件。虽然当主机与从机(Windows计算机)相同时,此功能有效,但当项目构建在不同的Windows从机上时,

我已经在Linux主机上安装了Jenkins,并在Jenkins安装中添加了一个Windows节点。通过将标签应用于节点,我可以控制在哪个节点上构建项目

我还在Jenkins服务器上使用EnvInject插件,并且(在多次尝试使用脚本内容之后)使用Groovy脚本准备版本号信息,以便在正在构建的项目中使用,并在Jenkins构建流中能够跟踪构建的版本。对于后者,我需要读取一个存储版本号的文件。虽然当主机与从机(Windows计算机)相同时,此功能有效,但当项目构建在不同的Windows从机上时,此功能不起作用

然后,我创建了一个单独的项目来调试正在发生的事情,并以以下Groovy脚本结束:

def envVars = Thread.currentThread()?.executable.parent.builds[0].properties.get('envVars')
def line=""
def separator='/'
if (envVars['OS'] == 'Windows_NT') {
    separator = '\\'
}
// Where am I?
println new File(".").getCanonicalPath().toString()
new File(envVars['WORKSPACE'] + separator + 'Input.txt').withReader { line = it.readLine() }
return [
    SYSTEM: envVars['OS'],
    WS: envVars['WORKSPACE'] + separator + 'input.txt',
    TESTVAR: line,
]
下面是这个的输出:

Started by user jadaml
[EnvInject] - Loading node environment variables.
Building remotely on Obsidian (Win32 Win32NT Win64 .NET WinNT Windows Win DotNet) in workspace D:\Jenkins\workspace\Rights Test
[EnvInject] - Executing scripts and injecting environment variables after the SCM step.
[EnvInject] - Evaluating the Groovy script content
/var/lib/jenkins
[EnvInject] - [ERROR] - Problems occurs on injecting env vars defined in the build wrapper: org.jenkinsci.lib.envinject.EnvInjectException: Failed to evaluate the script. java.io.FileNotFoundException: D:\Jenkins\workspace\Rights Test\Input.txt (No such file or directory). See system log for more info
Finished: FAILURE
正如您所看到的,
println新文件(“.”).getCanonicalPath().toString()
行打印了
/var/lib/jenkins
,指示Gradle脚本正在主机上运行,而不是在Windows从机上运行

在这一点上,它归结为一个问题,一个项目可能在运行Jenkins服务器的另一台机器上构建,并且可能必须读取远程文件,除非它在主机上运行。 我如何克服这个限制


我读了这本书,感觉自己正在乘坐“如此近但如此远”的过山车。

在互联网上摸索和搜索后,我得出结论,在我的情况下,我需要对象,更准确地说,是为了获得一个表示从机上远程文件的文件对象

在我终于能够看到我需要的最后一件作品之后,我已经找到了。这是我最后的实验脚本:

import hudson.*
import jenkins.model.*

def envVars = Thread.currentThread()?.executable.parent.builds[0].properties.get('envVars')
def line=''
def separator='/'
// Needs to be tested if this works on 'master'
def channel = null

if (envVars['OS'] == 'Windows_NT') {
    separator = '\\'
}

if (envVars['NODE_NAME'] != 'master') {
    channel = Jenkins.instance.getComputer(envVars['NODE_NAME']).channel
}

def file = new FilePath(channel, envVars['WORKSPACE'] + separator + 'input.txt')

// Just read the first line
file.read().withReader { line = it.readLine() }

return [
    TESTVAR: line,
]
input.txt
文件是在工作区中手动创建的,其中只有一行是“Wazup!”这可以在以后的构建作业中从TESTVAR变量中读取

附言: 很抱歉提出了一个可能重复的问题,但最后我非常沮丧,甚至没有意识到我错过了什么

另一件事是,EnvInject的Groovy工作原理似乎与。。。无论他们在哪里编写这个Groovy脚本:有些变量不可用,比如
env
变量