我正在使用Jenkins Build Flow插件来实现并行化。 Groovy DSL执行某些文件操作。即使选项Restrict where this project can be run
设置为在特定从站上运行作业,DSL也会在主站上运行。这不是预期的。
有人能告诉我如何限制DSL在指定的奴隶上运行吗?即使有办法我们可以通过DSL访问从属文件系统,这应该可行。
一般情况下,我们如何使用Groovy从Jenkins master访问节点slave上的文件?
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时,上面的代码失败。
答案 0 :(得分:12)
Groovy DSL总是在master上执行(在tomcats目录中)。即使您安装节点标签参数插件并设置要在某些specyfic slave上执行的构建作业。如果您希望从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)
更简单的方法是在specyfic slave上运行的Execute Groovy脚本(不在构建流程作业中)执行下游作业中的文件操作。您必须安装节点插件并将从属名称作为DSL脚本中的参数传递: build(“jobA”,paramNode:“nodename”)
答案 1 :(得分:0)
Workflow Plugin "最初受Build Flow Plugin" 的启发,在its tutorial中有以下部分:
自2014年1月27日起,Build Flow Plugin的评论中的使用奴隶
参数可以是从属名称,也可以是单个标签,甚至是标签表达式,例如:
node('unix && 64bit') { // as before }
The following question未得到答复:
有没有办法指定特定构建应该在哪里运行?通过提供标签或节点名称。
答案 2 :(得分:0)
安装NodeLabel parameter plugin。它提供参数选项标签。
然后,您可以在DSL脚本中使用此参数来传递节点名称或值。