Skip to content

Commit

Permalink
Merge pull request #1 from MarkusTiede/master
Browse files Browse the repository at this point in the history
Minor improvements
  • Loading branch information
culmat committed Dec 11, 2017
2 parents c07162f + d0cea90 commit aad7549
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,30 @@

import hudson.Plugin;
import hudson.util.HttpResponses;
import java.util.Enumeration;
import net.sf.json.JSONObject;
import net.sf.json.groovy.JsonSlurper;

public class CreateAndRunJobTriggerPlugin extends Plugin {

public HttpResponse doTrigger(StaplerRequest request) throws IOException {
if("POST".equalsIgnoreCase(request.getMethod())
&& request.getHeader("Content-Type").toLowerCase().contains("json") ) {
JsonSlurper slurp = new JsonSlurper();
JSONObject json = (JSONObject) slurp.parse(request.getInputStream());
// if("refs/heads/master".equalsIgnoreCase(json.getString("ref"))) {
String url = json.getJSONObject("repository").getString("clone_url");
new OnTrigger(url).run();
// }

} else {
String url = request.getParameter("url");

if (url == null) {
return HttpResponses.error(400, "bad request: url parameter must be set");
}
new OnTrigger(url).run();
public HttpResponse doTrigger(StaplerRequest request) throws IOException {
if ("POST".equalsIgnoreCase(request.getMethod())
&& request.getHeader("Content-Type").toLowerCase().contains("json")) {
JsonSlurper slurp = new JsonSlurper();
JSONObject json = (JSONObject) slurp.parse(request.getInputStream());
// if("refs/heads/master".equalsIgnoreCase(json.getString("ref"))) {
String url = json.getJSONObject("repository").getString("clone_url");
new OnTrigger(url).run();
// }

} else {
String url = request.getParameter("url");

if (url == null) {
return HttpResponses.error(400, "bad request: url parameter must be set");
}

return HttpResponses.ok();
}
}
new OnTrigger(url).run();
}

return HttpResponses.ok();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ public class Credentials {
private static final String extensionSeperator = "_";
private static final String replacement = "-";


public static String generateId(String service, String... extensions) {
StringBuffer buf = new StringBuffer();
buf.append(service.toUpperCase());
Expand All @@ -23,5 +22,4 @@ private static String cleanExtension(String extension) {
.replaceAll(extensionSeperator, replacement)
.split("/")[0];
}

}
}
215 changes: 107 additions & 108 deletions src/main/java/org/jenkinsci/plugins/createandrunjobtrigger/OnTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.*;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
Expand All @@ -18,140 +19,138 @@
import hudson.model.Job;
import hudson.model.Queue;
import hudson.model.TopLevelItem;
import hudson.model.Queue.Executable;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.UserRemoteConfig;
import hudson.plugins.git.browser.GitWeb;
import hudson.plugins.git.extensions.GitSCMExtension;
import jenkins.model.Jenkins;

public class OnTrigger implements Runnable {
static final Logger log = Logger.getLogger(OnTrigger.class.getName());
final String jobName;
private final String gitUrl;
private final String organisation;
private final String repo;

public OnTrigger(String gitUrl) {
this.gitUrl = gitUrl;
String[] tokens = gitUrl.split("/");
if(tokens.length < 3) throw new IllegalArgumentException(gitUrl + " invalid");
organisation = tokens[tokens.length-2];
repo = stripGit(tokens[tokens.length-1]);
jobName = repo;

}

String stripGit(String repo) {
return repo.endsWith(".git") ? repo.substring(0, repo.lastIndexOf(".git")) : repo ;
}

@Override
public void run() {
try {
Job<?,?> job = getOrCreateJob();
if(!job.isBuilding()) {
jenkins().getQueue().schedule((Queue.Task) job, 2);
}
} catch (IllegalArgumentException | IOException e) {
log.log(Level.SEVERE, "Could not run "+this, e);
}
}

Job<?,?> getOrCreateJob() throws IllegalArgumentException, IOException {
Folder repoFolder = getOrCreateFolder(getOrCreateFolder(jenkins(), organisation), repo);
TopLevelItem jobItem = repoFolder.getItem(jobName);
return assignBuildNumber(jobItem == null ? createJob(repoFolder) : asJob(jobItem));
}

private Job<?,?> assignBuildNumber(Job<?, ?> job) throws IOException {
Path buildsPath = jenkins().getRootDir().toPath().resolve("jobs").resolve(organisation).resolve("jobs").resolve(repo).resolve("jobs").resolve(jobName).resolve("builds");
while(buildsPath.resolve(""+job.getNextBuildNumber()).toFile().exists()) {
int newBuildNumber = job.assignBuildNumber();
log.log(Level.FINE, format("assigned nr %s to build %s", newBuildNumber, job.getName()));
}
return job;
}

private WorkflowJob createJob(Folder repoFolder) throws IOException {

WorkflowJob job = new WorkflowJob(repoFolder, jobName);
static final Logger log = Logger.getLogger(OnTrigger.class.getName());
final String jobName;
private final String gitUrl;
private final String organisation;
private final String repo;

public OnTrigger(String gitUrl) {
this.gitUrl = gitUrl;
String[] tokens = gitUrl.split("/");
if (tokens.length < 3)
throw new IllegalArgumentException(gitUrl + " invalid");
organisation = tokens[tokens.length - 2];
repo = stripGit(tokens[tokens.length - 1]);
jobName = repo;

}

String stripGit(String repo) {
return repo.endsWith(".git") ? repo.substring(0, repo.lastIndexOf(".git")) : repo;
}

@Override
public void run() {
try {
Job<?, ?> job = getOrCreateJob();
if (!job.isBuilding()) {
jenkins().getQueue().schedule((Queue.Task) job, 2);
}
} catch (IllegalArgumentException | IOException e) {
log.log(Level.SEVERE, "Could not run " + this, e);
}
}

Job<?, ?> getOrCreateJob() throws IllegalArgumentException, IOException {
Folder repoFolder = getOrCreateFolder(getOrCreateFolder(jenkins(), organisation), repo);
TopLevelItem jobItem = repoFolder.getItem(jobName);
return assignBuildNumber(jobItem == null ? createJob(repoFolder) : asJob(jobItem));
}

private Job<?, ?> assignBuildNumber(Job<?, ?> job) throws IOException {
Path buildsPath = jenkins().getRootDir().toPath().resolve("jobs").resolve(organisation).resolve("jobs")
.resolve(repo).resolve("jobs").resolve(jobName).resolve("builds");
while (buildsPath.resolve("" + job.getNextBuildNumber()).toFile().exists()) {
int newBuildNumber = job.assignBuildNumber();
log.log(Level.FINE, format("assigned nr %s to build %s", newBuildNumber, job.getName()));
}
return job;
}

private WorkflowJob createJob(Folder repoFolder) throws IOException {

WorkflowJob job = new WorkflowJob(repoFolder, jobName);

List<UserRemoteConfig> remoteConfigs = new ArrayList<UserRemoteConfig>();
String credId = Credentials.generateId("git", gitUrl);
remoteConfigs.add(new UserRemoteConfig(gitUrl, "", "", credId));

List<GitSCMExtension> extensions = new ArrayList<GitSCMExtension>();
extensions.add(new hudson.plugins.git.extensions.impl.CleanBeforeCheckout());

final int timeoutMinutes = 10;
extensions.add(new hudson.plugins.git.extensions.impl.CloneOption(true, "", timeoutMinutes));
extensions.add(new hudson.plugins.git.extensions.impl.CloneOption(true, "", timeoutMinutes));

GitSCM git = new GitSCM(remoteConfigs, null, false, null, new GitWeb(gitUrl), "", extensions);
CpsScmFlowDefinition flowDefinition = new CpsScmFlowDefinition(git, "Jenkinsfile");
job.setDefinition(flowDefinition);
job.save();

reloadConfig();

return job;
}
}

private void reloadConfig() throws IOException {
try {
private void reloadConfig() throws IOException {
try {
jenkins().reload();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ReactorException e) {
e.printStackTrace();
}
}


private Folder getOrCreateFolder(Jenkins jenkins, String subFolder) throws IllegalArgumentException, IOException {
TopLevelItem item = jenkins.getItem(subFolder);
if(item == null) {
log.info(format("creating folder %s in %s", subFolder, "jenkins"));
item = new Folder(jenkins, subFolder);
jenkins.add(item, subFolder).save();
}
return asFolder(item);
}

private Folder getOrCreateFolder(Folder folder, String subFolder) throws IllegalArgumentException, IOException {
TopLevelItem item = folder.getItem(subFolder);
if(item == null) {
log.info(format("creating folder %s in %s", subFolder, folder.getName()));
item = new Folder(folder, subFolder);
folder.add(item, subFolder).save();
}
return asFolder(item);
}

private Folder asFolder(Item item) {
if (item instanceof Folder) {
return (Folder) item;
} else {
throw new IllegalArgumentException(format("expected %s to be a folder but was %s", item.getName(), item));
}
}

private Job<?,?> asJob(Item item) {
if (item instanceof Job) {
return (Job<?,?>) item;
} else {
throw new IllegalArgumentException(format("expected %s to be a job but was %s", item.getName(), item));
}
}

private Jenkins jenkins() {
return Jenkins.getInstance();
}


@Override
public String toString() {
return format("OnTrigger[%s, %s, %s]", gitUrl, organisation, repo);
}

}
}

private Folder getOrCreateFolder(Jenkins jenkins, String subFolder) throws IllegalArgumentException, IOException {
TopLevelItem item = jenkins.getItem(subFolder);
if (item == null) {
log.info(format("creating folder %s in %s", subFolder, "jenkins"));
item = new Folder(jenkins, subFolder);
jenkins.add(item, subFolder).save();
}
return asFolder(item);
}

private Folder getOrCreateFolder(Folder folder, String subFolder) throws IllegalArgumentException, IOException {
TopLevelItem item = folder.getItem(subFolder);
if (item == null) {
log.info(format("creating folder %s in %s", subFolder, folder.getName()));
item = new Folder(folder, subFolder);
folder.add(item, subFolder).save();
}
return asFolder(item);
}

private Folder asFolder(Item item) {
if (item instanceof Folder) {
return (Folder) item;
} else {
throw new IllegalArgumentException(format("expected %s to be a folder but was %s", item.getName(), item));
}
}

private Job<?, ?> asJob(Item item) {
if (item instanceof Job) {
return (Job<?, ?>) item;
} else {
throw new IllegalArgumentException(format("expected %s to be a job but was %s", item.getName(), item));
}
}

private Jenkins jenkins() {
return Jenkins.getInstance();
}

@Override
public String toString() {
return format("OnTrigger[%s, %s, %s]", gitUrl, organisation, repo);
}
}

0 comments on commit aad7549

Please sign in to comment.