Skip to content

Commit

Permalink
Merge pull request #17 from jenkinsci/workflow-compatibility
Browse files Browse the repository at this point in the history
[JENKINS-28642] Workflow compatibility for embeddable build status
  • Loading branch information
mgedmin committed Nov 12, 2015
2 parents 5e976a6 + fe62581 commit b94c682
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 27 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -1,2 +1,5 @@
target
work
.idea/
*.iml
.eclipse
11 changes: 10 additions & 1 deletion pom.xml
Expand Up @@ -3,7 +3,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.480.3</version>
<version>1.580.1</version>
</parent>

<artifactId>embeddable-build-status</artifactId>
Expand Down Expand Up @@ -41,4 +41,13 @@
<url>http://github.com/jenkinsci/git-plugin</url>
<tag>HEAD</tag>
</scm>
<!-- Workflow plugin imports are used to test compatibility -->
<dependencies>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-aggregator</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
17 changes: 4 additions & 13 deletions src/main/java/org/jenkinsci/plugins/badge/BadgeAction.java
@@ -1,30 +1,21 @@
package org.jenkinsci.plugins.badge;

import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.util.HttpResponses;
import hudson.util.IOUtils;
import hudson.model.Job;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.QueryParameter;

import javax.servlet.ServletException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;

/**
* @author Kohsuke Kawaguchi
*/
public class BadgeAction implements Action {
private final BadgeActionFactory factory;
public final AbstractProject project;

public BadgeAction(BadgeActionFactory factory, AbstractProject project) {
public final Job project;

public BadgeAction(BadgeActionFactory factory, Job project) {
this.factory = factory;
this.project = project;
}
Expand Down
@@ -1,10 +1,10 @@
package org.jenkinsci.plugins.badge;

import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.BallColor;
import hudson.model.TransientProjectActionFactory;
import hudson.model.Job;
import jenkins.model.TransientActionFactory;

import java.io.IOException;
import java.util.Collection;
Expand All @@ -14,7 +14,7 @@
* @author Kohsuke Kawaguchi
*/
@Extension
public class BadgeActionFactory extends TransientProjectActionFactory {
public class BadgeActionFactory extends TransientActionFactory<Job> {

private final ImageResolver iconResolver;

Expand All @@ -23,7 +23,12 @@ public BadgeActionFactory() throws IOException {
}

@Override
public Collection<? extends Action> createFor(AbstractProject target) {
public Class<Job> type() {
return Job.class;
}

@Override
public Collection<? extends Action> createFor(Job target) {
return Collections.singleton(new BadgeAction(this,target));
}

Expand Down
12 changes: 6 additions & 6 deletions src/main/java/org/jenkinsci/plugins/badge/PublicBadgeAction.java
Expand Up @@ -25,9 +25,9 @@

import hudson.Extension;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.Run;
import hudson.model.UnprotectedRootAction;
import hudson.model.AbstractProject;
import hudson.security.ACL;
import hudson.security.Permission;
import hudson.security.PermissionScope;
Expand Down Expand Up @@ -95,18 +95,18 @@ public HttpResponse doIcon(StaplerRequest req, StaplerResponse rsp, @QueryParame
Run run = getRun(job, build);
return iconResolver.getImage(run.getIconColor(), style);
} else {
AbstractProject<?, ?> project = getProject(job);
Job<?, ?> project = getProject(job);
return iconResolver.getImage(project.getIconColor(), style);
}
}

private AbstractProject<?, ?> getProject(String job) {
AbstractProject<?, ?> p;
private Job<?, ?> getProject(String job) {
Job<?, ?> p;

// as the user might have ViewStatus permission only (e.g. as anonymous) we get get the project impersonate and check for permission after getting the project
SecurityContext orig = ACL.impersonate(ACL.SYSTEM);
try {
p = Jenkins.getInstance().getItemByFullName(job, AbstractProject.class);
p = Jenkins.getInstance().getItemByFullName(job, Job.class);
} finally {
SecurityContextHolder.setContext(orig);
}
Expand All @@ -125,7 +125,7 @@ public HttpResponse doIcon(StaplerRequest req, StaplerResponse rsp, @QueryParame
// as the user might have ViewStatus permission only (e.g. as anonymous) we get get the project impersonate and check for permission after getting the project
SecurityContext orig = ACL.impersonate(ACL.SYSTEM);
try {
run = Jenkins.getInstance().getItemByFullName(job, AbstractProject.class).getBuildByNumber(Integer.parseInt(build));
run = Jenkins.getInstance().getItemByFullName(job, Job.class).getBuildByNumber(Integer.parseInt(build));
} finally {
SecurityContextHolder.setContext(orig);
}
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/jenkinsci/plugins/badge/RunBadgeAction.java
@@ -1,7 +1,7 @@
package org.jenkinsci.plugins.badge;

import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Job;
import hudson.model.Run;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
Expand All @@ -10,12 +10,12 @@
public class RunBadgeAction implements Action {
private final RunBadgeActionFactory factory;
public final Run run;
public final AbstractProject project;
public final Job project;

public RunBadgeAction(RunBadgeActionFactory factory, Run run) {
this.factory = factory;
this.run = run;
this.project = (AbstractProject)run.getParent();
this.project = run.getParent();
}

public String getIconFileName() {
Expand Down
@@ -0,0 +1,62 @@
package org.jenkinsci.plugins.badge;


import hudson.security.GlobalMatrixAuthorizationStrategy;
import hudson.security.SecurityRealm;
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.recipes.PresetData;


/**
* Just the fun bits: check that actions register correctly
*/
public class WorkflowBadgeActionTest {

@Rule
public JenkinsRule j = new JenkinsRule();

@PresetData(PresetData.DataSet.NO_ANONYMOUS_READACCESS)
@Test
public void authenticatedAccess() throws Exception {
WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("println('hello')"));

JenkinsRule.WebClient wc = j.createWebClient();
wc.login("alice", "alice");

wc.goTo("buildStatus/icon?job=wf", "image/svg+xml");
job.setQuietPeriod(0);
job.scheduleBuild();
j.waitUntilNoActivityUpTo(5000);
wc.goTo("buildStatus/icon?job=wf&build=1", "image/svg+xml");
}

@Test
public void anonymousViewStatusAccess() throws Exception {
// Allows anonymous access at security realm level
final SecurityRealm realm = j.createDummySecurityRealm();
j.jenkins.setSecurityRealm(realm);
GlobalMatrixAuthorizationStrategy auth = new GlobalMatrixAuthorizationStrategy();
auth.add(PublicBadgeAction.VIEW_STATUS, "anonymous");
j.getInstance().setSecurityRealm(realm);
j.getInstance().setAuthorizationStrategy(auth);

WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("println('hello')"));
JenkinsRule.WebClient wc = j.createWebClient();
wc.goTo("buildStatus/icon?job=wf&", "image/svg+xml");
}

@PresetData(PresetData.DataSet.ANONYMOUS_READONLY)
@Test
public void anonymousRead() throws Exception {
WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("println('hello')"));
JenkinsRule.WebClient wc = j.createWebClient();
wc.goTo("buildStatus/icon?job=wf&", "image/svg+xml");
}
}

0 comments on commit b94c682

Please sign in to comment.