Skip to content

Commit 4fe49d8

Browse files
authored
Merge pull request #33 from jenkinsci/development
Expose REF and BEFORE payload to env. variables.
2 parents 5a778fc + 6bd17e6 commit 4fe49d8

File tree

8 files changed

+242
-97
lines changed

8 files changed

+242
-97
lines changed

src/main/java/org/jenkinsci/plugins/gogs/GogsCause.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ associated documentation files (the "Software"), to deal in the Software without
2525

2626
import hudson.model.Cause;
2727

28-
public class GogsCause extends Cause {
29-
String deliveryID = "";
28+
class GogsCause extends Cause {
29+
private final String deliveryID;
3030

31-
public GogsCause(String deliveryID)
32-
{
33-
this.deliveryID = deliveryID;
31+
public GogsCause(String deliveryID) {
32+
this.deliveryID = deliveryID;
3433
}
3534

3635
@Override
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.jenkinsci.plugins.gogs;
2+
3+
import hudson.EnvVars;
4+
import hudson.model.AbstractBuild;
5+
import hudson.model.EnvironmentContributingAction;
6+
import hudson.model.InvisibleAction;
7+
8+
import javax.annotation.Nonnull;
9+
import java.util.Map;
10+
import java.util.logging.Level;
11+
import java.util.logging.Logger;
12+
13+
class GogsPayload extends InvisibleAction implements EnvironmentContributingAction {
14+
private final Map<String, String> payload;
15+
16+
public GogsPayload(Map<String, String> payload) {
17+
this.payload = payload;
18+
}
19+
20+
@Nonnull
21+
private Map<String, String> getPayload() {
22+
return payload;
23+
}
24+
25+
@Override
26+
public void buildEnvVars(AbstractBuild<?, ?> abstractBuild, EnvVars envVars) {
27+
LOGGER.log(Level.FINEST, "Injecting GOGS_PAYLOAD: {0}", getPayload());
28+
for (Map.Entry<String, String> entry : payload.entrySet()) {
29+
envVars.put("GOGS_" + entry.getKey().toUpperCase(), entry.getValue());
30+
}
31+
32+
}
33+
34+
private static final Logger LOGGER = Logger.getLogger(GogsPayload.class.getName());
35+
}

src/main/java/org/jenkinsci/plugins/gogs/GogsPayloadProcessor.java

Lines changed: 76 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,46 +26,88 @@ associated documentation files (the "Software"), to deal in the Software without
2626
import hudson.model.BuildableItem;
2727
import hudson.model.Cause;
2828
import hudson.security.ACL;
29+
import hudson.triggers.Trigger;
2930
import jenkins.model.Jenkins;
31+
import jenkins.model.ParameterizedJobMixIn;
32+
import jenkins.triggers.SCMTriggerItem;
3033
import org.acegisecurity.context.SecurityContext;
3134
import org.acegisecurity.context.SecurityContextHolder;
3235

36+
import java.io.PrintWriter;
37+
import java.io.StringWriter;
38+
import java.util.HashMap;
39+
import java.util.Map;
3340
import java.util.logging.Logger;
3441

35-
public class GogsPayloadProcessor {
36-
private static final Logger LOGGER = Logger.getLogger(GogsPayloadProcessor.class.getName());
37-
38-
public GogsPayloadProcessor() {
39-
}
40-
41-
public GogsResults triggerJobs(String jobName, String deliveryID) {
42-
SecurityContext saveCtx = null;
43-
GogsResults result = new GogsResults();
44-
45-
try {
46-
saveCtx = SecurityContextHolder.getContext();
47-
48-
Jenkins instance = Jenkins.getActiveInstance();
49-
if (instance!=null) {
50-
ACL acl = instance.getACL();
51-
acl.impersonate(ACL.SYSTEM);
52-
53-
BuildableItem project = GogsUtils.find(jobName, BuildableItem.class);
54-
if (project != null) {
55-
Cause cause = new GogsCause(deliveryID);
56-
project.scheduleBuild(0, cause);
57-
result.setMessage(String.format("Job '%s' is executed",jobName));
58-
} else {
59-
String msg = String.format("Job '%s' is not defined in Jenkins",jobName);
60-
result.setStatus(404, msg);
61-
LOGGER.warning(msg);
62-
}
63-
}
64-
} catch (Exception e) {
65-
} finally {
66-
SecurityContextHolder.setContext(saveCtx);
42+
class GogsPayloadProcessor {
43+
private static final Logger LOGGER = Logger.getLogger(GogsPayloadProcessor.class.getName());
44+
private final Map<String, String> payload = new HashMap<>();
45+
46+
GogsPayloadProcessor() {
47+
}
48+
49+
@SuppressWarnings("unused")
50+
public Map<String, String> getPayload() {
51+
return this.payload;
6752
}
6853

69-
return result;
70-
}
54+
public void setPayload(String k, String v) {
55+
this.payload.put(k, v);
56+
}
57+
58+
public GogsResults triggerJobs(String jobName, String deliveryID) {
59+
SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM);
60+
Boolean didJob = false;
61+
GogsResults result = new GogsResults();
62+
63+
try {
64+
Jenkins instance = Jenkins.getInstance();
65+
if (instance != null) {
66+
for (BuildableItem project : instance.getAllItems(BuildableItem.class)) {
67+
if (project.getName().equals(jobName)) {
68+
69+
GogsTrigger gTrigger = null;
70+
Cause cause = new GogsCause(deliveryID);
71+
72+
if (project instanceof ParameterizedJobMixIn.ParameterizedJob) {
73+
ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) project;
74+
for (Trigger trigger : pJob.getTriggers().values()) {
75+
if (trigger instanceof GogsTrigger) {
76+
gTrigger = (GogsTrigger) trigger;
77+
break;
78+
}
79+
}
80+
}
81+
if (gTrigger != null) {
82+
SCMTriggerItem item = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(project);
83+
GogsPayload gogsPayload = new GogsPayload(this.payload);
84+
85+
if (item != null)
86+
item.scheduleBuild2(0, gogsPayload);
87+
} else
88+
project.scheduleBuild(0, cause);
89+
90+
didJob = true;
91+
result.setMessage(String.format("Job '%s' is executed", jobName));
92+
}
93+
}
94+
if (!didJob) {
95+
String msg = String.format("Job '%s' is not defined in Jenkins", jobName);
96+
result.setStatus(404, msg);
97+
LOGGER.warning(msg);
98+
}
99+
}
100+
} catch (RuntimeException e) {
101+
throw e;
102+
} catch (Exception e) {
103+
StringWriter sw = new StringWriter();
104+
PrintWriter pw = new PrintWriter(sw);
105+
e.printStackTrace(pw);
106+
LOGGER.severe(sw.toString());
107+
} finally {
108+
SecurityContextHolder.setContext(saveCtx);
109+
}
110+
111+
return result;
112+
}
71113
}

src/main/java/org/jenkinsci/plugins/gogs/GogsProjectProperty.java

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -23,59 +23,68 @@ associated documentation files (the "Software"), to deal in the Software without
2323

2424
package org.jenkinsci.plugins.gogs;
2525

26-
import org.jenkinsci.plugins.gogs.GogsWebHook;
2726
import hudson.Extension;
2827
import hudson.model.Job;
2928
import hudson.model.JobProperty;
3029
import hudson.model.JobPropertyDescriptor;
31-
3230
import net.sf.json.JSONObject;
33-
34-
import org.kohsuke.stapler.StaplerRequest;
3531
import org.kohsuke.stapler.DataBoundConstructor;
32+
import org.kohsuke.stapler.StaplerRequest;
3633

3734
import java.util.logging.Logger;
3835

36+
@SuppressWarnings("ALL")
3937
public class GogsProjectProperty extends JobProperty<Job<?, ?>> {
40-
private final String gogsSecret;
41-
42-
@DataBoundConstructor
43-
public GogsProjectProperty(String gogsSecret) {
44-
this.gogsSecret = gogsSecret;
45-
}
46-
47-
public String getGogsSecret() {
48-
return this.gogsSecret;
49-
}
50-
51-
private static final Logger LOGGER = Logger.getLogger(GogsWebHook.class.getName());
52-
53-
@Extension
54-
public static final class DescriptorImpl extends JobPropertyDescriptor {
55-
public static final String GOGS_PROJECT_BLOCK_NAME = "gogsProject";
56-
private String gogsSecret;
57-
58-
public String getGogsSecret() {
59-
return gogsSecret;
60-
}
61-
62-
public JobProperty<?> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
63-
GogsProjectProperty tpp = req.bindJSON(
64-
GogsProjectProperty.class,
65-
formData.getJSONObject(GOGS_PROJECT_BLOCK_NAME)
66-
);
67-
if ( tpp != null ) {
68-
LOGGER.info(formData.toString());
69-
LOGGER.info(tpp.gogsSecret);
70-
71-
gogsSecret = tpp.gogsSecret;
38+
private final String gogsSecret;
39+
private final boolean gogsUsePayload;
40+
41+
@DataBoundConstructor
42+
public GogsProjectProperty(String gogsSecret, boolean gogsUsePayload) {
43+
this.gogsSecret = gogsSecret;
44+
this.gogsUsePayload = gogsUsePayload;
45+
}
46+
47+
public String getGogsSecret() {
48+
return this.gogsSecret;
49+
}
50+
51+
public boolean getGogsUsePayload() {
52+
return this.gogsUsePayload;
53+
}
54+
55+
private static final Logger LOGGER = Logger.getLogger(GogsWebHook.class.getName());
56+
57+
@Extension
58+
public static final class DescriptorImpl extends JobPropertyDescriptor {
59+
public static final String GOGS_PROJECT_BLOCK_NAME = "gogsProject";
60+
private String gogsSecret;
61+
private boolean gogsUsePayload;
62+
63+
public String getGogsSecret() {
64+
return gogsSecret;
65+
}
66+
67+
public boolean getGogsUsePayload() {
68+
return gogsUsePayload;
69+
}
70+
71+
public JobProperty<?> newInstance(StaplerRequest req, JSONObject formData) {
72+
GogsProjectProperty tpp = req.bindJSON(
73+
GogsProjectProperty.class,
74+
formData.getJSONObject(GOGS_PROJECT_BLOCK_NAME)
75+
);
76+
if (tpp != null) {
77+
LOGGER.finest(formData.toString());
78+
LOGGER.finest(tpp.gogsSecret);
79+
80+
gogsSecret = tpp.gogsSecret;
81+
}
82+
return tpp;
83+
}
84+
85+
@Override
86+
public String getDisplayName() {
87+
return "Gogs Secret";
7288
}
73-
return tpp;
74-
}
75-
76-
@Override
77-
public String getDisplayName() {
78-
return "Gogs Secret";
79-
}
80-
}
89+
}
8190
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.jenkinsci.plugins.gogs;
2+
3+
4+
import hudson.Extension;
5+
import hudson.model.Item;
6+
import hudson.model.Job;
7+
import hudson.triggers.Trigger;
8+
import hudson.triggers.TriggerDescriptor;
9+
import hudson.util.SequentialExecutionQueue;
10+
import jenkins.model.Jenkins;
11+
import jenkins.model.ParameterizedJobMixIn;
12+
import jenkins.triggers.SCMTriggerItem;
13+
import org.kohsuke.stapler.DataBoundConstructor;
14+
15+
import java.util.logging.Logger;
16+
17+
18+
@SuppressWarnings("ALL")
19+
public class GogsTrigger extends Trigger<Job<?, ?>> {
20+
21+
@DataBoundConstructor
22+
public GogsTrigger() {
23+
}
24+
25+
@Deprecated
26+
public void onPost(String triggeredByUser) {
27+
onPost(triggeredByUser, "");
28+
}
29+
30+
public void onPost(String triggeredByUser, final String payload) {
31+
getDescriptor().queue.execute(new Runnable() {
32+
33+
@Override
34+
public void run() {
35+
36+
}
37+
});
38+
}
39+
40+
@Override
41+
public DescriptorImpl getDescriptor() {
42+
return (DescriptorImpl) super.getDescriptor();
43+
}
44+
45+
@Extension
46+
public static class DescriptorImpl extends TriggerDescriptor {
47+
private transient final SequentialExecutionQueue queue = new SequentialExecutionQueue(Jenkins.MasterComputer.threadPoolForRemoting);
48+
49+
@Override
50+
public boolean isApplicable(Item item) {
51+
return item instanceof Job && SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(item) != null
52+
&& item instanceof ParameterizedJobMixIn.ParameterizedJob;
53+
}
54+
55+
@Override
56+
public String getDisplayName() {
57+
return "Build when a change is pushed to Gogs";
58+
}
59+
}
60+
61+
private static final Logger LOGGER = Logger.getLogger(GogsTrigger.class.getName());
62+
}

0 commit comments

Comments
 (0)