增加commit评论触发开关

并发构建取消逻辑修改
README更新
This commit is contained in:
Guixian Zhang 2020-12-30 19:01:45 +08:00
parent ba9dc1aa7b
commit 78b74b6563
8 changed files with 84 additions and 46 deletions

View File

@ -28,6 +28,7 @@ Gitee Jenkins Plugin 是码云基于 [GitLab Plugin](https://github.com/jenkinsc
## 目前支持特性: ## 目前支持特性:
- 推送代码到码云时,由配置的 WebHook 触发 Jenkins 任务构建。 - 推送代码到码云时,由配置的 WebHook 触发 Jenkins 任务构建。
- 评论提交记录触发提交记录对应版本 Jenkins 任务构建
- 提交 Pull Request 到码云项目时,由配置的 WebHook 触发 Jenkins 任务构建支持PR动作新建更新接受关闭审查通过测试通过。 - 提交 Pull Request 到码云项目时,由配置的 WebHook 触发 Jenkins 任务构建支持PR动作新建更新接受关闭审查通过测试通过。
- 支持 [ci-skip] 指令过滤 或者 [ci-build] 指令触发构建。 - 支持 [ci-skip] 指令过滤 或者 [ci-build] 指令触发构建。
- 过滤已经构建的 Commit 版本,若是分支 Push则相同分支Push才过滤若是 PR则是同一个PR才过滤。 - 过滤已经构建的 Commit 版本,若是分支 Push则相同分支Push才过滤若是 PR则是同一个PR才过滤。
@ -121,17 +122,22 @@ Gitee Jenkins Plugin 是码云基于 [GitLab Plugin](https://github.com/jenkinsc
1. ``Enabled Gitee triggers`` 勾选您所需要的构建触发规则,如 `Push Event`, `Opened Merge Request Events`勾选的事件会接受WebHook触发构建。目前支持触发事件有 1. ``Enabled Gitee triggers`` 勾选您所需要的构建触发规则,如 `Push Event`, `Opened Merge Request Events`勾选的事件会接受WebHook触发构建。目前支持触发事件有
- Push Events :推送代码事件 - Push Events :推送代码事件
- Commit Comment Events :评论提交记录事件
- Opened Merge Request Events :提交 PR 事件 - Opened Merge Request Events :提交 PR 事件
- Updated Merge Request Events :更新 PR 事件 - Updated Merge Request Events :更新 PR 事件
- Accepted Merge Request Events :接受/合并 PR 事件 - Accepted Merge Request Events :接受/合并 PR 事件
- Closed Merge Request Events :关闭 PR 事件 - Closed Merge Request Events :关闭 PR 事件
- Approved Pull Requests 审查通过 PR 事件 - Approved Pull Requests 审查通过 PR 事件
- Tested Pull Requests :测试通过 PR 事件 - Tested Pull Requests :测试通过 PR 事件
2. `Enable [ci-skip]` 该选项可以开启支持 `[ci-skip]` 指令只要commit message 中包含 `[ci-skip]`当前commit 即可跳过构建触发。 2. `Build Instruction Filter` :
- `None` : 无过滤
- `[ci-skip] skip build` commit message 或者 PR 说明包含 `[ci-skip]` 时,跳过构建触发。
- `[ci-build] trigger build` commit message 或者 PR 说明包含 `[ci-build]` 时,触发构建。
3. `Ignore last commit has build` 该选项可以跳过已经构建过的 Commit 版本。 3. `Ignore last commit has build` 该选项可以跳过已经构建过的 Commit 版本。
4. `Allowed branches` 可以配置允许构建的分支,目前支持分支名和正则表达式的方式进行过滤。 4. `Cancel incomplete build on same Pull Requests` 该选项在 PR 触发构建时,会判断是否存在相同 PR 且未完成的构建,有则取消未完成构建,再进行当前构建。
5. `Secret Token for Gitee WebHook` 该选项可以配置 WebHook 的密码,该密码需要与码云 WebHook配置的密码一致方可触发构建。 5. `Allowed branches` 可以配置允许构建的分支,目前支持分支名和正则表达式的方式进行过滤。
6. 注意:若 PR 状态为不可自动合并,则不触发构建。 6. `Secret Token for Gitee WebHook` 该选项可以配置 WebHook 的密码,该密码需要与码云 WebHook配置的密码一致方可触发构建。
7. 注意:若 PR 状态为不可自动合并,则不触发构建。
![触发器配置](https://images.gitee.com/uploads/images/2018/0724/120539_106f7480_58426.png "屏幕截图.png") ![触发器配置](https://images.gitee.com/uploads/images/2018/0724/120539_106f7480_58426.png "屏幕截图.png")

View File

@ -65,6 +65,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
private static final SecureRandom RANDOM = new SecureRandom(); private static final SecureRandom RANDOM = new SecureRandom();
private boolean triggerOnPush = true; private boolean triggerOnPush = true;
private boolean triggerOnCommitComment = false;
private boolean triggerOnOpenPullRequest = true; private boolean triggerOnOpenPullRequest = true;
private boolean triggerOnPipelineEvent = false; private boolean triggerOnPipelineEvent = false;
private boolean triggerOnAcceptedPullRequest = false; private boolean triggerOnAcceptedPullRequest = false;
@ -109,6 +110,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
@Deprecated @Deprecated
@GeneratePojoBuilder(intoPackage = "*.builder.generated", withFactoryMethod = "*") @GeneratePojoBuilder(intoPackage = "*.builder.generated", withFactoryMethod = "*")
public GiteePushTrigger(boolean triggerOnPush, public GiteePushTrigger(boolean triggerOnPush,
boolean triggerOnCommitComment,
boolean triggerOnOpenPullRequest, boolean triggerOnOpenPullRequest,
String triggerOnUpdatePullRequest, String triggerOnUpdatePullRequest,
boolean triggerOnAcceptedPullRequest, boolean triggerOnAcceptedPullRequest,
@ -123,6 +125,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
boolean triggerOnApprovedPullRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate, boolean triggerOnApprovedPullRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate,
boolean cancelIncompleteBuildOnSamePullRequest) { boolean cancelIncompleteBuildOnSamePullRequest) {
this.triggerOnPush = triggerOnPush; this.triggerOnPush = triggerOnPush;
this.triggerOnCommitComment = triggerOnCommitComment;
this.triggerOnOpenPullRequest = triggerOnOpenPullRequest; this.triggerOnOpenPullRequest = triggerOnOpenPullRequest;
this.triggerOnUpdatePullRequest = triggerOnUpdatePullRequest; this.triggerOnUpdatePullRequest = triggerOnUpdatePullRequest;
this.triggerOnAcceptedPullRequest = triggerOnAcceptedPullRequest; this.triggerOnAcceptedPullRequest = triggerOnAcceptedPullRequest;
@ -225,6 +228,10 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
return triggerOnPush; return triggerOnPush;
} }
public boolean isTriggerOnCommitComment() {
return triggerOnCommitComment;
}
public boolean getTriggerOnOpenPullRequest() { public boolean getTriggerOnOpenPullRequest() {
return triggerOnOpenPullRequest; return triggerOnOpenPullRequest;
} }
@ -332,6 +339,11 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
this.triggerOnPush = triggerOnPush; this.triggerOnPush = triggerOnPush;
} }
@DataBoundSetter
public void setTriggerOnCommitComment(boolean triggerOnCommitComment) {
this.triggerOnCommitComment = triggerOnCommitComment;
}
@DataBoundSetter @DataBoundSetter
public void setTriggerOnApprovedPullRequest(boolean triggerOnApprovedPullRequest) { public void setTriggerOnApprovedPullRequest(boolean triggerOnApprovedPullRequest) {
this.triggerOnApprovedPullRequest = triggerOnApprovedPullRequest; this.triggerOnApprovedPullRequest = triggerOnApprovedPullRequest;
@ -535,7 +547,7 @@ public class GiteePushTrigger extends Trigger<Job<?, ?>> {
skipWorkInProgressPullRequest, triggerOnApprovedPullRequest, triggerOnTestedPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired, skipWorkInProgressPullRequest, triggerOnApprovedPullRequest, triggerOnTestedPullRequest, cancelPendingBuildsOnUpdate, ciSkipFroTestNotRequired,
cancelIncompleteBuildOnSamePullRequest cancelIncompleteBuildOnSamePullRequest
); );
noteHookTriggerHandler = newNoteHookTriggerHandler(triggerOnNoteRequest, noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest); noteHookTriggerHandler = newNoteHookTriggerHandler(triggerOnCommitComment, triggerOnNoteRequest, noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest);
pushHookTriggerHandler = newPushHookTriggerHandler(triggerOnPush, skipWorkInProgressPullRequest); pushHookTriggerHandler = newPushHookTriggerHandler(triggerOnPush, skipWorkInProgressPullRequest);
pipelineTriggerHandler = newPipelineHookTriggerHandler(triggerOnPipelineEvent); pipelineTriggerHandler = newPipelineHookTriggerHandler(triggerOnPipelineEvent);
} }

