Skip to content

Commit 3c56fa7

Browse files
committed
Merge pull request jenkinsci#82 from lanwen/wflow
[FIXES JENKINS-27136] Workflow plugin support
2 parents 2d621d6 + 446925c commit 3c56fa7

File tree

19 files changed

+332
-121
lines changed

19 files changed

+332
-121
lines changed

pom.xml

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
34
<modelVersion>4.0.0</modelVersion>
45

56
<parent>
67
<groupId>org.jenkins-ci.plugins</groupId>
78
<artifactId>plugin</artifactId>
8-
<!--JENKINS-18537-->
9-
<version>1.554.1</version>
9+
<version>1.580</version>
1010
</parent>
1111

1212
<groupId>com.coravy.hudson.plugins.github</groupId>
@@ -41,7 +41,7 @@
4141
<url>https://github.com/jenkinsci/github-plugin</url>
4242
<tag>HEAD</tag>
4343
</scm>
44-
44+
4545
<issueManagement>
4646
<system>JIRA</system>
4747
<url>https://issues.jenkins-ci.org/browse/JENKINS/component/15896</url>
@@ -102,13 +102,7 @@
102102
<dependency>
103103
<groupId>org.jenkins-ci.plugins</groupId>
104104
<artifactId>git</artifactId>
105-
<version>2.0</version>
106-
</dependency>
107-
108-
<dependency>
109-
<groupId>org.eclipse.jgit</groupId>
110-
<artifactId>org.eclipse.jgit</artifactId>
111-
<version>0.12.1</version>
105+
<version>2.4.0</version>
112106
</dependency>
113107

114108
<dependency>
@@ -123,13 +117,6 @@
123117
<version>1.1</version>
124118
</dependency>
125119

126-
<dependency>
127-
<groupId>org.jenkins-ci.plugins</groupId>
128-
<artifactId>multiple-scms</artifactId>
129-
<version>0.2</version>
130-
<optional>true</optional>
131-
</dependency>
132-
133120
<dependency><!-- exists in the core -->
134121
<groupId>org.jenkins-ci.modules</groupId>
135122
<artifactId>instance-identity</artifactId>
@@ -152,13 +139,6 @@
152139
<scope>test</scope>
153140
</dependency>
154141

155-
<dependency>
156-
<groupId>org.jmock</groupId>
157-
<artifactId>jmock-junit4</artifactId>
158-
<version>2.5.1</version>
159-
<scope>test</scope>
160-
</dependency>
161-
162142
<dependency>
163143
<groupId>org.mockito</groupId>
164144
<artifactId>mockito-core</artifactId>
@@ -173,6 +153,20 @@
173153
<scope>test</scope>
174154
</dependency>
175155

156+
<dependency>
157+
<groupId>org.jenkins-ci.plugins.workflow</groupId>
158+
<artifactId>workflow-job</artifactId>
159+
<version>1.4</version>
160+
<scope>test</scope>
161+
</dependency>
162+
163+
<dependency>
164+
<groupId>org.jenkins-ci.plugins.workflow</groupId>
165+
<artifactId>workflow-cps</artifactId>
166+
<version>1.4</version>
167+
<scope>test</scope>
168+
</dependency>
169+
176170
</dependencies>
177171

178172
<build>

src/main/java/com/cloudbees/jenkins/Cleaner.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.cloudbees.jenkins;
22

