nas*_*ras 5 file-io groovy jenkins jenkins-plugins jenkins-build-flow
我正在使用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")
}
Run Code Online (Sandbox Code Playgroud)
工作空间位于从属节点上,但是当我尝试将FileSet打开到远程FilePath时,上面的代码失败了.
jus*_*per 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)
Run Code Online (Sandbox Code Playgroud)
更简单的方法是在specyfic slave上运行的Execute Groovy脚本(不是构建流程作业)中的下游作业中执行文件操作.您必须安装节点插件并将slave名称作为DSL脚本中的参数传递:build("jobA",paramNode:"nodename")