mirror of
https://github.com/jenkinsci/jenkins.git
synced 2026-11-10 10:36:21 +00:00
Extension point for adding actions into build page
This commit is contained in:
1 parent
7609248d05
commit
33e0df78b0
4 files changed
+46
-24
No files matched your search
@@ -884,26 +884,7 @@ public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends Abs
|
||||
public Calendar due() {
|
||||
return getTimestamp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all transient action for this build
|
||||
*
|
||||
*/
|
||||
protected List<Action> createTransientActions() {
|
||||
Vector<Action> ta = new Vector<Action>();
|
||||
for (TransientBuildActionFactory tpaf : TransientBuildActionFactory.all())
|
||||
ta.addAll(Util.fixNull(tpaf.createFor(this)));
|
||||
return ta;
|
||||
}
|
||||
|
||||
// commented out until fixed problem with adding actions, see discussion under https://github.com/jenkinsci/jenkins/pull/421
|
||||
/* @Override
|
||||
public List<Action> getActions() {
|
||||
List<Action> actions = new CopyOnWriteArrayList<Action>(super.getActions());
|
||||
actions.addAll(createTransientActions());
|
||||
return actions;
|
||||
}
|
||||
*/
|
||||
|
||||
public List<Action> getPersistentActions(){
|
||||
return super.getActions();
|
||||
}
|
||||
|
||||
@@ -242,6 +242,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
|
||||
* This field is not persisted.
|
||||
*/
|
||||
private volatile transient Runner runner;
|
||||
|
||||
protected transient List<Action> transientActions;
|
||||
|
||||
protected static final ThreadLocal<SimpleDateFormat> ID_FORMATTER =
|
||||
new ThreadLocal<SimpleDateFormat>() {
|
||||
@@ -272,6 +274,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
|
||||
this.timestamp = timestamp;
|
||||
this.state = State.NOT_STARTED;
|
||||
getRootDir().mkdirs();
|
||||
transientActions = updateTransientActions();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -304,7 +307,30 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
|
||||
for (Action a : getActions())
|
||||
if (a instanceof RunAction)
|
||||
((RunAction) a).onLoad();
|
||||
transientActions = updateTransientActions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all transient actions associated with this build
|
||||
*
|
||||
* @return transient actions
|
||||
*/
|
||||
public List<Action> getTransientActions(){
|
||||
return transientActions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create transient actions for this build
|
||||
*
|
||||
* @return transient actions
|
||||
*/
|
||||
public List<Action> updateTransientActions(){
|
||||
List<Action> actions = new ArrayList<Action>();
|
||||
for(TransientBuildActionFactory factory: TransientBuildActionFactory.all()){
|
||||
actions.addAll(factory.createFor(this));
|
||||
}
|
||||
return actions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAction(Action a) {
|
||||
@@ -2059,11 +2085,17 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
|
||||
@Override
|
||||
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
|
||||
Object result = super.getDynamic(token, req, rsp);
|
||||
if (result == null)
|
||||
if (result == null){
|
||||
//check transient actions too
|
||||
for(Action action: transientActions){
|
||||
if(action.getUrlName().equals(token))
|
||||
return action;
|
||||
}
|
||||
// Next/Previous Build links on an action page (like /job/Abc/123/testReport)
|
||||
// will also point to same action (/job/Abc/124/testReport), but other builds
|
||||
// may not have the action.. tell browsers to redirect up to the build page.
|
||||
result = new RedirectUp();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import jenkins.model.Jenkins;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Extension point for inserting transient {@link Action}s into {@link AbstractBuild}s.
|
||||
* Extension point for inserting transient {@link Action}s into {@link Run}s.
|
||||
*
|
||||
* To register your implementation, put {@link Extension} on your subtype.
|
||||
*
|
||||
@@ -20,10 +20,10 @@ public abstract class TransientBuildActionFactory implements ExtensionPoint {
|
||||
/**
|
||||
* Creates actions for the given build.
|
||||
*
|
||||
* @param project for which the action objects are requested. Never null.
|
||||
* @param Build for which the action objects are requested. Never null.
|
||||
* @return Can be empty but must not be null.
|
||||
*/
|
||||
public abstract Collection<? extends Action> createFor(AbstractBuild target);
|
||||
public abstract Collection<? extends Action> createFor(Run target);
|
||||
|
||||
/**
|
||||
* Returns all the registered {@link TransientBuildActionFactory}s.
|
||||
|
||||
@@ -33,6 +33,15 @@ THE SOFTWARE.
|
||||
<j:set var="buildUrl" value="${h.decompose(request)}" />
|
||||
<st:include page="tasks.jelly"/>
|
||||
<st:include page="actions.jelly" />
|
||||
<!-- add transient actions too -->
|
||||
<j:forEach var="action" items="${it.transientActions}">
|
||||
<st:include page="action.jelly" from="${action}" optional="true">
|
||||
<j:if test="${action.iconFileName!=null}">
|
||||
<l:task icon="${h.getIconFilePath(action)}" title="${action.displayName}"
|
||||
href="${h.getActionUrl(it.url,action)}" />
|
||||
</j:if>
|
||||
</st:include>
|
||||
</j:forEach>
|
||||
<j:if test="${it.previousBuild!=null}">
|
||||
<l:task icon="images/24x24/previous.png" href="${buildUrl.previousBuildUrl}" title="${%Previous Build}" contextMenu="false"/>
|
||||
</j:if>
|
||||
|
||||
Reference in new issue
Block a user