Skip to content

Commit

Permalink
JENKINS-38670 move tests, bugfix template not showing up
Browse files Browse the repository at this point in the history
  • Loading branch information
Dan Alvizu committed Dec 6, 2016
1 parent 8ef34e2 commit d0d2352
Show file tree
Hide file tree
Showing 3 changed files with 236 additions and 210 deletions.
@@ -1,50 +1,50 @@
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt">
<div class="build-card rounded {{build.status}} {{#if project.disabled}}disabled{{/if}}">
<div class="header">
<a href="${rootURL}/{{build.url}}" title="{{project.name}}">
{{#unless build.isPending}}
<div class="build-card rounded {{build.status}} {{#if project.disabled}}disabled{{/if}}">
<div class="header">
<a href="${rootURL}/{{build.url}}" title="{{project.name}}">
{{#unless build.isPending}}
{{#unless build.isReadyToBeManuallyBuilt}}
{{#if build.displayName}}
{{build.displayName}}
{{else}}
#{{build.number}}
{{/if}}
{{#if build.displayName}}
{{build.displayName}}
{{else}}
#{{build.number}}
{{/if}}
{{/unless}}
{{/unless}}
{{#if project.displayName}}
{{/unless}}
{{#if project.displayName}}
{{project.displayName}}
{{else}}
{{else}}
{{project.name}}
{{/if}}
</a>
</div>
<div class="build-info">
<ul>
{{#if build.startDate}}
<li class="build-time" title="Start date: {{build.startDate}} {{build.startTime}}">{{build.startDate}} {{build.startTime}}</li>
{{else}}
<li class="build-time"><abbr title="Not Applicable">N/A</abbr></li>
{{/if}}
{{/if}}
</a>
</div>
<div class="build-info">
<ul>
{{#if build.startDate}}
<li class="build-time" title="Start date: {{build.startDate}} {{build.startTime}}">{{build.startDate}} {{build.startTime}}</li>
{{else}}
<li class="build-time"><abbr title="Not Applicable">N/A</abbr></li>
{{/if}}

{{#if build.isBuilding}}
<li class="build-duration" title="Build duration: {{build.duration}}">{{build.duration}}</li>
{{else}}
{{#if build.isBuilding}}
<li class="build-duration" title="Build duration: {{build.duration}}">{{build.duration}}</li>
{{else}}
{{#if build.isComplete}}
<li class="build-duration" title="Build duration: {{build.duration}}">{{build.duration}}</li>
{{else}}
<li class="build-duration"><abbr title="Not Applicable">N/A</abbr></li>
{{/if}}
{{/if}}
{{/if}}

{{#if build.userId}}
<li class="build-user" title="User: {{build.userId}}">{{build.userId}}</li>
{{/if}}
</ul>
</div>
<div class="build-actions">
{{#unless project.disabled}}
<div class="status-bar" id="status-bar-{{id}}">
{{#if build.isBuilding}}
{{#if build.userId}}
<li class="build-user" title="User: {{build.userId}}">{{build.userId}}</li>
{{/if}}
</ul>
</div>
<div class="build-actions">
{{#unless project.disabled}}
<div class="status-bar" id="status-bar-{{id}}">
{{#if build.isBuilding}}
<div onclick="buildPipeline.fillDialog('${app.rootUrl}{{build.url}}console', 'Console output for {{project.name}} #{{build.number}}')">
<table class="progress-bar" align="center">
<tbody>
Expand All @@ -55,89 +55,90 @@
</tbody>
</table>
</div>
{{/if}}
</div>
{{/if}}
</div>

<div class="icons" id="icons-{{id}}">
{{#if project.parameters.length}}
<div class="icons" id="icons-{{id}}">
{{#if project.parameters.length}}
<j:set var="hasParameterIconUrl" value="${rootURL}/plugin/build-pipeline-plugin/images/has-parameter.png" />
<img title="This job has parameters" alt="This job has parameters" src="${hasParameterIconUrl}"/>
{{/if}}
{{#unless build.isPending}}
{{/if}}
{{#unless build.isPending}}
{{#unless build.isReadyToBeManuallyBuilt}}
<j:set var="consoleOutputIconUrl" value="${rootURL}/images/16x16/terminal.png" />
<j:choose>
<j:when test="${from.newWindowConsoleOutputLinkStyle}">
<a href="${rootURL}/{{build.url}}console" target="_blank">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</a>
</j:when>
<j:when test="${from.thisWindowConsoleOutputLinkStyle}">
<a href="${rootURL}/{{build.url}}console">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</a>
</j:when>
<j:otherwise>
<span onclick="buildPipeline.fillDialog('${app.rootUrl}{{build.url}}console', 'Console output for {{project.name}} #{{build.number}}')">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</span>
</j:otherwise>
</j:choose>
{{/unless}}
<j:set var="consoleOutputIconUrl" value="${rootURL}/images/16x16/terminal.png" />
<j:choose>
<j:when test="${it.newWindowConsoleOutputLinkStyle}">
<a href="${rootURL}/{{build.url}}console" target="_blank">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</a>
</j:when>
<j:when test="${it.thisWindowConsoleOutputLinkStyle}">
<a href="${rootURL}/{{build.url}}console">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</a>
</j:when>
<j:otherwise>
<span onclick="buildPipeline.fillDialog('${app.rootUrl}{{build.url}}console', 'Console output for {{project.name}} #{{build.number}}')">
<img title="console" alt="console" src="${consoleOutputIconUrl}" />
</span>
</j:otherwise>
</j:choose>
{{/unless}}
{{/unless}}

{{#if build.isRerunnable}}
{{#if build.isRerunnable}}
{{#if build.isSuccess}}
{{#if ${!from.triggerOnlyLatestJob}}}
<j:if test="${from.hasBuildPermission()}">
{{#if ${!it.triggerOnlyLatestJob}}}
<j:if test="${it.hasBuildPermission()}">
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.rerunBuild({{id}}, '{{build.extId}}', [{{build.dependencyIds}}])">
<img title="re-run" alt="re-run" src="${rootURL}/images/16x16/redo.png" />
</span>
</j:if>
{{/if}}
{{else}}
{{#if ${from.triggerOnlyLatestJob}}}
{{#if build.isLatestBuild}}
{{#if build.isUpstreamBuildLatest}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.rerunBuild({{id}}, '{{build.extId}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/redo.png" />
</span>
{{/if}}
{{/if}}
{{else}}
{{#if build.isManual}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.triggerBuild({{id}}, '{{upstream.projectName}}', {{upstream.buildNumber}}, '{{project.name}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/clock.png" />
</span>
</j:if>
{{/if}}
{{else}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.rerunBuild({{id}}, '{{build.extId}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/redo.png" />
</span>
{{/if}}
{{/if}}
{{/if}}
{{#if ${it.triggerOnlyLatestJob}}}
{{#if build.isLatestBuild}}
{{#if build.isUpstreamBuildLatest}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.rerunBuild({{id}}, '{{build.extId}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/redo.png" />
</span>
{{/if}}
{{/if}}
{{else}}
{{#if build.isManual}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.triggerBuild({{id}}, '{{upstream.projectName}}', {{upstream.buildNumber}}, '{{project.name}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/clock.png" />
</span>
{{else}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.rerunBuild({{id}}, '{{build.extId}}', [{{build.dependencyIds}}])">
<img title="retry" alt="retry" src="${rootURL}/images/16x16/redo.png" />
</span>
{{/if}}
{{/if}}
{{/if}}
{{/if}}

{{#if build.isReadyToBeManuallyBuilt}}
{{#if ${from.triggerOnlyLatestJob}}}
{{#if build.isUpstreamBuildLatestSuccess}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.triggerBuild({{id}}, '{{upstream.projectName}}', {{upstream.buildNumber}}, '{{project.name}}', [{{build.dependencyIds}}])">
<img title="trigger" alt="trigger" src="${rootURL}/images/16x16/clock.png" />
</span>
{{/if}}
{{#if build.isReadyToBeManuallyBuilt}}
{{#if ${it.triggerOnlyLatestJob}}}
{{#if build.isUpstreamBuildLatestSuccess}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.triggerBuild({{id}}, '{{upstream.projectName}}', {{upstream.buildNumber}}, '{{project.name}}', [{{build.dependencyIds}}])">
<img title="trigger" alt="trigger" src="${rootURL}/images/16x16/clock.png" />
</span>
{{/if}}
{{else}}
<span onclick="buildPipeline.showSpinner({{id}}); buildPipeline.triggerBuild({{id}}, '{{upstream.projectName}}', {{upstream.buildNumber}}, '{{project.name}}', [{{build.dependencyIds}}])">
<img title="trigger" alt="trigger" src="${rootURL}/images/16x16/clock.png" />
</span>
{{/if}}
{{/if}}
</div>
{{/unless}}
{{#if project.disabled}}
{{/if}}
</div>
{{/unless}}
{{#if project.disabled}}
<div class="icons" id="icons-{{id}}">
<span class="disabled"><img src="${rootURL}/images/16x16/warning.png" atl="disabled" title="disabled" /></span>
</div>
{{/if}}
</div>
{{/if}}
</div>
</div>

</j:jelly>
Expand Up @@ -400,7 +400,7 @@ public void testMyUserIdCauseConversion() throws Exception {
* not set. This doesn't solve the root cause and it't only intended to make
* our tests succeed.
*/
static class BuildPipelineViewFactory {
public static class BuildPipelineViewFactory {
public static BuildPipelineView getBuildPipelineView(final String bpViewName, final String bpViewTitle, final ProjectGridBuilder gridBuilder,
final String noOfBuilds, final boolean triggerOnlyLatestJob) {
return new BuildPipelineView(bpViewName, bpViewTitle, gridBuilder, noOfBuilds, triggerOnlyLatestJob, null) {
Expand All @@ -413,112 +413,4 @@ public ItemGroup<? extends TopLevelItem> getOwnerItemGroup() {
}
}

@Test
@Issue("JENKINS-30801")
public void testRetriggerSuccessfulBuild() throws Exception {
final FreeStyleProject upstreamBuild = jenkins.createFreeStyleProject("upstream");
final FreeStyleProject downstreamBuild = jenkins.createFreeStyleProject("downstream");
upstreamBuild.getPublishersList().add(new BuildPipelineTrigger("downstream", null));
downstreamBuild.getBuildersList().add(new TestBuilder()
{
@Override
public boolean perform(AbstractBuild<?, ?> abstractBuild, Launcher launcher, BuildListener buildListener)
throws InterruptedException, IOException
{
abstractBuild.addAction(new MockAction());
return true;
}
});

// Important; we must do this step to ensure that the dependency graphs
// are updated
Hudson.getInstance().rebuildDependencyGraph();

// mock the upstream build as being caused by SCM trigger
Cause mockScmTriggerCause = new SCMTrigger.SCMTriggerCause("mock");
upstreamBuild.scheduleBuild2(0, mockScmTriggerCause);
jenkins.waitUntilNoActivity();

// mock trigget the downstream build as being triggered by upstream
ParametersAction parametersAction = new ParametersAction(
Arrays.asList((ParameterValue)new StringParameterValue("foo", "bar")));
UpstreamCause upstreamCause = new hudson.model.Cause.UpstreamCause(
(Run<?, ?>) upstreamBuild.getLastBuild());
downstreamBuild.scheduleBuild2(0, upstreamCause, parametersAction);
jenkins.waitUntilNoActivity();

BuildPipelineView pipeline = BuildPipelineViewFactory.getBuildPipelineView("pipeline", "",
new DownstreamProjectGridBuilder(upstreamBuild.getFullName()), "1", false);
pipeline.setBuildCard(new StandardBuildCard());
jenkins.getInstance().addView(pipeline);
assertNotNull(downstreamBuild.getLastBuild());
// re-run the build as if we clicked re-run in the UI
pipeline.rerunBuild(downstreamBuild.getLastBuild().getExternalizableId());
jenkins.waitUntilNoActivity();

// MockAction is not copied from one run to another
assertEquals(1, downstreamBuild.getLastBuild().getActions(MockAction.class).size());
// upstream cause copied
assertEquals(1, downstreamBuild.getLastBuild().getCauses().size());
// parametersAction copied
assertNotNull(downstreamBuild.getLastBuild().getAction(ParametersAction.class));
StringParameterValue stringParam = (StringParameterValue) downstreamBuild.getLastBuild()
.getAction(ParametersAction.class).getParameter("foo");
assertEquals("bar", stringParam.value);
assertEquals(upstreamCause, downstreamBuild.getLastBuild().getCauses().get(0));
assertEquals(mockScmTriggerCause, upstreamCause.getUpstreamCauses().get(0));
}

@Test
public void testFilterUserIdCause() throws Exception {
final FreeStyleProject upstreamBuild = jenkins.createFreeStyleProject("upstream");
final FreeStyleProject downstreamBuild = jenkins.createFreeStyleProject("downstream");
upstreamBuild.getPublishersList().add(new BuildPipelineTrigger("downstream", null));
// Important; we must do this step to ensure that the dependency graphs
// are updated
Hudson.getInstance().rebuildDependencyGraph();
Cause mockUserIdCause = mock(Cause.UserIdCause.class);
upstreamBuild.scheduleBuild2(0, mockUserIdCause);
jenkins.waitUntilNoActivity();
UpstreamCause upstreamCause = new hudson.model.Cause.UpstreamCause(
(Run<?, ?>) upstreamBuild.getLastBuild());
downstreamBuild.scheduleBuild2(0, upstreamCause);
jenkins.waitUntilNoActivity();

BuildPipelineView pipeline = BuildPipelineViewFactory.getBuildPipelineView("pipeline", "",
new DownstreamProjectGridBuilder(upstreamBuild.getFullName()), "1", false);
pipeline.setBuildCard(new StandardBuildCard());
jenkins.getInstance().addView(pipeline);
assertNotNull(downstreamBuild.getLastBuild());
// re-run the build as if we clicked re-run in the UI
pipeline.rerunBuild(upstreamBuild.getLastBuild().getExternalizableId());
jenkins.waitUntilNoActivity();
assertEquals(2, upstreamBuild.getBuilds().size());
assertNotNull(upstreamBuild.getLastBuild().getCause(Cause.UserIdCause.class));
assertNotSame(upstreamBuild.getLastBuild().getCause(Cause.UserIdCause.class),
mockUserIdCause);
}

public static class MockAction implements Action, Serializable {

private static final long serialVersionUID = 5677631606354259250L;

@Override
public String getIconFileName()
{
return null;
}

@Override
public String getDisplayName()
{
return null;
}

@Override
public String getUrlName()
{
return null;
}
}
}

0 comments on commit d0d2352

Please sign in to comment.