From 0bf3106283325b88a4e78f6052d573e6c6e6fade Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 20 Nov 2020 16:04:27 +0800 Subject: [PATCH 1/2] Add an API to run script on agent --- README.md | 4 +++ .../pipeline/restful/api/InstanceAPI.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/README.md b/README.md index 81ae7a7..695df3d 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,7 @@ Sample response: } } ``` + +## Run script on agent + +`curl http://localhost/jenkins/instance/run?agent=&script=println%20"uname%20-a".execute().text -X POST` diff --git a/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java b/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java index 82d8f63..ec19084 100644 --- a/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java +++ b/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java @@ -2,9 +2,12 @@ import com.cloudbees.workflow.util.ServeJson; import hudson.Extension; +import hudson.model.Computer; import hudson.model.RootAction; import hudson.model.User; +import hudson.remoting.VirtualChannel; import hudson.util.HttpResponses; +import hudson.util.RemotingDiagnostics; import jenkins.model.Jenkins; import jenkins.model.identity.IdentityRootAction; import jenkins.security.ApiTokenProperty; @@ -167,6 +170,32 @@ public void setWriteListener(WriteListener writeListener) { rsp.setContentLength(result.length()); rsp.getWriter().write(result); } + + @RequirePOST + public HttpResponse doRun(@QueryParameter String script, @QueryParameter String agent) { + if (!Jenkins.get().hasPermission(Jenkins.ADMINISTER)) { + return HttpResponses.errorJSON("no permission to execute script on '" + agent + "'"); + } + + Computer computer = Jenkins.get().getComputer(agent); + if (computer == null) { + return HttpResponses.errorJSON("cannot find agent: " + agent); + } + + VirtualChannel channel = computer.getChannel(); + if (channel == null) { + return HttpResponses.errorJSON(agent + " is offline"); + } + + JSONObject output = new JSONObject(); + try { + output.put("result", RemotingDiagnostics.executeGroovy(script, channel)); + } catch (IOException | InterruptedException e) { + return HttpResponses.errorJSON(e.getMessage()); + } + + return HttpResponses.okJSON(output); + } } class JenkinsInstance { From 38142bde031dc2504b7e9a3c8ff1ca236f6ba118 Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 20 Nov 2020 22:06:18 +0800 Subject: [PATCH 2/2] Take script both from form or query --- .../plugins/pipeline/restful/api/InstanceAPI.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java b/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java index ec19084..bb35c36 100644 --- a/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java +++ b/src/main/java/io/jenkins/plugins/pipeline/restful/api/InstanceAPI.java @@ -172,11 +172,20 @@ public void setWriteListener(WriteListener writeListener) { } @RequirePOST - public HttpResponse doRun(@QueryParameter String script, @QueryParameter String agent) { + public HttpResponse doRun(@QueryParameter String script, @QueryParameter String agent, StaplerRequest req) { if (!Jenkins.get().hasPermission(Jenkins.ADMINISTER)) { return HttpResponses.errorJSON("no permission to execute script on '" + agent + "'"); } + try { + JSONObject data = req.getSubmittedForm(); + + script = script == null ? data.getString("script") : script; + agent = agent == null ? data.getString("agent") : agent; + } catch (ServletException e) { + e.printStackTrace(); + } + Computer computer = Jenkins.get().getComputer(agent); if (computer == null) { return HttpResponses.errorJSON("cannot find agent: " + agent); @@ -189,7 +198,7 @@ public HttpResponse doRun(@QueryParameter String script, @QueryParameter String JSONObject output = new JSONObject(); try { - output.put("result", RemotingDiagnostics.executeGroovy(script, channel)); + output.put("message", RemotingDiagnostics.executeGroovy(script, channel)); } catch (IOException | InterruptedException e) { return HttpResponses.errorJSON(e.getMessage()); }