Merge branch 'master' of gitee.com:oschina/Gitee-Jenkins-Plugin into ISSUE#I2BALI
This commit is contained in:
commit
8f500cfb67
|
@ -29,7 +29,7 @@ Gitee Jenkins Plugin 是码云基于 [GitLab Plugin](https://github.com/jenkinsc
|
|||
## 目前支持特性:
|
||||
- 推送代码到码云时,由配置的 WebHook 触发 Jenkins 任务构建。
|
||||
- 提交 Pull Request 到码云项目时,由配置的 WebHook 触发 Jenkins 任务构建,支持PR动作:新建,更新,接受,关闭,审查通过,测试通过。
|
||||
- 支持 [ci-skip] 指令过滤。
|
||||
- 支持 [ci-skip] 指令过滤 或者 [ci-build] 指令触发构建。
|
||||
- 过滤已经构建的 Commit 版本,若是分支 Push,则相同分支Push才过滤,若是 PR,则是同一个PR才过滤。
|
||||
- 按分支名过滤触发器。
|
||||
- 正则表达式过滤可触发的分支。
|
||||
|
@ -39,6 +39,7 @@ Gitee Jenkins Plugin 是码云基于 [GitLab Plugin](https://github.com/jenkinsc
|
|||
- 对于 PR 相关的所有事件,若 PR 代码冲突不可自动合并,则不触发构建;且若配置了评论到PR的功能,则评论到 PR 提示冲突。
|
||||
- PR 评论可通过 WebHook 触发构建(可用于 PR 触发构建失败是便于从码云平台评论重新触发构建)
|
||||
- 支持配置 PR 不要求必须测试时过滤触发构建。(可用于不需测试则不构建部署测试环境)
|
||||
- 支持相同 PR 触发构建时,取消进行中的未完成构建,进行当前构建(相同 PR 构建不排队,多个不同 PR 构建仍需排队)
|
||||
|
||||
## 计划中特性
|
||||
1. PR 审查并测试通过触发构建(可用户触发部署,且可配合自动合并 PR 的特性完善工作流。)
|
||||
|
|
|
@ -531,6 +531,11 @@ public final class CauseData {
|
|||
data.getTargetProjectUrl());
|
||||
}
|
||||
}
|
||||
}, COMMIT_COMMENT {
|
||||
@Override
|
||||
String getShortDescription(CauseData data) {
|
||||
return Messages.GiteeWebHookCause_ShortDescription_Commit_comment(data.getTriggeredByUser());
|
||||
}
|
||||
}, PIPELINE {
|
||||
@Override
|
||||
String getShortDescription(CauseData data) {
|
||||
|
|
|
@ -58,6 +58,11 @@ public class NoteHook extends WebHook {
|
|||
}
|
||||
|
||||
public String getWebHookDescription() {
|
||||
// 兼容commit评论
|
||||
if (pullRequest == null) {
|
||||
return getHookName() + " commit sha = " + comment.getCommitId();
|
||||
}
|
||||
|
||||
return getHookName() + " iid = " + pullRequest.getNumber() + " merge commit sha = " + pullRequest.getMergeCommitSha();
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@ public class NoteObjectAttributes {
|
|||
private Date createdAt;
|
||||
private Date updatedAt;
|
||||
private String htmlUrl;
|
||||
private String commitId;
|
||||
private User user;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
|
@ -77,6 +79,22 @@ public class NoteObjectAttributes {
|
|||
this.htmlUrl = htmlUrl;
|
||||
}
|
||||
|
||||
public String getCommitId() {
|
||||
return commitId;
|
||||
}
|
||||
|
||||
public void setCommitId(String commitId) {
|
||||
this.commitId = commitId;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
|
@ -87,39 +105,45 @@ public class NoteObjectAttributes {
|
|||
}
|
||||
NoteObjectAttributes that = (NoteObjectAttributes) o;
|
||||
return new EqualsBuilder()
|
||||
.append(id, that.id)
|
||||
.append(body, that.body)
|
||||
.append(projectId, that.projectId)
|
||||
.append(authorId, that.authorId)
|
||||
.append(createdAt, that.createdAt)
|
||||
.append(updatedAt, that.updatedAt)
|
||||
.append(htmlUrl, that.htmlUrl)
|
||||
.isEquals();
|
||||
.append(id, that.id)
|
||||
.append(body, that.body)
|
||||
.append(projectId, that.projectId)
|
||||
.append(authorId, that.authorId)
|
||||
.append(createdAt, that.createdAt)
|
||||
.append(updatedAt, that.updatedAt)
|
||||
.append(htmlUrl, that.htmlUrl)
|
||||
.append(commitId, that.commitId)
|
||||
.append(user, that.user)
|
||||
.isEquals();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return new HashCodeBuilder(17, 37)
|
||||
.append(id)
|
||||
.append(body)
|
||||
.append(projectId)
|
||||
.append(authorId)
|
||||
.append(createdAt)
|
||||
.append(updatedAt)
|
||||
.append(htmlUrl)
|
||||
.toHashCode();
|
||||
.append(id)
|
||||
.append(body)
|
||||
.append(projectId)
|
||||
.append(authorId)
|
||||
.append(createdAt)
|
||||
.append(updatedAt)
|
||||
.append(htmlUrl)
|
||||
.append(commitId)
|
||||
.append(user)
|
||||
.toHashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this)
|
||||
.append("id", id)
|
||||
.append("body", body)
|
||||
.append("projectId", projectId)
|
||||
.append("authorId", authorId)
|
||||
.append("createdAt", createdAt)
|
||||
.append("updatedAt", updatedAt)
|
||||
.append("htmlUrl", htmlUrl)
|
||||
.toString();
|
||||
.append("id", id)
|
||||
.append("body", body)
|
||||
.append("projectId", projectId)
|
||||
.append("authorId", authorId)
|
||||
.append("createdAt", createdAt)
|
||||
.append("updatedAt", updatedAt)
|
||||
.append("htmlUrl", htmlUrl)
|
||||
.append("commitId", commitId)
|
||||
.append("user", user)
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,10 +111,6 @@ public class PushHook extends WebHook {
|
|||
this.project = project;
|
||||
}
|
||||
|
||||
public void setRepository(Project project) {
|
||||
this.project = project;
|
||||
}
|
||||
|
||||
public List<Commit> getCommits() {
|
||||
return commits;
|
||||
}
|
||||
|
|
|
@ -74,7 +74,8 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
private boolean triggerOnTestedPullRequest = false;
|
||||
private boolean triggerOnNoteRequest = true;
|
||||
private String noteRegex = "";
|
||||
private boolean ciSkip = true;
|
||||
private transient boolean ciSkip = true;
|
||||
private BuildInstructionFilterType buildInstructionFilterType;
|
||||
private boolean skipWorkInProgressPullRequest;
|
||||
private boolean ciSkipFroTestNotRequired;
|
||||
private boolean skipLastCommitHasBeenBuild;
|
||||
|
@ -92,6 +93,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
private volatile Secret secretToken;
|
||||
private String pendingBuildName;
|
||||
private boolean cancelPendingBuildsOnUpdate;
|
||||
private boolean cancelIncompleteBuildOnSamePullRequest;
|
||||
|
||||
private transient BranchFilter branchFilter;
|
||||
private transient PushHookTriggerHandler pushHookTriggerHandler;
|
||||
|
@ -113,11 +115,13 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
boolean triggerOnClosedPullRequest,
|
||||
boolean triggerOnNoteRequest, String noteRegex,
|
||||
boolean skipWorkInProgressPullRequest, boolean ciSkip,
|
||||
BuildInstructionFilterType buildInstructionFilterType,
|
||||
boolean setBuildDescription, boolean addNoteOnPullRequest, boolean addCiMessage, boolean addVoteOnPullRequest,
|
||||
boolean acceptPullRequestOnSuccess, BranchFilterType branchFilterType,
|
||||
String includeBranchesSpec, String excludeBranchesSpec, String targetBranchRegex,
|
||||
PullRequestLabelFilterConfig pullRequestLabelFilterConfig, String secretToken, boolean triggerOnPipelineEvent,
|
||||
boolean triggerOnApprovedPullRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate) {
|
||||
boolean triggerOnApprovedPullRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate,
|
||||
boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
this.triggerOnPush = triggerOnPush;
|
||||
this.triggerOnOpenPullRequest = triggerOnOpenPullRequest;
|
||||
this.triggerOnUpdatePullRequest = triggerOnUpdatePullRequest;
|
||||
|
@ -127,6 +131,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
this.noteRegex = noteRegex;
|
||||
this.triggerOnPipelineEvent = triggerOnPipelineEvent;
|
||||
this.ciSkip = ciSkip;
|
||||
this.buildInstructionFilterType = buildInstructionFilterType;
|
||||
this.skipWorkInProgressPullRequest = skipWorkInProgressPullRequest;
|
||||
this.setBuildDescription = setBuildDescription;
|
||||
this.addNoteOnPullRequest = addNoteOnPullRequest;
|
||||
|
@ -142,6 +147,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
this.triggerOnApprovedPullRequest = triggerOnApprovedPullRequest;
|
||||
this.pendingBuildName = pendingBuildName;
|
||||
this.cancelPendingBuildsOnUpdate = cancelPendingBuildsOnUpdate;
|
||||
this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest;
|
||||
|
||||
initializeTriggerHandler();
|
||||
initializeBranchFilter();
|
||||
|
@ -193,6 +199,24 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
oldConfig.jobsMigrated2 = true;
|
||||
oldConfig.save();
|
||||
}
|
||||
|
||||
// 兼容构建指令升级
|
||||
if (!oldConfig.jobsMigrated3) {
|
||||
for (AbstractProject<?, ?> project : Jenkins.getInstance().getAllItems(AbstractProject.class)) {
|
||||
GiteePushTrigger trigger = project.getTrigger(GiteePushTrigger.class);
|
||||
if (trigger != null) {
|
||||
if (trigger.getCiSkip()) {
|
||||
trigger.setBuildInstructionFilterType(BuildInstructionFilterType.CI_SKIP);
|
||||
} else {
|
||||
trigger.setBuildInstructionFilterType(BuildInstructionFilterType.NONE);
|
||||
}
|
||||
project.save();
|
||||
}
|
||||
}
|
||||
oldConfig.jobsMigrated3 = true;
|
||||
oldConfig.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean getAddNoteOnPullRequest() { return addNoteOnPullRequest; }
|
||||
|
@ -243,6 +267,10 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
return ciSkip;
|
||||
}
|
||||
|
||||
public BuildInstructionFilterType getBuildInstructionFilterType() {
|
||||
return buildInstructionFilterType;
|
||||
}
|
||||
|
||||
public boolean getCiSkipFroTestNotRequired() {
|
||||
return ciSkipFroTestNotRequired;
|
||||
}
|
||||
|
@ -295,6 +323,10 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
return this.cancelPendingBuildsOnUpdate;
|
||||
}
|
||||
|
||||
public boolean isCancelIncompleteBuildOnSamePullRequest() {
|
||||
return cancelIncompleteBuildOnSamePullRequest;
|
||||
}
|
||||
|
||||
@DataBoundSetter
|
||||
public void setTriggerOnPush(boolean triggerOnPush) {
|
||||
this.triggerOnPush = triggerOnPush;
|
||||
|
@ -340,6 +372,11 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
this.ciSkip = ciSkip;
|
||||
}
|
||||
|
||||
@DataBoundSetter
|
||||
public void setBuildInstructionFilterType(BuildInstructionFilterType buildInstructionFilterType) {
|
||||
this.buildInstructionFilterType = buildInstructionFilterType;
|
||||
}
|
||||
|
||||
@DataBoundSetter
|
||||
public void setCiSkipFroTestNotRequired(boolean ciSkipFroTestNotRequired) {
|
||||
this.ciSkipFroTestNotRequired = ciSkipFroTestNotRequired;
|
||||
|
@ -437,6 +474,11 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
this.cancelPendingBuildsOnUpdate = cancelPendingBuildsOnUpdate;
|
||||
}
|
||||
|
||||
@DataBoundSetter
|
||||
public void setCancelIncompleteBuildOnSamePullRequest(boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest;
|
||||
}
|
||||
|
||||
// executes when the Trigger receives a push request
|
||||
public void onPost(final PushHook hook) {
|
||||
if (branchFilter == null) {
|
||||
|
@ -448,7 +490,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
if (pushHookTriggerHandler == null) {
|
||||
initializeTriggerHandler();
|
||||
}
|
||||
pushHookTriggerHandler.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
pushHookTriggerHandler.handle(job, hook, buildInstructionFilterType, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
|
||||
// executes when the Trigger receives a pull request
|
||||
|
@ -462,7 +504,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
if (pullRequestHookTriggerHandler == null) {
|
||||
initializeTriggerHandler();
|
||||
}
|
||||
pullRequestHookTriggerHandler.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
pullRequestHookTriggerHandler.handle(job, hook, buildInstructionFilterType, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
|
||||
// executes when the Trigger receives a note request
|
||||
|
@ -476,7 +518,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
if (noteHookTriggerHandler == null) {
|
||||
initializeTriggerHandler();
|
||||
}
|
||||
noteHookTriggerHandler.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
noteHookTriggerHandler.handle(job, hook, buildInstructionFilterType, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
|
||||
// executes when the Trigger receives a pipeline event
|
||||
|
@ -484,14 +526,16 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
if (pipelineTriggerHandler == null) {
|
||||
initializeTriggerHandler();
|
||||
}
|
||||
pipelineTriggerHandler.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
pipelineTriggerHandler.handle(job, hook, buildInstructionFilterType, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
|
||||
private void initializeTriggerHandler() {
|
||||
pullRequestHookTriggerHandler = newPullRequestHookTriggerHandler(triggerOnOpenPullRequest,
|
||||
triggerOnUpdatePullRequest, triggerOnAcceptedPullRequest, triggerOnClosedPullRequest,
|
||||
skipWorkInProgressPullRequest, triggerOnApprovedPullRequest, triggerOnTestedPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired);
|
||||
noteHookTriggerHandler = newNoteHookTriggerHandler(triggerOnNoteRequest, noteRegex, ciSkipFroTestNotRequired);
|
||||
skipWorkInProgressPullRequest, triggerOnApprovedPullRequest, triggerOnTestedPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired,
|
||||
cancelIncompleteBuildOnSamePullRequest
|
||||
);
|
||||
noteHookTriggerHandler = newNoteHookTriggerHandler(triggerOnNoteRequest, noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest);
|
||||
pushHookTriggerHandler = newPushHookTriggerHandler(triggerOnPush, skipWorkInProgressPullRequest);
|
||||
pipelineTriggerHandler = newPipelineHookTriggerHandler(triggerOnPipelineEvent);
|
||||
}
|
||||
|
@ -540,6 +584,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
|
|||
private transient final SequentialExecutionQueue queue = new SequentialExecutionQueue(Jenkins.MasterComputer.threadPoolForRemoting);
|
||||
private boolean jobsMigrated = false;
|
||||
private boolean jobsMigrated2 = false;
|
||||
private boolean jobsMigrated3 = false;
|
||||
private String GiteeApiToken;
|
||||
private String giteeHostUrl = "";
|
||||
private boolean ignoreCertificateErrors = false;
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
package com.gitee.jenkins.trigger.filter;
|
||||
|
||||
/**
|
||||
* @author zhanggx
|
||||
*/
|
||||
public interface BuildInstructionFilter {
|
||||
|
||||
/**
|
||||
* 是否触发构建
|
||||
*
|
||||
* @param body
|
||||
* @return
|
||||
*/
|
||||
boolean isBuildAllow(String body);
|
||||
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package com.gitee.jenkins.trigger.filter;
|
||||
|
||||
/**
|
||||
* @author zhanggx
|
||||
*/
|
||||
public enum BuildInstructionFilterType implements BuildInstructionFilter {
|
||||
|
||||
/**
|
||||
* 无操作
|
||||
*/
|
||||
NONE("") {
|
||||
@Override
|
||||
public boolean isBuildAllow(String body) {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 包含 [ci-skip] 时跳过构建
|
||||
*/
|
||||
CI_SKIP("[ci-skip]") {
|
||||
@Override
|
||||
public boolean isBuildAllow(String body) {
|
||||
return body == null ? true : !body.contains(getBody());
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 包含 [ci-build] 时触发构建
|
||||
*/
|
||||
CI_BUILD("[ci-build]") {
|
||||
@Override
|
||||
public boolean isBuildAllow(String body) {
|
||||
return body == null ? false : body.contains(getBody());
|
||||
}
|
||||
};
|
||||
|
||||
private String body;
|
||||
|
||||
BuildInstructionFilterType(String body) {
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
}
|
|
@ -5,6 +5,7 @@ import com.gitee.jenkins.cause.GiteeWebHookCause;
|
|||
import com.gitee.jenkins.gitee.hook.model.WebHook;
|
||||
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import com.gitee.jenkins.util.LoggerUtil;
|
||||
import hudson.model.Action;
|
||||
|
@ -34,8 +35,8 @@ public abstract class AbstractWebHookTriggerHandler<H extends WebHook> implement
|
|||
protected PendingBuildsHandler pendingBuildsHandler = new PendingBuildsHandler();
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, H hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
if (ciSkip && isCiSkip(hook)) {
|
||||
public void handle(Job<?, ?> job, H hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
if (isCiSkip(hook, buildInstructionFilter)) {
|
||||
LOGGER.log(Level.INFO, "Skipping due to ci-skip.");
|
||||
return;
|
||||
}
|
||||
|
@ -49,6 +50,7 @@ public abstract class AbstractWebHookTriggerHandler<H extends WebHook> implement
|
|||
if (branchFilter.isBranchAllowed(targetBranch)) {
|
||||
LOGGER.log(Level.INFO, "{0} triggered for {1}.", LoggerUtil.toArray(job.getFullName(), getTriggerType()));
|
||||
cancelPendingBuildsIfNecessary(job, hook);
|
||||
cancelIncompleteBuildIfNecessary(job, hook);
|
||||
scheduleBuild(job, createActions(job, hook));
|
||||
} else {
|
||||
LOGGER.log(Level.INFO, "branch {0} is not allowed", targetBranch);
|
||||
|
@ -57,7 +59,7 @@ public abstract class AbstractWebHookTriggerHandler<H extends WebHook> implement
|
|||
|
||||
protected abstract String getTriggerType();
|
||||
|
||||
protected abstract boolean isCiSkip(H hook);
|
||||
protected abstract boolean isCiSkip(H hook, BuildInstructionFilter buildInstructionFilter);
|
||||
protected abstract boolean isCommitSkip(Job<?, ?> job, H hook);
|
||||
|
||||
protected Action[] createActions(Job<?, ?> job, H hook) {
|
||||
|
@ -76,6 +78,8 @@ public abstract class AbstractWebHookTriggerHandler<H extends WebHook> implement
|
|||
|
||||
protected void cancelPendingBuildsIfNecessary(Job<?, ?> job, H hook) {}
|
||||
|
||||
protected void cancelIncompleteBuildIfNecessary(Job<?, ?> job, H hook) {}
|
||||
|
||||
protected abstract CauseData retrieveCauseData(H hook);
|
||||
|
||||
protected abstract String getTargetBranch(H hook);
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.WebHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -10,5 +11,6 @@ import hudson.model.Job;
|
|||
*/
|
||||
public interface WebHookTriggerHandler<H extends WebHook> {
|
||||
|
||||
void handle(Job<?, ?> job, H hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter);
|
||||
void handle(Job<?, ?> job, H hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter);
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler.note;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.NoteHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -10,7 +11,7 @@ import hudson.model.Job;
|
|||
*/
|
||||
class NopNoteHookTriggerHandler implements NoteHookTriggerHandler {
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, NoteHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, NoteHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
// nothing to do
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,9 +7,9 @@ public final class NoteHookTriggerHandlerFactory {
|
|||
|
||||
private NoteHookTriggerHandlerFactory() {}
|
||||
|
||||
public static NoteHookTriggerHandler newNoteHookTriggerHandler(boolean triggerOnNoteRequest, String noteRegex, boolean ciSkipFroTestNotRequired) {
|
||||
public static NoteHookTriggerHandler newNoteHookTriggerHandler(boolean triggerOnNoteRequest, String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
if (triggerOnNoteRequest) {
|
||||
return new NoteHookTriggerHandlerImpl(noteRegex, ciSkipFroTestNotRequired);
|
||||
return new NoteHookTriggerHandlerImpl(noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest);
|
||||
} else {
|
||||
return new NopNoteHookTriggerHandler();
|
||||
}
|
||||
|
|
|
@ -7,12 +7,21 @@ import com.gitee.jenkins.gitee.hook.model.*;
|
|||
import com.gitee.jenkins.publisher.GiteeMessagePublisher;
|
||||
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
|
||||
import hudson.model.AbstractBuild;
|
||||
import hudson.model.Job;
|
||||
import hudson.model.Run;
|
||||
import hudson.plugins.git.GitSCM;
|
||||
import hudson.plugins.git.RevisionParameterAction;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
import org.eclipse.jgit.transport.RemoteConfig;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -31,14 +40,16 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
|
|||
|
||||
private final String noteRegex;
|
||||
private final boolean ciSkipFroTestNotRequired;
|
||||
private final boolean cancelIncompleteBuildOnSamePullRequest;
|
||||
|
||||
NoteHookTriggerHandlerImpl(String noteRegex, boolean ciSkipFroTestNotRequired) {
|
||||
NoteHookTriggerHandlerImpl(String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
this.noteRegex = noteRegex;
|
||||
this.ciSkipFroTestNotRequired = ciSkipFroTestNotRequired;
|
||||
this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, NoteHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, NoteHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
if (isValidTrigger(hook)) {
|
||||
// 若pr不可自动合并则评论至pr
|
||||
PullRequestObjectAttributes objectAttributes = hook.getPullRequest();
|
||||
|
@ -61,21 +72,56 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
|
|||
}
|
||||
|
||||
|
||||
super.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
super.handle(job, hook, buildInstructionFilter, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isCiSkip(NoteHook hook) {
|
||||
return hook.getPullRequest() != null
|
||||
&& hook.getPullRequest().getBody() != null
|
||||
&& hook.getPullRequest().getBody().contains("[ci-skip]");
|
||||
protected boolean isCiSkip(NoteHook hook, BuildInstructionFilter buildInstructionFilter) {
|
||||
return hook.getPullRequest() == null ? false : !buildInstructionFilter.isBuildAllow(hook.getPullRequest().getBody());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isCommitSkip(Job<?, ?> project, NoteHook hook) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void cancelIncompleteBuildIfNecessary(Job<?, ?> job, NoteHook hook) {
|
||||
if (!cancelIncompleteBuildOnSamePullRequest || hook.getPullRequest() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Run<?, ?> build : job.getBuilds()) {
|
||||
if (!job.isBuilding()) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!build.isBuilding()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RevisionParameterAction revisionParameterAction = build.getAction(RevisionParameterAction.class);
|
||||
if (revisionParameterAction != null) {
|
||||
Config config = new Config();
|
||||
config.setString("remote", hook.getRepository().getName(), "url", hook.getRepository().getGitHttpUrl());
|
||||
try {
|
||||
if (revisionParameterAction.canOriginateFrom(RemoteConfig.getAllRemoteConfigs(config))
|
||||
&& revisionParameterAction.commit.equals(hook.getPullRequest().getMergeReferenceName())) {
|
||||
if (build.isBuilding()) {
|
||||
((AbstractBuild) build).doStop();
|
||||
LOGGER.log(Level.WARNING, "Abort incomplete build");
|
||||
}
|
||||
}
|
||||
} catch (URISyntaxException e) {
|
||||
LOGGER.log(Level.WARNING, "Parsing repo url error", e);
|
||||
} catch (ServletException | IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTargetBranch(NoteHook hook) {
|
||||
return hook.getPullRequest() == null ? null : hook.getPullRequest().getTargetBranch();
|
||||
|
@ -88,6 +134,35 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
|
|||
|
||||
@Override
|
||||
protected CauseData retrieveCauseData(NoteHook hook) {
|
||||
// 兼容来自commit的评论
|
||||
if (hook.getPullRequest() == null) {
|
||||
return causeData()
|
||||
.withActionType(CauseData.ActionType.COMMIT_COMMENT)
|
||||
.withUserName(hook.getComment().getUser().getUsername())
|
||||
.withUserEmail(hook.getComment().getUser().getEmail())
|
||||
.withPullRequestTitle("")
|
||||
.withBranch("")
|
||||
.withSourceBranch("")
|
||||
.withSourceProjectId(hook.getProject().getId())
|
||||
.withSourceRepoHomepage(hook.getProject().getHomepage())
|
||||
.withSourceRepoName(hook.getProject().getName())
|
||||
.withSourceNamespace(hook.getProject().getNamespace())
|
||||
.withSourceRepoUrl(hook.getProject().getUrl())
|
||||
.withSourceRepoSshUrl(hook.getProject().getSshUrl())
|
||||
.withSourceRepoHttpUrl(hook.getProject().getGitHttpUrl())
|
||||
.withTargetBranch("")
|
||||
.withTargetProjectId(hook.getProject().getId())
|
||||
.withTargetRepoName(hook.getProject().getName())
|
||||
.withTargetNamespace(hook.getProject().getNamespace())
|
||||
.withTargetRepoSshUrl(hook.getProject().getSshUrl())
|
||||
.withTargetRepoHttpUrl(hook.getProject().getGitHttpUrl())
|
||||
.withTriggeredByUser(hook.getComment().getUser().getName())
|
||||
.withTriggerPhrase(hook.getComment().getBody())
|
||||
.withSha(hook.getComment().getCommitId())
|
||||
.withPathWithNamespace(hook.getProject().getPathWithNamespace())
|
||||
.build();
|
||||
}
|
||||
|
||||
return causeData()
|
||||
.withActionType(CauseData.ActionType.NOTE)
|
||||
.withSourceProjectId(hook.getPullRequest().getSourceProjectId())
|
||||
|
@ -146,6 +221,13 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
|
|||
return hook.getPullRequest().getMergeReferenceName();
|
||||
}
|
||||
}
|
||||
|
||||
// 兼容来自commit的评论
|
||||
if (hook.getComment() != null
|
||||
&& StringUtils.isNotBlank(hook.getComment().getCommitId())) {
|
||||
return hook.getComment().getCommitId();
|
||||
}
|
||||
|
||||
throw new NoRevisionToBuildException();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler.pipeline;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.PipelineHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -11,7 +12,7 @@ import hudson.model.Job;
|
|||
class NopPipelineHookTriggerHandler implements PipelineHookTriggerHandler {
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PipelineHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PipelineHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.gitee.jenkins.gitee.hook.model.PipelineEventObjectAttributes;
|
|||
import com.gitee.jenkins.gitee.hook.model.PipelineHook;
|
||||
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
|
||||
import com.gitee.jenkins.util.BuildUtil;
|
||||
|
@ -44,7 +45,7 @@ class PipelineHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pipel
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PipelineHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PipelineHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
PipelineEventObjectAttributes objectAttributes = hook.getObjectAttributes();
|
||||
try {
|
||||
if (job instanceof AbstractProject<?, ?>) {
|
||||
|
@ -58,7 +59,7 @@ class PipelineHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pipel
|
|||
LOGGER.log(Level.WARNING, "Failed to communicate with gitee server to determine project id: " + e.getMessage(), e);
|
||||
}
|
||||
if (allowedStates.contains(objectAttributes.getStatus()) && !isLastAlreadyBuild(job,hook)) {
|
||||
if (ciSkip && isCiSkip(hook)) {
|
||||
if (isCiSkip(hook, buildInstructionFilter)) {
|
||||
LOGGER.log(Level.INFO, "Skipping due to ci-skip.");
|
||||
return;
|
||||
}
|
||||
|
@ -77,7 +78,7 @@ class PipelineHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pipel
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean isCiSkip(PipelineHook hook) {
|
||||
protected boolean isCiSkip(PipelineHook hook, BuildInstructionFilter buildInstructionFilter) {
|
||||
//we don't get a commit message or suchlike that could contain ci-skip
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler.pull;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.PullRequestHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -10,7 +11,7 @@ import hudson.model.Job;
|
|||
*/
|
||||
class NopPullRequestHookTriggerHandler implements PullRequestHookTriggerHandler {
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PullRequestHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PullRequestHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
// nothing to do
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,14 +15,15 @@ public final class PullRequestHookTriggerHandlerFactory {
|
|||
private PullRequestHookTriggerHandlerFactory() {}
|
||||
|
||||
public static PullRequestHookTriggerHandler newPullRequestHookTriggerHandler(boolean triggerOnOpenPullRequest,
|
||||
String triggerOnUpdatePullRequest,
|
||||
boolean triggerOnAcceptedPullRequest,
|
||||
boolean triggerOnClosedPullRequest,
|
||||
boolean skipWorkInProgressPullRequest,
|
||||
boolean triggerOnApprovedPullRequest,
|
||||
boolean triggerOnTestedPullRequest,
|
||||
boolean cancelPendingBuildsOnUpdate,
|
||||
boolean ciSkipFroTestNotRequired) {
|
||||
String triggerOnUpdatePullRequest,
|
||||
boolean triggerOnAcceptedPullRequest,
|
||||
boolean triggerOnClosedPullRequest,
|
||||
boolean skipWorkInProgressPullRequest,
|
||||
boolean triggerOnApprovedPullRequest,
|
||||
boolean triggerOnTestedPullRequest,
|
||||
boolean cancelPendingBuildsOnUpdate,
|
||||
boolean ciSkipFroTestNotRequired,
|
||||
boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
if (triggerOnOpenPullRequest
|
||||
|| !("0".equals(triggerOnUpdatePullRequest) || "false".equals(triggerOnUpdatePullRequest))
|
||||
|| triggerOnAcceptedPullRequest
|
||||
|
@ -46,7 +47,8 @@ public final class PullRequestHookTriggerHandlerFactory {
|
|||
retrieveAllowedActionDesces(triggerOnUpdatePullRequest),
|
||||
skipWorkInProgressPullRequest,
|
||||
cancelPendingBuildsOnUpdate,
|
||||
ciSkipFroTestNotRequired);
|
||||
ciSkipFroTestNotRequired,
|
||||
cancelIncompleteBuildOnSamePullRequest);
|
||||
} else {
|
||||
return new NopPullRequestHookTriggerHandler();
|
||||
}
|
||||
|
|
|
@ -9,15 +9,22 @@ import com.gitee.jenkins.gitee.hook.model.PullRequestHook;
|
|||
import com.gitee.jenkins.publisher.GiteeMessagePublisher;
|
||||
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
|
||||
import com.gitee.jenkins.util.BuildUtil;
|
||||
import hudson.model.AbstractBuild;
|
||||
import hudson.model.Job;
|
||||
import hudson.model.Run;
|
||||
import hudson.plugins.git.GitSCM;
|
||||
import hudson.plugins.git.RevisionParameterAction;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
import org.eclipse.jgit.transport.RemoteConfig;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Collection;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -43,22 +50,24 @@ class PullRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pu
|
|||
private final Collection<Action> allowedActions;
|
||||
private final Collection<ActionDesc> allowedActionDesces;
|
||||
private final boolean cancelPendingBuildsOnUpdate;
|
||||
private final boolean cancelIncompleteBuildOnSamePullRequest;
|
||||
|
||||
PullRequestHookTriggerHandlerImpl(Collection<State> allowedStates, boolean skipWorkInProgressPullRequest, boolean cancelPendingBuildsOnUpdate, boolean ciSkipFroTestNotRequired) {
|
||||
this(allowedStates, EnumSet.allOf(Action.class), EnumSet.allOf(ActionDesc.class), skipWorkInProgressPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired);
|
||||
PullRequestHookTriggerHandlerImpl(Collection<State> allowedStates, boolean skipWorkInProgressPullRequest, boolean cancelPendingBuildsOnUpdate, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
this(allowedStates, EnumSet.allOf(Action.class), EnumSet.allOf(ActionDesc.class), skipWorkInProgressPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest);
|
||||
}
|
||||
|
||||
PullRequestHookTriggerHandlerImpl(Collection<State> allowedStates, Collection<Action> allowedActions, Collection<ActionDesc> allowedActionDesces, boolean skipWorkInProgressPullRequest, boolean cancelPendingBuildsOnUpdate, boolean ciSkipFroTestNotRequired) {
|
||||
PullRequestHookTriggerHandlerImpl(Collection<State> allowedStates, Collection<Action> allowedActions, Collection<ActionDesc> allowedActionDesces, boolean skipWorkInProgressPullRequest, boolean cancelPendingBuildsOnUpdate, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
|
||||
this.allowedStates = allowedStates;
|
||||
this.allowedActions = allowedActions;
|
||||
this.allowedActionDesces = allowedActionDesces;
|
||||
this.skipWorkInProgressPullRequest = skipWorkInProgressPullRequest;
|
||||
this.cancelPendingBuildsOnUpdate = cancelPendingBuildsOnUpdate;
|
||||
this.ciSkipFroTestNotRequired = ciSkipFroTestNotRequired;
|
||||
this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PullRequestHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PullRequestHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
PullRequestObjectAttributes objectAttributes = hook.getPullRequest();
|
||||
|
||||
try {
|
||||
|
@ -93,7 +102,7 @@ class PullRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pu
|
|||
}
|
||||
|
||||
if (pullRequestLabelFilter.isPullRequestAllowed(labelsNames)) {
|
||||
super.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
super.handle(job, hook, buildInstructionFilter, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -107,10 +116,8 @@ class PullRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pu
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean isCiSkip(PullRequestHook hook) {
|
||||
return hook.getPullRequest() != null
|
||||
&& hook.getPullRequest().getBody() != null
|
||||
&& hook.getPullRequest().getBody().contains("[ci-skip]");
|
||||
protected boolean isCiSkip(PullRequestHook hook, BuildInstructionFilter buildInstructionFilter) {
|
||||
return hook.getPullRequest() == null ? false : !buildInstructionFilter.isBuildAllow(hook.getPullRequest().getBody());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -138,6 +145,43 @@ class PullRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pu
|
|||
this.pendingBuildsHandler.cancelPendingBuilds(job, hook.getPullRequest().getSourceProjectId(), hook.getPullRequest().getSourceBranch());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void cancelIncompleteBuildIfNecessary(Job<?, ?> job, PullRequestHook hook) {
|
||||
if (!cancelIncompleteBuildOnSamePullRequest) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Run<?, ?> build : job.getBuilds()) {
|
||||
if (!job.isBuilding()) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!build.isBuilding()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RevisionParameterAction revisionParameterAction = build.getAction(RevisionParameterAction.class);
|
||||
if (revisionParameterAction != null) {
|
||||
Config config = new Config();
|
||||
config.setString("remote", hook.getRepo().getName(), "url", hook.getRepo().getGitHttpUrl());
|
||||
try {
|
||||
if (revisionParameterAction.canOriginateFrom(RemoteConfig.getAllRemoteConfigs(config))
|
||||
&& revisionParameterAction.commit.equals(hook.getPullRequest().getMergeReferenceName())) {
|
||||
if (build.isBuilding()) {
|
||||
((AbstractBuild) build).doStop();
|
||||
LOGGER.log(Level.WARNING, "Abort incomplete build");
|
||||
}
|
||||
}
|
||||
} catch (URISyntaxException e) {
|
||||
LOGGER.log(Level.WARNING, "Parsing repo url error", e);
|
||||
} catch (ServletException | IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTargetBranch(PullRequestHook hook) {
|
||||
return hook.getPullRequest() == null ? null : hook.getPullRequest().getTargetBranch();
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler.push;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.PushHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -10,7 +11,7 @@ import hudson.model.Job;
|
|||
*/
|
||||
class NopPushHookTriggerHandler implements PushHookTriggerHandler {
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PushHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PushHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
// nothing to do
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import com.gitee.jenkins.gitee.hook.model.Commit;
|
|||
import com.gitee.jenkins.gitee.hook.model.PushHook;
|
||||
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
|
||||
import hudson.model.Job;
|
||||
|
@ -31,19 +32,19 @@ class PushHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<PushHook>
|
|||
private static final String NO_COMMIT = "0000000000000000000000000000000000000000";
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PushHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PushHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
if (isNoRemoveBranchPush(hook)) {
|
||||
super.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
super.handle(job, hook, buildInstructionFilter, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isCiSkip(PushHook hook) {
|
||||
protected boolean isCiSkip(PushHook hook, BuildInstructionFilter buildInstructionFilter) {
|
||||
List<Commit> commits = hook.getCommits();
|
||||
return commits != null &&
|
||||
!commits.isEmpty() &&
|
||||
commits.get(commits.size() - 1).getMessage() != null &&
|
||||
commits.get(commits.size() - 1).getMessage().contains("[ci-skip]");
|
||||
if (commits != null && !commits.isEmpty()) {
|
||||
return !buildInstructionFilter.isBuildAllow(commits.get(commits.size() - 1).getMessage());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.gitee.jenkins.trigger.handler.push;
|
|||
|
||||
import com.gitee.jenkins.gitee.hook.model.PushHook;
|
||||
import com.gitee.jenkins.trigger.filter.BranchFilter;
|
||||
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
|
||||
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
|
||||
import hudson.model.Job;
|
||||
|
||||
|
@ -19,9 +20,9 @@ class PushHookTriggerHandlerList implements PushHookTriggerHandler {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handle(Job<?, ?> job, PushHook hook, boolean ciSkip, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
public void handle(Job<?, ?> job, PushHook hook, BuildInstructionFilter buildInstructionFilter, boolean skipLastCommitHasBeenBuild, BranchFilter branchFilter, PullRequestLabelFilter pullRequestLabelFilter) {
|
||||
for (PushHookTriggerHandler handler : handlers) {
|
||||
handler.handle(job, hook, ciSkip, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
handler.handle(job, hook, buildInstructionFilter, skipLastCommitHasBeenBuild, branchFilter, pullRequestLabelFilter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,5 +4,6 @@ GiteeWebHookCause.ShortDescription.PullRequestHook_html=Triggered by <a href="{3
|
|||
GiteeWebHookCause.ShortDescription.PullRequestHook_plain=Triggered by Gitee Pull Request #{0}: {1} => {2}
|
||||
GiteeWebHookCause.ShortDescription.NoteHook_html=Triggered by {0} <a href="{4}/pulls/{1}" target="_blank">Gitee Pull Request #{1}</a>: {2} => {3}
|
||||
GiteeWebHookCause.ShortDescription.NoteHook_plain=Triggered by {0} Gitee Pull Request #{1}: {2} => {3}
|
||||
GiteeWebHookCause.ShortDescription.Commit_comment=Started by Gitee comment by {0}
|
||||
GiteeWebHookCause.ShortDescription.PipelineHook_noStatus=Started by Gitee Pipeline event
|
||||
GiteeWebHookCause.ShortDescription.PipelineHook=Started by Gitee Pipeline event {0}
|
||||
|
|
|
@ -4,5 +4,6 @@ GiteeWebHookCause.ShortDescription.PullRequestHook_html=\u7531 <a href="{3}/pull
|
|||
GiteeWebHookCause.ShortDescription.PullRequestHook_plain=\u7531 Gitee Pull Request #{0}: {1} => {2} \u89E6\u53D1
|
||||
GiteeWebHookCause.ShortDescription.NoteHook_html=\u7531 {0} <a href="{4}/pulls/{1}" target="_blank">Gitee Pull Request #{1}</a>: {2} => {3} \u89E6\u53D1
|
||||
GiteeWebHookCause.ShortDescription.NoteHook_plain=\u7531 {0} Gitee Pull Request #{1}: {2} => {3} \u89E6\u53D1
|
||||
GiteeWebHookCause.ShortDescription.Commit_comment=Gitee \u7528\u6237 {0} \u8BC4\u8BBA\u63D0\u4EA4\u89E6\u53D1\u6784\u5EFA
|
||||
GiteeWebHookCause.ShortDescription.PipelineHook_noStatus=\u7531 Gitee Pipeline \u89E6\u53D1
|
||||
GiteeWebHookCause.ShortDescription.PipelineHook=\u7531 Gitee Pipeline {0} \u89E6\u53D1
|
||||
|
|
|
@ -40,9 +40,29 @@
|
|||
</f:entry>
|
||||
</table>
|
||||
</f:entry>
|
||||
<f:entry title="${%Enable.CI.Skip}" field="ciSkip" help="/plugin/gitee/help/help-ci-skip.html">
|
||||
<f:checkbox default="true"/>
|
||||
|
||||
<f:entry title="${%Build.Instruction.Filter}">
|
||||
<table>
|
||||
<f:radioBlock name="buildInstructionFilterType"
|
||||
value="NONE"
|
||||
title="${%Build.Instruction.Filter.None}"
|
||||
checked="${instance.buildInstructionFilterType == null || instance.buildInstructionFilterType == 'NONE'}"
|
||||
inline="true"/>
|
||||
<f:radioBlock name="buildInstructionFilterType"
|
||||
value="CI_SKIP"
|
||||
title="${%Build.Instruction.Filter.CiSkip}"
|
||||
checked="${instance.buildInstructionFilterType == 'CI_SKIP'}"
|
||||
inline="true"
|
||||
help="/plugin/gitee/help/help-ci-skip.html"/>
|
||||
<f:radioBlock name="buildInstructionFilterType"
|
||||
value="CI_BUILD"
|
||||
title="${%Build.Instruction.Filter.CiBuild}"
|
||||
checked="${instance.buildInstructionFilterType == 'CI_BUILD'}"
|
||||
inline="true"
|
||||
help="/plugin/gitee/help/help-ci-build.html"/>
|
||||
</table>
|
||||
</f:entry>
|
||||
|
||||
<f:entry title="${%Enable.CI.SkipFroTestNotRequired}" field="ciSkipFroTestNotRequired" help="/plugin/gitee/help/help-ci-skip-test.html">
|
||||
<f:checkbox default="true"/>
|
||||
</f:entry>
|
||||
|
@ -50,6 +70,11 @@
|
|||
<f:entry title="${%Ignore.Last.Commit.Has.Build}" field="skipLastCommitHasBeenBuild" help="/plugin/gitee/help/help-skip-last-commit.html">
|
||||
<f:checkbox default="true"/>
|
||||
</f:entry>
|
||||
|
||||
<f:entry title="${%Cancel.Same.Pull.Request.Incomplete.Build}" field="cancelIncompleteBuildOnSamePullRequest" help="/plugin/gitee/help/help-cancel-same-pull-request-incomplete-build.html">
|
||||
<f:checkbox default="false"/>
|
||||
</f:entry>
|
||||
|
||||
<f:entry title="${%Allowed.branches}">
|
||||
<table>
|
||||
<!--<f:section title="">-->
|
||||
|
|
|
@ -3,6 +3,10 @@ Generate=Generate
|
|||
Clear=Clear
|
||||
Push=Push Events
|
||||
Enable.CI.Skip=Enable [ci-skip]
|
||||
Build.Instruction.Filter=Build instruction filter
|
||||
Build.Instruction.Filter.None=None
|
||||
Build.Instruction.Filter.CiSkip=[ci-skip] skip build
|
||||
Build.Instruction.Filter.CiBuild=[ci-build] trigger build
|
||||
Enable.CI.SkipFroTestNotRequired=Skip ci when test not required
|
||||
Enabled.Gitee.Triggers=Enabled Gitee triggers
|
||||
Approved.Pull.Request=Approved Pull Requests
|
||||
|
@ -33,6 +37,7 @@ Filter.merge.request.by.label=Filter pull request by label
|
|||
Exclude=Exclude
|
||||
Include=Include
|
||||
Ignore.Last.Commit.Has.Build=Ignore last commit has been build
|
||||
Cancel.Same.Pull.Request.Incomplete.Build=Cancel incomplete build on same Pull Requests
|
||||
Comments=Comment Pull Requests
|
||||
Comment.Regex=Comment (regex) for triggering a build
|
||||
Retry.Text=Jenkins please retry a build
|
||||
|
|
|
@ -4,6 +4,10 @@ Clear=\u6E05\u9664
|
|||
Push=\u63A8\u9001\u4EE3\u7801
|
||||
Enable.CI.Skip=\u652F\u6301 [ci-skip] \u6307\u4EE4\u8FC7\u6EE4\u6784\u5EFA
|
||||
Enable.CI.SkipFroTestNotRequired=PR \u4E0D\u8981\u6C42\u5FC5\u987B\u6D4B\u8BD5\u65F6\u8FC7\u6EE4\u6784\u5EFA
|
||||
Build.Instruction.Filter=\u6784\u5EFA\u6307\u4EE4\u8FC7\u6EE4
|
||||
Build.Instruction.Filter.None=\u65E0
|
||||
Build.Instruction.Filter.CiSkip=[ci-skip] \u6307\u4EE4\u8DF3\u8FC7\u6784\u5EFA
|
||||
Build.Instruction.Filter.CiBuild=[ci-build] \u6307\u4EE4\u89E6\u53D1\u6784\u5EFA
|
||||
Enabled.Gitee.Triggers=Gitee \u89E6\u53D1\u6784\u5EFA\u7B56\u7565
|
||||
Approved.Pull.Request=\u5BA1\u67E5\u901A\u8FC7 Pull Requests
|
||||
Tested.Pull.Request=\u6D4B\u8BD5\u901A\u8FC7 Pull Requests
|
||||
|
@ -33,6 +37,7 @@ Filter.merge.request.by.label=\u6839\u636E\u6807\u7B7E\u8FC7\u6EE4PR
|
|||
Exclude=\u6392\u9664
|
||||
Include=\u5305\u62EC
|
||||
Ignore.Last.Commit.Has.Build=\u8FC7\u6EE4\u5DF2\u7ECF\u6784\u5EFA\u7684 Commit \u7248\u672C
|
||||
Cancel.Same.Pull.Request.Incomplete.Build=\u53D6\u6D88\u76F8\u540C Pull Requests \u672A\u5B8C\u6210\u6784\u5EFA
|
||||
Comments=\u8BC4\u8BBA Pull Requests
|
||||
Comment.Regex=\u8BC4\u8BBA\u5185\u5BB9\u7684\u6B63\u5219\u8868\u8FBE\u5F0F
|
||||
Retry.Text=Jenkins please retry a build
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<div>
|
||||
If there is an building build for the same PR,
|
||||
cancel the building build and trigger the current build
|
||||
</div>
|
|
@ -0,0 +1,3 @@
|
|||
<div>
|
||||
如果相同 PR 存在进行中的构建,则取消进行中构建,触发当前构建
|
||||
</div>
|
|
@ -0,0 +1,4 @@
|
|||
<div>
|
||||
For Push hook: build if the commit message contains <code>[ci-build]</code>.
|
||||
For Pull Request hook: build if the pull request body contains <code>[ci-build]</code>.
|
||||
</div>
|
|
@ -0,0 +1,8 @@
|
|||
<div>
|
||||
<p>
|
||||
代码推送触发: 若推送的最后一个提交的描述信息包含 <code>[ci-build]</code>,则触发构建。
|
||||
</p>
|
||||
<p>
|
||||
PR 操作触发: 若 PR 的内容描述信息包含 <code>[ci-build]</code>,则触发构建。
|
||||
</p>
|
||||
</div>
|
Loading…
Reference in New Issue