Skip to content

Commit 7857c96

Browse files
authored
Rewrite rebuild actions using javascript java injection (#580)
1 parent 0687136 commit 7857c96

File tree

6 files changed

+45
-34
lines changed

6 files changed

+45
-34
lines changed

src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineViewAction.java

+22-8
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import hudson.model.Action;
66
import hudson.model.BallColor;
7-
import hudson.model.ParametersAction;
8-
import hudson.model.ParametersDefinitionProperty;
7+
import hudson.model.Item;
8+
import hudson.model.Queue;
99
import hudson.security.Permission;
1010
import hudson.util.HttpResponses;
11+
import java.io.IOException;
1112
import java.util.concurrent.ExecutionException;
1213
import java.util.concurrent.TimeoutException;
1314
import java.util.logging.Level;
1415
import java.util.logging.Logger;
1516
import net.sf.json.JSONObject;
1617
import org.jenkins.ui.icon.IconSpec;
18+
import org.jenkinsci.plugins.workflow.cps.replay.ReplayAction;
1719
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
1820
import org.kohsuke.stapler.HttpResponse;
1921
import org.kohsuke.stapler.StaplerRequest2;
2022
import org.kohsuke.stapler.WebMethod;
23+
import org.kohsuke.stapler.bind.JavaScriptMethod;
24+
import org.kohsuke.stapler.interceptor.RequirePOST;
2125

2226
public abstract class AbstractPipelineViewAction implements Action, IconSpec {
2327
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -47,14 +51,24 @@ public String getBuildDisplayName() {
4751
return run.getDisplayName();
4852
}
4953

50-
public boolean isParameterized() {
51-
ParametersAction paramAction = run.getAction(ParametersAction.class);
52-
if (paramAction != null && !paramAction.getAllParameters().isEmpty()) {
54+
/**
55+
* Handles the rebuild request using ReplayAction feature
56+
*/
57+
@RequirePOST
58+
@JavaScriptMethod
59+
public boolean doRebuild() throws IOException, ExecutionException {
60+
if (run != null) {
61+
run.checkAnyPermission(Item.BUILD);
62+
ReplayAction replayAction = run.getAction(ReplayAction.class);
63+
Queue.Item item =
64+
replayAction.run2(replayAction.getOriginalScript(), replayAction.getOriginalLoadedScripts());
65+
66+
if (item == null) {
67+
return false;
68+
}
5369
return true;
5470
}
55-
56-
ParametersDefinitionProperty property = run.getParent().getProperty(ParametersDefinitionProperty.class);
57-
return property != null && !property.getParameterDefinitions().isEmpty();
71+
return false;
5872
}
5973

6074
public String getFullBuildDisplayName() {

src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/index.jelly

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22

33
<?jelly escape-by-default='true'?>
4-
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:p="/lib/pipeline-graph-view">
4+
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:l="/lib/layout" xmlns:p="/lib/pipeline-graph-view">
55
<l:layout title="${%Graph} [${it.fullBuildDisplayName}]" type="one-column">
66
<l:main-panel>
77
<div class="jenkins-app-bar">
@@ -26,8 +26,11 @@
2626
<div class="jenkins-app-bar__controls">
2727
<j:if test="${it.buildable}">
2828
<l:hasPermission permission="${it.permission}">
29-
<button id="pgv-rebuild" data-success-message="${%Build scheduled}" data-build-path="../../build"
30-
data-parameterized="${it.parameterized}" class="jenkins-button jenkins-!-build-color">
29+
<j:set var="proxyId" value="${h.generateId()}" />
30+
<st:bind value="${it}" var="rebuildAction${proxyId}"/>
31+
<button id="pgv-rebuild" data-success-message="${%Build scheduled}"
32+
data-proxy-name="rebuildAction${proxyId}"
33+
class="jenkins-button jenkins-!-build-color">
3134
<l:icon src="symbol-play-outline plugin-ionicons-api"/>
3235
${%Rebuild}
3336
</button>

src/main/resources/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction/index.jelly

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22

33
<?jelly escape-by-default='true'?>
4-
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:dd="/lib/layout/dropdowns">
4+
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:l="/lib/layout" xmlns:dd="/lib/layout/dropdowns">
55
<l:layout title="${%Build log} [${it.buildDisplayName}]" type="one-column">
66
<l:main-panel>
77
<div class="jenkins-app-bar">
@@ -24,8 +24,10 @@
2424
<div class="jenkins-app-bar__controls">
2525
<j:if test="${it.buildable}">
2626
<l:hasPermission permission="${it.permission}">
27+
<j:set var="proxyId" value="${h.generateId()}" />
28+
<st:bind value="${it}" var="rebuildAction${proxyId}"/>
2729
<button id="pgv-rebuild" data-success-message="${%Build scheduled}"
28-
data-build-path="../../build" data-parameterized="${it.parameterized}"
30+
data-proxy-name="rebuildAction${proxyId}"
2931
class="jenkins-button jenkins-!-build-color">
3032
<l:icon src="symbol-play-outline plugin-ionicons-api"/>
3133
${%Rebuild}

src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/index.jelly

+5-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
<l:app-bar title="${%Build} ${it.jobDisplayName}">
88
<j:if test="${it.buildable}">
99
<l:hasPermission permission="${it.permission}">
10-
<button id="pgv-rebuild" data-success-message="${%Build scheduled}" data-build-path="../build"
11-
data-parameterized="${it.parameterized}" class="jenkins-button jenkins-!-build-color">
10+
<j:set var="proxyId" value="${h.generateId()}" />
11+
<st:bind value="${it}" var="rebuildAction${proxyId}"/>
12+
<button id="pgv-rebuild" data-success-message="${%Build scheduled}"
13+
data-proxy-name="rebuildAction${proxyId}"
14+
class="jenkins-button jenkins-!-build-color">
1215
<l:icon src="symbol-play-outline plugin-ionicons-api"/>
1316
${%Build}
1417
</button>

src/main/webapp/js/build.js

+7-16
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,12 @@ const rebuildButton = document.getElementById('pgv-rebuild');
33
if (rebuildButton) {
44
rebuildButton.addEventListener('click', event => {
55
event.preventDefault();
6-
const buildUrl = `${rebuildButton.dataset.buildPath}?delay=0sec`
7-
if (rebuildButton.dataset.parameterized === 'true') {
8-
window.location.href = buildUrl
9-
} else {
10-
fetch(buildUrl, {
11-
method: 'post',
12-
headers: crumb.wrap({})
13-
})
14-
.then(res => {
15-
if (!res.ok) {
16-
console.error('Build failed', res);
17-
} else {
18-
window.hoverNotification(rebuildButton.dataset.successMessage, rebuildButton);
19-
}
20-
})
21-
}
6+
const rebuildAction = window[`${rebuildButton.dataset.proxyName}`];
7+
rebuildAction.doRebuild(function (success) {
8+
const result = success.responseJSON;
9+
if (result) {
10+
window.hoverNotification(rebuildButton.dataset.successMessage, rebuildButton);
11+
}
12+
});
2213
})
2314
}

src/test/java/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewRebuildTest.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,7 @@ public void rebuildButtonRedirectsForParameterizedJob() throws Exception {
4141

4242
HtmlPage page = webClient.getPage(run, new PipelineGraphViewAction(run).getUrlName());
4343
HtmlPage newPage = page.getElementById("pgv-rebuild").click();
44-
assertEquals(
45-
j.getURL() + run.getParent().getUrl() + "build?delay=0sec",
46-
newPage.getBaseURL().toExternalForm());
44+
assertEquals(page.getBaseURL(), newPage.getBaseURL());
4745
}
4846
}
4947
}

0 commit comments

Comments
 (0)