Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ The plugin will contribute some environment variables to the build.
* **gitlabSourceProjectId**
* **gitlabTargetProjectId**
* **gitlabLastCommitId**
* **gitlabMergeRequestAuthorEmail**
* **gitlabMergeRequestAssigneeEmail**

## Contributing

Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@
<artifactId>java-gitlab-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-step-api</artifactId>
<version>2.14</version>
</dependency>
</dependencies>

<pluginRepositories>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public void buildEnvironmentFor(@Nonnull Run r, @Nonnull EnvVars envs,
Map<String, String> variables = new HashMap<>();
variables.put("gitlabMergeRequestId", cause.getMergeRequestId() + "");
variables.put("gitlabMergeRequestIid", cause.getMergeRequestIid() + "");
variables.put("gitlabMergeRequestState", cause.getMergeRequestState() + "");
variables.put("gitlabMergeRequestAuthorEmail", cause.getAuthorEmail());
variables.put("gitlabMergeRequestAssigneeEmail", cause.getAssigneeEmail());
variables.put("gitlabSourceName", cause.getSourceName());
variables.put("gitlabSourceRepository", cause.getSourceRepository());
variables.put("gitlabSourceBranch", cause.getSourceBranch());
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/org/jenkinsci/plugins/gitlab/Gitlab.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ public GitlabAPI get() {
}

public synchronized GitlabCommitStatus changeCommitStatus(Integer projectId, String branch, String commitHash, String commitStatus, String targetUrl) throws IOException {
GitlabProject project = get().getProject(projectId);
return get().createCommitStatus(project, commitHash, commitStatus, branch, "jenkins", targetUrl, null);
return changeCommitStatus(projectId, branch, commitHash, "Jenkins", "Gitlab MR Builder", commitStatus, targetUrl);
}

public synchronized GitlabCommitStatus changeCommitStatus(Integer projectId, String branch, String commitHash, String name, String description, String commitStatus, String targetUrl) throws IOException {
GitlabProject project = get().getProject(projectId);
return get().createCommitStatus(project, commitHash, commitStatus, branch, name, targetUrl, description);
}
}
115 changes: 102 additions & 13 deletions src/main/java/org/jenkinsci/plugins/gitlab/GitlabBuildListener.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,122 @@
package org.jenkinsci.plugins.gitlab;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.Result;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.model.listeners.RunListener;
import jenkins.model.Jenkins;
import org.gitlab.api.models.GitlabMergeRequest;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

