Skip to content

Commit bb047ff

Browse files
committed
Merge pull request jenkinsci#65 from lanwen/creds
[JENKINS-24702] Migration to credentials instead of plain token usage
2 parents a5a2f97 + 2176fd6 commit bb047ff

File tree

47 files changed

+1808
-551
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1808
-551
lines changed

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@
6565
<version>0.12.1</version>
6666
</dependency>
6767

68+
<dependency>
69+
<groupId>org.jenkins-ci.plugins</groupId>
70+
<artifactId>credentials</artifactId>
71+
<version>1.22</version>
72+
</dependency>
73+
74+
<dependency>
75+
<groupId>org.jenkins-ci.plugins</groupId>
76+
<artifactId>plain-credentials</artifactId>
77+
<version>1.1</version>
78+
</dependency>
79+
6880
<dependency>
6981
<groupId>org.jenkins-ci.plugins</groupId>
7082
<artifactId>multiple-scms</artifactId>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import hudson.model.PeriodicWork;
66
import hudson.triggers.Trigger;
77
import jenkins.model.Jenkins;
8+
import org.jenkinsci.plugins.github.GitHubPlugin;
89
import org.jenkinsci.plugins.github.webhook.WebhookManager;
910

1011
import java.net.URL;
@@ -55,7 +56,7 @@ public long getRecurrencePeriod() {
5556
*/
5657
@Override
5758
protected void doRun() throws Exception {
58-
URL url = Trigger.all().get(GitHubPushTrigger.DescriptorImpl.class).getHookUrl();
59+
URL url = GitHubPlugin.configuration().getHookUrl();
5960

6061
List<AbstractProject> jobs = Jenkins.getInstance().getAllItems(AbstractProject.class);
6162
List<GitHubRepositoryName> aliveRepos = from(jobs)

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

Lines changed: 0 additions & 64 deletions
This file was deleted.

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

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

33
import com.google.common.base.Charsets;
4-
import com.google.common.base.Function;
54
import hudson.Extension;
65
import hudson.Util;
6+
import hudson.XmlFile;
77
import hudson.console.AnnotatedLargeText;
88
import hudson.model.AbstractProject;
99
import hudson.model.Action;
1010
import hudson.model.Item;
1111
import hudson.model.Project;
1212
import hudson.triggers.Trigger;
1313
import hudson.triggers.TriggerDescriptor;
14-
import hudson.util.FormValidation;
1514
import hudson.util.SequentialExecutionQueue;
1615
import hudson.util.StreamTaskListener;
1716
import jenkins.model.Jenkins;
1817
import jenkins.model.Jenkins.MasterComputer;
19-
import net.sf.json.JSONObject;
20-
import org.apache.commons.codec.binary.Base64;
2118
import org.apache.commons.jelly.XMLOutput;
22-
import org.jenkinsci.main.modules.instance_identity.InstanceIdentity;
19+
import org.jenkinsci.plugins.github.GitHubPlugin;
20+
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
21+
import org.jenkinsci.plugins.github.deprecated.Credential;
2322
import org.jenkinsci.plugins.github.internal.GHPluginConfigException;
23+
import org.jenkinsci.plugins.github.migration.Migrator;
2424
import org.kohsuke.stapler.DataBoundConstructor;
25-
import org.kohsuke.stapler.QueryParameter;
26-
import org.kohsuke.stapler.StaplerRequest;
25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
2727

28-
import javax.inject.Inject;
2928
import java.io.File;
3029
import java.io.IOException;
3130
import java.io.PrintStream;
32-
import java.net.HttpURLConnection;
3331
import java.net.MalformedURLException;
3432
import java.net.URL;
35-
import java.security.interfaces.RSAPublicKey;
3633
import java.text.DateFormat;
37-
import java.util.ArrayList;
3834
import java.util.Collection;
3935
import java.util.Collections;
4036
import java.util.Date;
4137
import java.util.List;
4238
import java.util.Set;
43-
import java.util.logging.Level;
44-
import java.util.logging.Logger;
39+
40+
import static org.apache.commons.lang3.StringUtils.isEmpty;
4541

4642
/**
4743
* Triggers a build when we receive a GitHub post-commit webhook.
@@ -85,17 +81,17 @@ private boolean runPolling() {
8581
return result;
8682
} catch (Error e) {
8783
e.printStackTrace(listener.error("Failed to record SCM polling"));
88-
LOGGER.log(Level.SEVERE,"Failed to record SCM polling",e);
84+
LOGGER.error("Failed to record SCM polling", e);
8985
throw e;
9086
} catch (RuntimeException e) {
9187
e.printStackTrace(listener.error("Failed to record SCM polling"));
92-
LOGGER.log(Level.SEVERE,"Failed to record SCM polling",e);
88+
LOGGER.error("Failed to record SCM polling", e);
9389
throw e;
9490
} finally {
9591
listener.close();
9692
}
9793
} catch (IOException e) {
98-
LOGGER.log(Level.SEVERE,"Failed to record SCM polling",e);
94+
LOGGER.error("Failed to record SCM polling", e);
9995
}
10096
return false;
10197
}
@@ -107,13 +103,13 @@ public void run() {
107103
try {
108104
cause = new GitHubPushCause(getLogFile(), pushBy);
109105
} catch (IOException e) {
110-
LOGGER.log(Level.WARNING, "Failed to parse the polling log",e);
106+
LOGGER.warn("Failed to parse the polling log", e);
111107
cause = new GitHubPushCause(pushBy);
112108
}
113109
if (job.scheduleBuild(cause)) {
114-
LOGGER.info("SCM changes detected in "+ job.getName()+". Triggering "+name);
110+
LOGGER.info("SCM changes detected in " + job.getName() + ". Triggering " + name);
115111
} else {
116-
LOGGER.info("SCM changes detected in "+ job.getName()+". Job is already in the queue");
112+
LOGGER.info("SCM changes detected in " + job.getName() + ". Job is already in the queue");
117113
}
118114
}
119115
}
@@ -138,7 +134,7 @@ public Set<GitHubRepositoryName> getGitHubRepositories() {
138134
@Override
139135
public void start(AbstractProject<?, ?> project, boolean newInstance) {
140136
super.start(project, newInstance);
141-
if (newInstance && getDescriptor().isManageHook()) {
137+
if (newInstance && GitHubPlugin.configuration().isManageHooks()) {
142138
registerHooks();
143139
}
144140
}
@@ -154,14 +150,13 @@ public void registerHooks() {
154150
GitHubWebHook.get().registerHookFor(job);
155151
}
156152

157-
158153
@Override
159154
public void stop() {
160155
if (job == null) {
161156
return;
162157
}
163158

164-
if (getDescriptor().isManageHook()) {
159+
if (GitHubPlugin.configuration().isManageHooks()) {
165160
Cleaner cleaner = Cleaner.get();
166161
if (cleaner != null) {
167162
cleaner.onStop(job);
@@ -219,19 +214,11 @@ public void writeLogTo(XMLOutput out) throws IOException {
219214

220215
@Extension
221216
public static class DescriptorImpl extends TriggerDescriptor {
222-
private static final Logger LOGGER = Logger.getLogger(DescriptorImpl.class.getName());
223217
private transient final SequentialExecutionQueue queue = new SequentialExecutionQueue(MasterComputer.threadPoolForRemoting);
224218

225-
private boolean manageHook;
226-
private String hookUrl;
227-
private volatile List<Credential> credentials = new ArrayList<Credential>();
228-
229-
@Inject
230-
private transient InstanceIdentity identity;
219+
private transient String hookUrl;
231220

232-
public DescriptorImpl() {
233-
load();
234-
}
221+
private transient List<Credential> credentials;
235222

236223
@Override
237224
public boolean isApplicable(Item item) {
@@ -245,91 +232,80 @@ public String getDisplayName() {
245232

246233
/**
247234
* True if Jenkins should auto-manage hooks.
235+
*
236+
* @deprecated Use {@link GitHubPluginConfig#isManageHooks()} instead
248237
*/
238+
@Deprecated
249239
public boolean isManageHook() {
250-
return manageHook;
251-
}
252-
253-
public void setManageHook(boolean v) {
254-
manageHook = v;
255-
save();
240+
return GitHubPlugin.configuration().isManageHooks();
256241
}
257242

258243
/**
259244
* Returns the URL that GitHub should post.
245+
*
246+
* @deprecated use {@link GitHubPluginConfig#getHookUrl()} instead
260247
*/
248+
@Deprecated
261249
public URL getHookUrl() throws GHPluginConfigException {
262-
try {
263-
return hookUrl != null
264-
? new URL(hookUrl)
265-
: new URL(Jenkins.getInstance().getRootUrl() + GitHubWebHook.get().getUrlName() + '/');
266-
} catch (MalformedURLException e) {
267-
throw new GHPluginConfigException(
268-
"Mailformed GH hook url in global configuration (%s)", e.getMessage()
269-
);
270-
}
271-
}
272-
273-
public boolean hasOverrideURL() {
274-
return hookUrl != null;
250+
return GitHubPlugin.configuration().getHookUrl();
275251
}
276252

253+
/**
254+
* @return null after migration
255+
* @deprecated use {@link GitHubPluginConfig#getConfigs()} instead.
256+
*/
257+
@Deprecated
277258
public List<Credential> getCredentials() {
278259
return credentials;
279260
}
280261

281-
@Override
282-
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
283-
JSONObject hookMode = json.getJSONObject("hookMode");
284-
manageHook = "auto".equals(hookMode.getString("value"));
285-
if (hookMode.optBoolean("hasHookUrl")) {
286-
hookUrl = hookMode.optString("hookUrl");
287-
} else {
288-
hookUrl = null;
262+
/**
263+
* Used only for migration
264+
*
265+
* @return null after migration
266+
* @deprecated use {@link GitHubPluginConfig#getHookUrl()}
267+
*/
268+
@Deprecated
269+
public URL getDeprecatedHookUrl() {
270+
if (isEmpty(hookUrl)) {
271+
return null;
289272
}
290-
credentials = req.bindJSONToList(Credential.class, hookMode.get("credentials"));
291-
save();
292-
return true;
293-
}
294-
295-
public FormValidation doCheckHookUrl(@QueryParameter String value) {
296273
try {
297-
HttpURLConnection con = (HttpURLConnection) new URL(value).openConnection();
298-
con.setRequestMethod("POST");
299-
con.setRequestProperty(GitHubWebHook.URL_VALIDATION_HEADER, "true");
300-
con.connect();
301-
if (con.getResponseCode()!=200) {
302-
return FormValidation.error("Got "+con.getResponseCode()+" from "+value);
303-
}
304-
String v = con.getHeaderField(GitHubWebHook.X_INSTANCE_IDENTITY);
305-
if (v == null) {
306-
// people might be running clever apps that's not Jenkins, and that's OK
307-
return FormValidation.warning("It doesn't look like " + value + " is talking to any Jenkins. Are you running your own app?");
308-
}
309-
RSAPublicKey key = identity.getPublic();
310-
String expected = new String(Base64.encodeBase64(key.getEncoded()));
311-
if (!expected.equals(v)) {
312-
// if it responds but with a different ID, that's more likely wrong than correct
313-
return FormValidation.error(value+" is connecting to different Jenkins instances");
314-
}
315-
316-
return FormValidation.ok();
317-
} catch (IOException e) {
318-
return FormValidation.error(e,"Failed to test a connection to "+value);
274+
return new URL(hookUrl);
275+
} catch (MalformedURLException e) {
276+
LOGGER.warn("Mailformed hook url skipped while migration ({})", e.getMessage());
277+
return null;
319278
}
279+
}
320280

281+
/**
282+
* Used to cleanup after migration
283+
*/
284+
public void clearDeprecatedHookUrl() {
285+
this.hookUrl = null;
321286
}
322287

323-
@SuppressWarnings("unused")
324-
public FormValidation doReRegister() {
325-
if (!manageHook) {
326-
return FormValidation.warning("Works only when Jenkins manages hooks");
327-
}
288+
/**
289+
* Used to cleanup after migration
290+
*/
291+
public void clearCredentials() {
292+
this.credentials = null;
293+
}
328294

329-
List<AbstractProject> registered = GitHubWebHook.get().reRegisterAllHooks();
295+
/**
296+
* @deprecated use {@link GitHubPluginConfig#isOverrideHookURL()}
297+
*/
298+
@Deprecated
299+
public boolean hasOverrideURL() {
300+
return GitHubPlugin.configuration().isOverrideHookURL();
301+
}
330302

331-
LOGGER.log(Level.INFO, "Called registerHooks() for {0} jobs", registered.size());
332-
return FormValidation.ok("Called re-register hooks for %s jobs", registered.size());
303+
/**
304+
* Uses global xstream to enable migration alias used in {@link Migrator#enableCompatibilityAliases()}
305+
*/
306+
@Override
307+
protected XmlFile getConfigFile() {
308+
return new XmlFile(Jenkins.XSTREAM2, super.getConfigFile().getFile());
333309
}
334310

335311
public static DescriptorImpl get() {
@@ -346,5 +322,5 @@ public static boolean allowsHookUrlOverride() {
346322
*/
347323
public static boolean ALLOW_HOOKURL_OVERRIDE = !Boolean.getBoolean(GitHubPushTrigger.class.getName() + ".disableOverride");
348324

349-
private static final Logger LOGGER = Logger.getLogger(GitHubPushTrigger.class.getName());
325+
private static final Logger LOGGER = LoggerFactory.getLogger(GitHubPushTrigger.class);
350326
}

0 commit comments

Comments
 (0)