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这个类。
本文来自博客园,作者:margo,转载请注明原文链接:https://www.cnblogs.com/ZMargo/articles/11760881.html