jenkins插件开发:在任何一个单独的方法内,master服务器可以操作子服务器上的文件

在我开发的svn publisher插件中有一处小问题,下面浏览本地文件,一直只能浏览master服务器上的路径文件;但是如果这个项目配置的是在子服务器上进行构建的话,那么这个浏览文件就不对。因此这边我需要找到可以在插件的任何地方都能操作子服务器文件的方法。具体代码如下

 1     @JavaScriptMethod
 2     public JSONObject doFillLoadF(String buildPath) {
 3 
 4         JSONObject jsonObject = new JSONObject();
 5         SVNPublisher sp = getSVNPublisher();
 6         if (SVNPublisherNonNull(sp,jsonObject)) {
 7             return jsonObject;
 8         }
 9         try {
10             Job parentJob = getParentJob();
11             XmlFile file = parentJob.getConfigFile();
12             String name = getNodeName(file.getFile());
13             if(StringUtils.isBlank(name)) {
14                 name = "(master)";
15             }
16             Computer computer = Jenkins.get().getComputer(name);
17             VirtualChannel channel = computer.getChannel();
18             FilePath filePath = new FilePath(channel,buildPath);
19             List<FileEntry> fileEntries = filePath.act(new FileListHandler(buildPath));
20 
21             fileEntries.sort((o1, o2) -> o2.getTypeEnum().compareTo(o1.getTypeEnum()));
22             jsonObject.put("data",fileEntries);
23             jsonObject.put("code","200");
24             jsonObject.put("msg","success");
25         } catch (Exception e) {
26             e.printStackTrace();
27             jsonObject.put("data",new ArrayList<>());
28             jsonObject.put("code","500");
29             jsonObject.put("msg",e.getMessage());
30         }
31         return jsonObject;
32     }
33 
34 public String getNodeName(File file) throws DocumentException, FileNotFoundException {
35     SAXReader reader = new SAXReader();
36     Document doc = reader.read(new FileInputStream(file));
37     List list = doc.selectNodes("/project/assignedNode");
38     if(!list.isEmpty()) {
39         org.dom4j.Node o = (Node) list.get(0);
40         return o.getText();
41     }
42     return null;
43 }
44 
45 
46 private static class FileListHandler implements FileCallable<List<FileEntry>> {
47 
48     private static final long serialVersionUID = 5257877124617853404L;
49 
50     public FileListHandler(String path) {
51         this.path = path;
52     }
53 
54     private String path;
55 
56     @Override
57     public List<FileEntry> invoke(File f, VirtualChannel channel)
58         throws IOException, InterruptedException {
59 
60         return FileUtil.listFile(path, "");
61     }
62 
63     @Override
64     public void checkRoles(RoleChecker checker) throws SecurityException {
65         checker.check(this, Roles.SLAVE);
66     }
67 }

 

Job parentJob = getParentJob(); 请看之前我写的博客。
主要思路是:通过job拿到这个项目的配置文件,然后从配置文件中获取到这个项目是在哪个节点服务器上构建的,如果没有拿到这个节点服务器,默认是在master服务器上构建。操作子服务器上的文件主要还是FilePath这个类。

 

posted @ 2019-10-29 19:13  margo  阅读(149)  评论(0编辑  收藏  举报