33
import hudson.Extension;
4-
import hudson.model.AbstractProject;
4+
import hudson.model.Job;
55
import hudson.model.PeriodicWork;
66
import jenkins.model.Jenkins;
77
import org.jenkinsci.plugins.github.GitHubPlugin;
@@ -28,7 +28,7 @@
2828
public class Cleaner extends PeriodicWork {
2929
/**
3030
* Queue contains repo names prepared to cleanup.
31-
* After configure method on job, trigger calls {@link #onStop(AbstractProject)}
31+
* After configure method on job, trigger calls {@link #onStop(Job)}
3232
* which converts to repo names with help of contributors.
3333
*
3434
* This queue is thread-safe, so any thread can write or
@@ -39,7 +39,7 @@ public class Cleaner extends PeriodicWork {
3939
/**
4040
* Called when a {@link GitHubPushTrigger} is about to be removed.
4141
*/
42-
/* package */ void onStop(AbstractProject<?, ?> job) {
42+
/* package */ void onStop(Job<?, ?> job) {
4343
cleanQueue.addAll(GitHubRepositoryNameContributor.parseAssociatedNames(job));
4444
}
4545

@@ -61,7 +61,7 @@ protected void doRun() throws Exception {
6161

6262
URL url = GitHubPlugin.configuration().getHookUrl();
6363

64-
List<AbstractProject> jobs = Jenkins.getInstance().getAllItems(AbstractProject.class);
64+
List<Job> jobs = Jenkins.getInstance().getAllItems(Job.class);
6565
List<GitHubRepositoryName> aliveRepos = from(jobs)
6666
.filter(isAlive()) // live repos
6767
.transformAndConcat(associatedNames()).toList();

src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@
88
import hudson.model.AbstractProject;
99
import hudson.model.Action;
1010
import hudson.model.Item;
11+
import hudson.model.Job;
1112
import hudson.model.Project;
1213
import hudson.triggers.Trigger;
1314
import hudson.triggers.TriggerDescriptor;
1415
import hudson.util.SequentialExecutionQueue;
1516
import hudson.util.StreamTaskListener;
1617
import jenkins.model.Jenkins;
1718
import jenkins.model.Jenkins.MasterComputer;
19+
import jenkins.model.ParameterizedJobMixIn;
20+
import jenkins.triggers.SCMTriggerItem.SCMTriggerItems;
1821
import org.apache.commons.jelly.XMLOutput;
1922
import org.jenkinsci.plugins.github.GitHubPlugin;
2023
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
@@ -37,13 +40,15 @@
3740
import java.util.Set;
3841

3942
import static org.apache.commons.lang3.StringUtils.isEmpty;
43+
import static org.jenkinsci.plugins.github.util.JobInfoHelpers.asParameterizedJobMixIn;
4044

4145
/**
4246
* Triggers a build when we receive a GitHub post-commit webhook.
4347
*
4448
* @author Kohsuke Kawaguchi
4549
*/
46-
public class GitHubPushTrigger extends Trigger<AbstractProject<?, ?>> implements GitHubTrigger {
50+
public class GitHubPushTrigger extends Trigger<Job<?, ?>> implements GitHubTrigger {
51+
4752
@DataBoundConstructor
4853
public GitHubPushTrigger() {
4954
}
@@ -70,7 +75,7 @@ private boolean runPolling() {
7075
PrintStream logger = listener.getLogger();
7176
long start = System.currentTimeMillis();
7277
logger.println("Started on " + DateFormat.getDateTimeInstance().format(new Date()));
73-
boolean result = job.poll(listener).hasChanges();
78+
boolean result = SCMTriggerItems.asSCMTriggerItem(job).poll(listener).hasChanges();
7479
logger.println("Done. Took " + Util.getTimeSpanString(System.currentTimeMillis() - start));
7580
if (result) {
7681
logger.println("Changes found");
@@ -105,7 +110,7 @@ public void run() {
105110
LOGGER.warn("Failed to parse the polling log", e);
106111
cause = new GitHubPushCause(pushBy);
107112
}
108-
if (job.scheduleBuild(cause)) {
113+
if (asParameterizedJobMixIn(job).scheduleBuild(cause)) {
109114
LOGGER.info("SCM changes detected in " + job.getName() + ". Triggering " + name);
110115
} else {
111116
LOGGER.info("SCM changes detected in " + job.getName() + ". Job is already in the queue");
@@ -131,7 +136,7 @@ public Set<GitHubRepositoryName> getGitHubRepositories() {
131136
}
132137

133138
@Override
134-
public void start(AbstractProject<?, ?> project, boolean newInstance) {
139+
public void start(Job<?, ?> project, boolean newInstance) {
135140
super.start(project, newInstance);
136141
if (newInstance && GitHubPlugin.configuration().isManageHooks()) {
137142
registerHooks();
@@ -181,7 +186,7 @@ public DescriptorImpl getDescriptor() {
181186
* Action object for {@link Project}. Used to display the polling log.
182187
*/
183188
public final class GitHubWebHookPollingAction implements Action {
184-
public AbstractProject<?, ?> getOwner() {
189+
public Job<?, ?> getOwner() {
185190
return job;
186191
}
187192

@@ -223,7 +228,8 @@ public static class DescriptorImpl extends TriggerDescriptor {
223228

224229
@Override
225230
public boolean isApplicable(Item item) {
226-
return item instanceof AbstractProject;
231+
return item instanceof Job && SCMTriggerItems.asSCMTriggerItem(item) != null
232+
&& item instanceof ParameterizedJobMixIn.ParameterizedJob;
227233
}
228234

229235
@Override

src/main/java/com/cloudbees/jenkins/GitHubRepositoryNameContributor.java

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@
44
import hudson.Extension;
55
import hudson.ExtensionList;
66
import hudson.ExtensionPoint;
7+
import hudson.Util;
78
import hudson.model.AbstractProject;
89
import hudson.model.EnvironmentContributor;
10+
import hudson.model.Job;
911
import hudson.model.TaskListener;
1012
import hudson.plugins.git.GitSCM;
1113
import hudson.scm.SCM;
1214
import jenkins.model.Jenkins;
15+
import jenkins.triggers.SCMTriggerItem;
16+
import jenkins.triggers.SCMTriggerItem.SCMTriggerItems;
1317
import org.eclipse.jgit.transport.RemoteConfig;
1418
import org.eclipse.jgit.transport.URIish;
15-
import org.jenkinsci.plugins.multiplescms.MultiSCM;
1619
import org.slf4j.Logger;
1720
import org.slf4j.LoggerFactory;
1821

1922
import java.util.Collection;
2023
import java.util.HashSet;
21-
import java.util.List;
2224
import java.util.Set;
2325

2426
/**
@@ -33,24 +35,81 @@ public abstract class GitHubRepositoryNameContributor implements ExtensionPoint
3335
/**
3436
* Looks at the definition of {@link AbstractProject} and list up the related github repositories,
3537
* then puts them into the collection.
38+
*
39+
* @deprecated Use {@link #parseAssociatedNames(Job, Collection)}
3640
*/
37-
public abstract void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRepositoryName> result);
41+
@Deprecated
42+
public void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRepositoryName> result) {
43+
parseAssociatedNames((Job) job, result);
44+
}
45+
46+
/**
47+
* Looks at the definition of {@link Job} and list up the related github repositories,
48+
* then puts them into the collection.
49+
*/
50+
public /*abstract*/ void parseAssociatedNames(Job<?, ?> job, Collection<GitHubRepositoryName> result) {
51+
if (overriddenMethodHasDeprecatedSignature(job)) {
52+
parseAssociatedNames((AbstractProject) job, result);
53+
} else {
54+
throw new AbstractMethodError("you must override the new overload of parseAssociatedNames");
55+
}
56+
}
57+
58+
/**
59+
* To select backward compatible method with old extensions
60+
* with overridden {@link #parseAssociatedNames(AbstractProject, Collection)}
61+
*
62+
* @param job - parameter to check for old class
63+
*
64+
* @return true if overridden deprecated method
65+
*/
66+
private boolean overriddenMethodHasDeprecatedSignature(Job<?, ?> job) {
67+
return Util.isOverridden(
68+
GitHubRepositoryNameContributor.class,
69+
getClass(),
70+
"parseAssociatedNames",
71+
AbstractProject.class,
72+
Collection.class
73+
) && job instanceof AbstractProject;
74+
}
3875

3976
public static ExtensionList<GitHubRepositoryNameContributor> all() {
4077
return Jenkins.getInstance().getExtensionList(GitHubRepositoryNameContributor.class);
4178
}
4279

80+
/**
81+
* @deprecated Use {@link #parseAssociatedNames(Job)}
82+
*/
83+
@Deprecated
4384
public static Collection<GitHubRepositoryName> parseAssociatedNames(AbstractProject<?, ?> job) {
85+
return parseAssociatedNames((Job) job);
86+
}
87+
88+
public static Collection<GitHubRepositoryName> parseAssociatedNames(Job<?, ?> job) {
4489
Set<GitHubRepositoryName> names = new HashSet<GitHubRepositoryName>();
4590
for (GitHubRepositoryNameContributor c : all()) {
4691
c.parseAssociatedNames(job, names);
4792
}
4893
return names;
4994
}
5095

96+
/**
97+
* Default implementation that looks at SCMs
98+
*/
99+
@Extension
100+
public static class FromSCM extends GitHubRepositoryNameContributor {
101+
@Override
102+
public void parseAssociatedNames(Job<?, ?> job, Collection<GitHubRepositoryName> result) {
103+
SCMTriggerItem item = SCMTriggerItems.asSCMTriggerItem(job);
104+
EnvVars envVars = buildEnv(job);
105+
if (item != null) {
106+
for (SCM scm : item.getSCMs()) {
107+
addRepositories(scm, envVars, result);
108+
}
109+
}
110+
}
51111

52-
abstract static class AbstractFromSCMImpl extends GitHubRepositoryNameContributor {
53-
protected EnvVars buildEnv(AbstractProject<?, ?> job) {
112+
protected EnvVars buildEnv(Job<?, ?> job) {
54113
EnvVars env = new EnvVars();
55114
for (EnvironmentContributor contributor : EnvironmentContributor.all()) {
56115
try {
@@ -77,41 +136,4 @@ protected static void addRepositories(SCM scm, EnvVars env, Collection<GitHubRep
77136
}
78137
}
79138
}
80-
81-
/**
82-
* Default implementation that looks at SCM
83-
*/
84-
@Extension
85-
@SuppressWarnings("unused")
86-
public static class FromSCM extends AbstractFromSCMImpl {
87-
@Override
88-
public void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRepositoryName> result) {
89-
addRepositories(job.getScm(), buildEnv(job), result);
90-
}
91-
}
92-
93-
/**
94-
* MultiSCM support separated into a different extension point since this is an optional dependency
95-
*/
96-
@Extension(optional = true)
97-
@SuppressWarnings("unused")
98-
public static class FromMultiSCM extends AbstractFromSCMImpl {
99-
// make this class fail to load if MultiSCM is not present
100-
public FromMultiSCM() {
101-
MultiSCM.class.toString();
102-
}
103-
104-
@Override
105-
public void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRepositoryName> result) {
106-
if (job.getScm() instanceof MultiSCM) {
107-
EnvVars env = buildEnv(job);
108-
109-
MultiSCM multiSCM = (MultiSCM) job.getScm();
110-
List<SCM> scmList = multiSCM.getConfiguredSCMs();
111-
for (SCM scm : scmList) {
112-
addRepositories(scm, env, result);
113-
}
114-
}
115-
}
116-
}
117139
}

src/main/java/com/cloudbees/jenkins/GitHubTrigger.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import hudson.Extension;
44
import hudson.Util;
55
import hudson.model.AbstractProject;
6+
import hudson.model.Job;
67
import hudson.triggers.Trigger;
8+
import jenkins.model.ParameterizedJobMixIn;
79

810
import java.util.Collection;
911
import java.util.Set;
@@ -44,9 +46,13 @@ public interface GitHubTrigger {
4446
@Extension
4547
class GitHubRepositoryNameContributorImpl extends GitHubRepositoryNameContributor {
4648
@Override
47-
public void parseAssociatedNames(AbstractProject<?, ?> job, Collection<GitHubRepositoryName> result) {
48-
for (GitHubTrigger ght : Util.filter(job.getTriggers().values(), GitHubTrigger.class)) {
49-
result.addAll(ght.getGitHubRepositories());
49+
public void parseAssociatedNames(Job<?, ?> job, Collection<GitHubRepositoryName> result) {
50+
if (job instanceof ParameterizedJobMixIn.ParameterizedJob) {
51+
ParameterizedJobMixIn.ParameterizedJob p = (ParameterizedJobMixIn.ParameterizedJob) job;
52+
// TODO use standard method in 1.621+
53+
for (GitHubTrigger ght : Util.filter(p.getTriggers().values(), GitHubTrigger.class)) {
54+
result.addAll(ght.getGitHubRepositories());
55+
}
5056
}
5157
}
5258
}

0 commit comments

Comments
 (0)