我已经在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 new File(".").getCanonicalPath().toString()
行显示为/var/lib/jenkins
,表明Gradle脚本在主机而不是Windows从属服务器上运行。
此时,它归结为一个问题,即项目 可能在运行Jenkins服务器的另一台计算机上构建,并且可能必须读取远程文件,除非它在主机上运行。 如何解决此限制?
我读过Jenkins java docs,感觉自己正骑着“那么近而到目前为止”的过山车。
答案 0 :(得分:0)
摸索Jenkins java docs并在互联网上搜索后,我得出的结论是,就我而言,我需要FilePath对象,更确切地说是this constructor以获取文件对象,代表从属服务器上的远程文件。
在我终于能够看到我需要的最后一块之后,我进行了搜索并找到了this answer。这是我的实验脚本,最终得到了
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变量中读取。
PS 。: 很抱歉提出一个可能重复的问题,但最后我感到非常沮丧,甚至都没意识到我到底缺少了什么。
另一件事是,似乎EnvInject的Groovy的工作方式与……在编写Groovy脚本的任何地方都略有不同:有些变量不可用,例如env
变量。