View File

@ -7,9 +7,9 @@ public final class NoteHookTriggerHandlerFactory {
private NoteHookTriggerHandlerFactory() {} private NoteHookTriggerHandlerFactory() {}
public static NoteHookTriggerHandler newNoteHookTriggerHandler(boolean triggerOnNoteRequest, String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) { public static NoteHookTriggerHandler newNoteHookTriggerHandler(boolean triggerOnCommitComment, boolean triggerOnNoteRequest, String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
if (triggerOnNoteRequest) { if (triggerOnCommitComment || triggerOnNoteRequest) {
return new NoteHookTriggerHandlerImpl(noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest); return new NoteHookTriggerHandlerImpl(triggerOnCommitComment, triggerOnNoteRequest, noteRegex, ciSkipFroTestNotRequired, cancelIncompleteBuildOnSamePullRequest);
} else { } else {
return new NopNoteHookTriggerHandler(); return new NopNoteHookTriggerHandler();
} }

View File

@ -1,6 +1,7 @@
package com.gitee.jenkins.trigger.handler.note; package com.gitee.jenkins.trigger.handler.note;
import com.gitee.jenkins.cause.CauseData; import com.gitee.jenkins.cause.CauseData;
import com.gitee.jenkins.cause.GiteeWebHookCause;
import com.gitee.jenkins.gitee.api.GiteeClient; import com.gitee.jenkins.gitee.api.GiteeClient;
import com.gitee.jenkins.gitee.api.model.PullRequest; import com.gitee.jenkins.gitee.api.model.PullRequest;
import com.gitee.jenkins.gitee.hook.model.*; import com.gitee.jenkins.gitee.hook.model.*;
@ -10,18 +11,13 @@ import com.gitee.jenkins.trigger.filter.BranchFilter;
import com.gitee.jenkins.trigger.filter.BuildInstructionFilter; import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter; import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler; import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
import hudson.model.AbstractBuild; import hudson.model.*;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.git.GitSCM; import hudson.plugins.git.GitSCM;
import hudson.plugins.git.RevisionParameterAction; import hudson.plugins.git.RevisionParameterAction;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.transport.RemoteConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -38,11 +34,15 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
private static final Logger LOGGER = Logger.getLogger(NoteHookTriggerHandlerImpl.class.getName()); private static final Logger LOGGER = Logger.getLogger(NoteHookTriggerHandlerImpl.class.getName());
private final boolean triggerOnCommitComment;
private final boolean triggerOnNoteRequest;
private final String noteRegex; private final String noteRegex;
private final boolean ciSkipFroTestNotRequired; private final boolean ciSkipFroTestNotRequired;
private final boolean cancelIncompleteBuildOnSamePullRequest; private final boolean cancelIncompleteBuildOnSamePullRequest;
NoteHookTriggerHandlerImpl(String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) { NoteHookTriggerHandlerImpl(boolean triggerOnCommitComment, boolean triggerOnNoteRequest, String noteRegex, boolean ciSkipFroTestNotRequired, boolean cancelIncompleteBuildOnSamePullRequest) {
this.triggerOnCommitComment = triggerOnCommitComment;
this.triggerOnNoteRequest = triggerOnNoteRequest;
this.noteRegex = noteRegex; this.noteRegex = noteRegex;
this.ciSkipFroTestNotRequired = ciSkipFroTestNotRequired; this.ciSkipFroTestNotRequired = ciSkipFroTestNotRequired;
this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest; this.cancelIncompleteBuildOnSamePullRequest = cancelIncompleteBuildOnSamePullRequest;
@ -101,20 +101,27 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
continue; continue;
} }
RevisionParameterAction revisionParameterAction = build.getAction(RevisionParameterAction.class); CauseAction causeAction = build.getAction(CauseAction.class);
if (revisionParameterAction != null) { GiteeWebHookCause giteeWebHookCause = null;
Config config = new Config(); for (Cause cause : causeAction.getCauses()) {
config.setString("remote", hook.getRepository().getName(), "url", hook.getRepository().getGitHttpUrl()); if (cause instanceof GiteeWebHookCause) {
giteeWebHookCause = (GiteeWebHookCause) cause;
break;
}
}
if (giteeWebHookCause == null) {
continue;
}
CauseData causeData = giteeWebHookCause.getData();
if (causeData.getSourceRepoHttpUrl().equals(hook.getPullRequest().getSource().getGitHttpUrl())
&& causeData.getTargetRepoHttpUrl().equals(hook.getPullRequest().getTarget().getGitHttpUrl())
&& causeData.getRef().equals(hook.getPullRequest().getMergeReferenceName())) {
try { try {
if (revisionParameterAction.canOriginateFrom(RemoteConfig.getAllRemoteConfigs(config)) if (build.isBuilding()) {
&& revisionParameterAction.commit.equals(hook.getPullRequest().getMergeReferenceName())) { ((AbstractBuild) build).doStop();
if (build.isBuilding()) { LOGGER.log(Level.WARNING, "Abort incomplete build");
((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) { } catch (ServletException | IOException e) {
LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e); LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e);
} }
@ -232,7 +239,9 @@ class NoteHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<NoteHook>
} }
private boolean isValidTrigger(NoteHook hook) { private boolean isValidTrigger(NoteHook hook) {
return (isValidTriggerPhrase(hook.getComment().getBody()) && isValidTriggerAction(hook.getAction())); // commit评论pullRequest为null
return ((triggerOnCommitComment && hook.getPullRequest() == null) || (triggerOnNoteRequest && hook.getPullRequest() != null))
&& (isValidTriggerPhrase(hook.getComment().getBody()) && isValidTriggerAction(hook.getAction()));
} }
private boolean isValidTriggerAction(NoteAction action) { private boolean isValidTriggerAction(NoteAction action) {

View File

@ -5,6 +5,7 @@ import com.gitee.jenkins.cause.GiteeWebHookCause;
import com.gitee.jenkins.gitee.api.GiteeClient; import com.gitee.jenkins.gitee.api.GiteeClient;
import com.gitee.jenkins.gitee.api.model.PullRequest; import com.gitee.jenkins.gitee.api.model.PullRequest;
import com.gitee.jenkins.gitee.hook.model.*; import com.gitee.jenkins.gitee.hook.model.*;
import com.gitee.jenkins.gitee.hook.model.Action;
import com.gitee.jenkins.gitee.hook.model.PullRequestHook; import com.gitee.jenkins.gitee.hook.model.PullRequestHook;
import com.gitee.jenkins.publisher.GiteeMessagePublisher; import com.gitee.jenkins.publisher.GiteeMessagePublisher;
import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException; import com.gitee.jenkins.trigger.exception.NoRevisionToBuildException;
@ -13,18 +14,13 @@ import com.gitee.jenkins.trigger.filter.BuildInstructionFilter;
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter; import com.gitee.jenkins.trigger.filter.PullRequestLabelFilter;
import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler; import com.gitee.jenkins.trigger.handler.AbstractWebHookTriggerHandler;
import com.gitee.jenkins.util.BuildUtil; import com.gitee.jenkins.util.BuildUtil;
import hudson.model.AbstractBuild; import hudson.model.*;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.git.GitSCM; import hudson.plugins.git.GitSCM;
import hudson.plugins.git.RevisionParameterAction; import hudson.plugins.git.RevisionParameterAction;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.transport.RemoteConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collection; import java.util.Collection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -160,24 +156,32 @@ class PullRequestHookTriggerHandlerImpl extends AbstractWebHookTriggerHandler<Pu
continue; continue;
} }
RevisionParameterAction revisionParameterAction = build.getAction(RevisionParameterAction.class); CauseAction causeAction = build.getAction(CauseAction.class);
if (revisionParameterAction != null) { GiteeWebHookCause giteeWebHookCause = null;
Config config = new Config(); for (Cause cause : causeAction.getCauses()) {
config.setString("remote", hook.getRepo().getName(), "url", hook.getRepo().getGitHttpUrl()); if (cause instanceof GiteeWebHookCause) {
giteeWebHookCause = (GiteeWebHookCause) cause;
break;
}
}
if (giteeWebHookCause == null) {
continue;
}
CauseData causeData = giteeWebHookCause.getData();
if (causeData.getSourceRepoHttpUrl().equals(hook.getPullRequest().getSource().getGitHttpUrl())
&& causeData.getTargetRepoHttpUrl().equals(hook.getPullRequest().getTarget().getGitHttpUrl())
&& causeData.getRef().equals(hook.getPullRequest().getMergeReferenceName())) {
try { try {
if (revisionParameterAction.canOriginateFrom(RemoteConfig.getAllRemoteConfigs(config)) if (build.isBuilding()) {
&& revisionParameterAction.commit.equals(hook.getPullRequest().getMergeReferenceName())) { ((AbstractBuild) build).doStop();
if (build.isBuilding()) { LOGGER.log(Level.WARNING, "Abort incomplete build");
((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) { } catch (ServletException | IOException e) {
LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e); LOGGER.log(Level.WARNING, "Unable to abort incomplete build", e);
} }
} }
} }
} }

View File

@ -6,6 +6,11 @@
<f:entry title="${%Push}" field="triggerOnPush"> <f:entry title="${%Push}" field="triggerOnPush">
<f:checkbox default="true"/> <f:checkbox default="true"/>
</f:entry> </f:entry>
<f:entry title="${%Commit.Comment}" field="triggerOnCommitComment">
<f:checkbox default="false"/>
</f:entry>
<f:entry title="${%Opened.Pull.Request}" field="triggerOnOpenPullRequest"> <f:entry title="${%Opened.Pull.Request}" field="triggerOnOpenPullRequest">
<f:checkbox default="true"/> <f:checkbox default="true"/>
</f:entry> </f:entry>

View File

@ -2,6 +2,7 @@ Secret.Token=Secret Token for Gitee WebHook
Generate=Generate Generate=Generate
Clear=Clear Clear=Clear
Push=Push Events Push=Push Events
Commit.Comment=Commit Comment Events
Enable.CI.Skip=Enable [ci-skip] Enable.CI.Skip=Enable [ci-skip]
Build.Instruction.Filter=Build instruction filter Build.Instruction.Filter=Build instruction filter
Build.Instruction.Filter.None=None Build.Instruction.Filter.None=None

View File

@ -2,6 +2,7 @@ Secret.Token=Gitee WebHook \u5BC6\u7801
Generate=\u751F\u6210 Generate=\u751F\u6210
Clear=\u6E05\u9664 Clear=\u6E05\u9664
Push=\u63A8\u9001\u4EE3\u7801 Push=\u63A8\u9001\u4EE3\u7801
Commit.Comment=\u8BC4\u8BBA\u63D0\u4EA4\u8BB0\u5F55
Enable.CI.Skip=\u652F\u6301 [ci-skip] \u6307\u4EE4\u8FC7\u6EE4\u6784\u5EFA 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 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=\u6784\u5EFA\u6307\u4EE4\u8FC7\u6EE4