@Extension
public class GitlabBuildListener extends RunListener<AbstractBuild> {
public class GitlabBuildListener extends RunListener<Run<?, ?>> {

@Override
public void onStarted(AbstractBuild abstractBuild, TaskListener listener) {
GitlabBuildTrigger trigger = GitlabBuildTrigger.getTrigger(abstractBuild.getProject());
private static final Logger LOGGER = Logger.getLogger(GitlabBuildListener.class.getName());

private String getRootUrl() {
Jenkins instance = Jenkins.getInstance();
return instance == null ? "" : instance.getRootUrl();
}

if (trigger == null) {
@Override
public void onStarted(Run<?, ?> build, TaskListener listener) {
GitlabCause gitlabCause = build.getCause(GitlabCause.class);
if (gitlabCause == null || gitlabCause.getMergeRequestState().equals(GitlabMergeRequest.STATUS_MERGED)) {
return;
}
Gitlab gitlab = GitlabBuildTrigger.DESCRIPTOR.getGitlab();
try {
build.setDescription("<a href=\"" + gitlabCause.getWebUrl() + "\">" + gitlabCause.getShortDescription() + "</a>");
String url = getRootUrl() + build.getUrl();

LOGGER.log(Level.INFO, "Send running status to commit: " + gitlabCause.getLastCommitId() + ", url:" + url);
gitlab.changeCommitStatus(gitlabCause.getTargetProjectId(), gitlabCause.getSourceBranch(), gitlabCause.getLastCommitId(), "running", url);

trigger.getBuilder().getBuilds().onStarted(abstractBuild);

if (gitlabCause.getTrigger().getPublishBuildProgressMessages()) {
GitlabMergeRequestWrapper.createNote(gitlabCause.getMergeRequestId(),
gitlabCause.getMergeRequestIid(),
gitlabCause.getSourceProjectId(), "Build Started: " + "[" + url + "](" + url + ")", false, false);
}
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Can't update build description", e);
}
}

@Override
public void onCompleted(AbstractBuild abstractBuild, TaskListener listener) {
GitlabBuildTrigger trigger = GitlabBuildTrigger.getTrigger(abstractBuild.getProject());

if (trigger == null) {
public void onCompleted(Run<?, ?> build, TaskListener listener) {
GitlabCause gitlabCause = build.getCause(GitlabCause.class);
if (gitlabCause == null || gitlabCause.getMergeRequestState().equals(GitlabMergeRequest.STATUS_MERGED)) {
return;
}
Gitlab gitlab = GitlabBuildTrigger.DESCRIPTOR.getGitlab();
try {
boolean stable = false;
StringBuilder stringBuilder = new StringBuilder();
Result result = build.getResult();
EnvVars envVars = build.getEnvironment(listener);
if (result == Result.SUCCESS) {
stable = true;
if (envVars.containsKey("gitlabSuccessMessage")) {
stringBuilder.append(envVars.get("gitlabSuccessMessage"));
} else {
stringBuilder.append(GitlabBuildTrigger.DESCRIPTOR.getSuccessMessage());
}
} else if (result == Result.UNSTABLE) {
if (envVars.containsKey("gitlabUnstableMessage")) {
stringBuilder.append(envVars.get("gitlabUnstableMessage"));
} else {
stringBuilder.append(GitlabBuildTrigger.DESCRIPTOR.getUnstableMessage());
}
} else {
if (envVars.containsKey("gitlabFailureMessage")) {
stringBuilder.append(envVars.get("gitlabFailureMessage"));
} else {
stringBuilder.append(GitlabBuildTrigger.DESCRIPTOR.getFailureMessage());
}
}

if (!gitlabCause.getTrigger().getDescriptor().isEnableBuildTriggeredMessage()) {
GitlabBuilds.withCustomParameters(stringBuilder, gitlabCause.getCustomParameters());
}

String buildUrl = getRootUrl() + build.getUrl();
stringBuilder
.append("\nBuild results available at: ")
.append("[")
.append(buildUrl)
.append("](")
.append(buildUrl)
.append(")"); // Link in markdown format

boolean shouldClose = false;
if (!stable && gitlabCause.getTrigger().getAutoCloseFailed()) {
shouldClose = true;
}

trigger.getBuilder().getBuilds().onCompleted(abstractBuild);
boolean shouldMerge = false;
if (stable && gitlabCause.getTrigger().getAutoMergePassed()) {
shouldMerge = true;
}

if (gitlabCause.getTrigger().getPublishBuildProgressMessages() || !stable) {
GitlabMergeRequestWrapper.createNote(gitlabCause.getMergeRequestId(),
gitlabCause.getMergeRequestIid(),
gitlabCause.getSourceProjectId(),
stringBuilder.toString(),
shouldClose,
shouldMerge);
}

String status = (result == Result.SUCCESS) ? "success" : ((result == Result.ABORTED) ? "canceled" : "failed");
LOGGER.log(Level.INFO, "Send " + status + " status to commit: " + gitlabCause.getLastCommitId() + ", url:" + buildUrl);
gitlab.changeCommitStatus(gitlabCause.getTargetProjectId(), gitlabCause.getSourceBranch(), gitlabCause.getLastCommitId(), status, buildUrl);
} catch (IOException | InterruptedException e) {
LOGGER.log(Level.SEVERE, "Can't update build description", e);
}
}
}
36 changes: 28 additions & 8 deletions src/main/java/org/jenkinsci/plugins/gitlab/GitlabBuildTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import hudson.triggers.TriggerDescriptor;
import hudson.util.FormValidation;
import hudson.util.Secret;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
Expand All @@ -20,11 +22,12 @@
import java.util.logging.Level;
import java.util.logging.Logger;

public final class GitlabBuildTrigger extends Trigger<AbstractProject<?, ?>> {
public final class GitlabBuildTrigger extends Trigger<Job<?, ?>> {

private static final Logger LOGGER = Logger.getLogger(GitlabBuildTrigger.class.getName());

private final String projectPath;
private final String sourceBranchRegex;
private final String targetBranchRegex;
private final boolean useHttpUrl;
private final String assigneeFilter;
Expand All @@ -38,6 +41,7 @@ public final class GitlabBuildTrigger extends Trigger<AbstractProject<?, ?>> {
@DataBoundConstructor
public GitlabBuildTrigger(String cron,
String projectPath,
String sourceBranchRegex,
String targetBranchRegex,
boolean useHttpUrl,
String assigneeFilter,
Expand All @@ -49,6 +53,7 @@ public GitlabBuildTrigger(String cron,

super(cron);
this.projectPath = projectPath;
this.sourceBranchRegex = sourceBranchRegex;
this.targetBranchRegex = targetBranchRegex;
this.useHttpUrl = useHttpUrl;
this.assigneeFilter = assigneeFilter;
Expand All @@ -60,7 +65,7 @@ public GitlabBuildTrigger(String cron,
}

@Override
public void start(AbstractProject<?, ?> project, boolean newInstance) {
public void start(Job<?, ?> project, boolean newInstance) {
try {
GitlabWebhooks.addTrigger(this);

Expand All @@ -82,6 +87,9 @@ public QueueTaskFuture<?> startJob(GitlabCause cause) {

values.put("gitlabMergeRequestId", new StringParameterValue("gitlabMergeRequestId", String.valueOf(cause.getMergeRequestId())));
values.put("gitlabMergeRequestIid", new StringParameterValue("gitlabMergeRequestIid", String.valueOf(cause.getMergeRequestIid())));
values.put("gitlabMergeRequestState", new StringParameterValue("gitlabMergeRequestState", String.valueOf(cause.getMergeRequestState())));
values.put("gitlabMergeRequestAssigneeEmail", new StringParameterValue("gitlabMergeRequestAssigneeEmail", cause.getAssigneeEmail()));
values.put("gitlabMergeRequestAuthorEmail", new StringParameterValue("gitlabMergeRequestAuthorEmail", cause.getAuthorEmail()));
values.put("gitlabSourceName", new StringParameterValue("gitlabSourceName", cause.getSourceName()));
values.put("gitlabSourceRepository", new StringParameterValue("gitlabSourceRepository", cause.getSourceRepository()));
values.put("gitlabSourceBranch", new StringParameterValue("gitlabSourceBranch", cause.getSourceBranch()));
Expand All @@ -93,11 +101,19 @@ public QueueTaskFuture<?> startJob(GitlabCause cause) {
}

List<ParameterValue> listValues = new ArrayList<>(values.values());
if (job == null) {
return null;
} else {
return job.scheduleBuild2(0, cause, new ParametersAction(listValues));
}

ParameterizedJobMixIn scheduledJob = new ParameterizedJobMixIn() {
@Override
protected Job asJob() {
return job;
}
};

return scheduledJob.scheduleBuild2(
0,
new CauseAction(cause),
new ParametersAction(listValues)
);
}

private Map<String, ParameterValue> getDefaultParameters() {
Expand Down Expand Up @@ -172,6 +188,10 @@ public String getTargetBranchRegex() {
return targetBranchRegex;
}

public String getSourceBranchRegex() {
return sourceBranchRegex;
}

public boolean getUseHttpUrl() {
return useHttpUrl;
}
Expand Down Expand Up @@ -235,7 +255,7 @@ public GitlabBuildTriggerDescriptor() {

@Override
public boolean isApplicable(Item item) {
return item instanceof AbstractProject;
return true;
}

@Override
Expand Down
Loading