Skip to content

Commit 4cb5130

Browse files
committed
feat: 支持在任务中停用单个机器人
1 parent b45fbc7 commit 4cb5130

File tree

5 files changed

+208
-190
lines changed

5 files changed

+208
-190
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<version>2.6.3-SNAPSHOT</version>
1414
<packaging>hpi</packaging>
1515
<properties>
16-
<jenkins.version>2.361.4</jenkins.version>
16+
<jenkins.version>2.387.1</jenkins.version>
1717
<hpi.compatibleSinceVersion>2.0.0</hpi.compatibleSinceVersion>
1818
</properties>
1919

src/main/java/io/jenkins/plugins/DingTalkJobProperty.java

+63-58
Original file line numberDiff line numberDiff line change
@@ -20,73 +20,78 @@
2020
@NoArgsConstructor
2121
public class DingTalkJobProperty extends JobProperty<Job<?, ?>> {
2222

23-
private ArrayList<DingTalkNotifierConfig> notifierConfigs;
23+
private ArrayList<DingTalkNotifierConfig> notifierConfigs;
2424

25-
/**
26-
* 在配置页面展示的列表,需要跟 `全局配置` 同步机器人信息
27-
*
28-
* @return 机器人配置列表
29-
*/
30-
public ArrayList<DingTalkNotifierConfig> getNotifierConfigs() {
31-
ArrayList<DingTalkNotifierConfig> notifierConfigList = new ArrayList<>();
32-
ArrayList<DingTalkRobotConfig> robotConfigs = DingTalkGlobalConfig.getInstance()
33-
.getRobotConfigs();
25+
/**
26+
* 在配置页面展示的列表,需要跟 `全局配置` 同步机器人信息
27+
*
28+
* @return 机器人配置列表
29+
*/
30+
public ArrayList<DingTalkNotifierConfig> getNotifierConfigs() {
31+
ArrayList<DingTalkNotifierConfig> notifierConfigList = new ArrayList<>();
32+
ArrayList<DingTalkRobotConfig> robotConfigs = DingTalkGlobalConfig.getInstance()
33+
.getRobotConfigs();
3434

35-
for (DingTalkRobotConfig robotConfig : robotConfigs) {
36-
String id = robotConfig.getId();
37-
DingTalkNotifierConfig newNotifierConfig = new DingTalkNotifierConfig(robotConfig);
35+
for (DingTalkRobotConfig robotConfig : robotConfigs) {
36+
String id = robotConfig.getId();
37+
DingTalkNotifierConfig newNotifierConfig = new DingTalkNotifierConfig(robotConfig);
3838

39-
if (this.notifierConfigs != null) {
40-
for (DingTalkNotifierConfig notifierConfig : this.notifierConfigs) {
41-
String robotId = notifierConfig.getRobotId();
42-
if (id.equals(robotId)) {
43-
newNotifierConfig.copy(notifierConfig);
44-
}
45-
}
46-
}
39+
if (this.notifierConfigs != null) {
40+
for (DingTalkNotifierConfig notifierConfig : this.notifierConfigs) {
41+
String robotId = notifierConfig.getRobotId();
42+
if (id.equals(robotId)) {
43+
newNotifierConfig.copy(notifierConfig);
44+
}
45+
}
46+
}
4747

48-
notifierConfigList.add(newNotifierConfig);
49-
}
48+
notifierConfigList.add(newNotifierConfig);
49+
}
5050

51-
return notifierConfigList;
52-
}
51+
return notifierConfigList;
52+
}
5353

54-
/**
55-
* 获取用户设置的通知配置
56-
*
57-
* @return 用户设置的通知配置
58-
*/
59-
public List<DingTalkNotifierConfig> getCheckedNotifierConfigs() {
60-
ArrayList<DingTalkNotifierConfig> notifierConfigs = this.getNotifierConfigs();
54+
/**
55+
* 获取用户设置的通知配置
56+
*
57+
* @return 用户设置的通知配置
58+
*/
59+
public List<DingTalkNotifierConfig> getCheckedNotifierConfigs() {
60+
return this.getNotifierConfigs().stream()
61+
.filter(DingTalkNotifierConfig::isChecked)
62+
.collect(Collectors.toList());
63+
}
6164

62-
return notifierConfigs.stream().filter(DingTalkNotifierConfig::isChecked)
63-
.collect(Collectors.toList());
64-
}
65+
public List<DingTalkNotifierConfig> getAvailableNotifierConfigs() {
66+
return this.getNotifierConfigs().stream()
67+
.filter(t -> t.isChecked() && !t.isDisabled())
68+
.collect(Collectors.toList());
69+
}
6570

66-
@DataBoundConstructor
67-
public DingTalkJobProperty(ArrayList<DingTalkNotifierConfig> notifierConfigs) {
68-
this.notifierConfigs = notifierConfigs;
69-
}
71+
@DataBoundConstructor
72+
public DingTalkJobProperty(ArrayList<DingTalkNotifierConfig> notifierConfigs) {
73+
this.notifierConfigs = notifierConfigs;
74+
}
7075

71-
@Extension
72-
public static class DingTalkJobPropertyDescriptor extends JobPropertyDescriptor {
76+
@Extension
77+
public static class DingTalkJobPropertyDescriptor extends JobPropertyDescriptor {
7378

74-
@Override
75-
public boolean isApplicable(Class<? extends Job> jobType) {
76-
return super.isApplicable(jobType);
77-
}
79+
@Override
80+
public boolean isApplicable(Class<? extends Job> jobType) {
81+
return super.isApplicable(jobType);
82+
}
7883

79-
/**
80-
* 默认的配置项列表
81-
*
82-
* @return 默认的通知配置列表
83-
*/
84-
public List<DingTalkNotifierConfig> getDefaultNotifierConfigs() {
85-
return DingTalkGlobalConfig.getInstance()
86-
.getRobotConfigs()
87-
.stream()
88-
.map(DingTalkNotifierConfig::new)
89-
.collect(Collectors.toList());
90-
}
91-
}
84+
/**
85+
* 默认的配置项列表
86+
*
87+
* @return 默认的通知配置列表
88+
*/
89+
public List<DingTalkNotifierConfig> getDefaultNotifierConfigs() {
90+
return DingTalkGlobalConfig.getInstance()
91+
.getRobotConfigs()
92+
.stream()
93+
.map(DingTalkNotifierConfig::new)
94+
.collect(Collectors.toList());
95+
}
96+
}
9297
}

src/main/java/io/jenkins/plugins/DingTalkNotifierConfig.java

+100-90
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import hudson.model.AbstractDescribableImpl;
66
import hudson.model.Descriptor;
77
import io.jenkins.plugins.enums.NoticeOccasionEnum;
8+
import java.lang.reflect.InvocationTargetException;
89
import java.util.Arrays;
910
import java.util.HashSet;
1011
import java.util.Set;
1112
import java.util.stream.Collectors;
1213
import lombok.Getter;
1314
import lombok.Setter;
1415
import lombok.ToString;
16+
import lombok.extern.slf4j.Slf4j;
17+
import org.apache.commons.beanutils.BeanUtils;
1518
import org.apache.commons.lang.StringUtils;
1619
import org.kohsuke.stapler.DataBoundConstructor;
1720

@@ -21,96 +24,103 @@
2124
@Getter
2225
@Setter
2326
@ToString
27+
@Slf4j
2428
public class DingTalkNotifierConfig extends AbstractDescribableImpl<DingTalkNotifierConfig> {
2529

26-
private boolean checked;
27-
28-
private String robotId;
29-
30-
private String robotName;
31-
32-
private boolean atAll;
33-
34-
private String atMobile;
35-
36-
private String content;
37-
38-
private Set<String> noticeOccasions;
39-
40-
private static Set<String> getDefaultNoticeOccasions() {
41-
return DingTalkGlobalConfig.getInstance().getNoticeOccasions();
42-
}
43-
44-
public Set<String> getNoticeOccasions() {
45-
return noticeOccasions == null ? getDefaultNoticeOccasions() : noticeOccasions;
46-
}
47-
48-
public Set<String> resolveAtMobiles(EnvVars envVars) {
49-
if (StringUtils.isEmpty(atMobile)) {
50-
return new HashSet<>(16);
51-
}
52-
String realMobile = envVars.expand(atMobile);
53-
return Arrays.stream(
54-
StringUtils.split(
55-
// 支持多行,一行支持多个手机号
56-
realMobile.replace("\n", ","),
57-
","
58-
)
59-
)
60-
.collect(Collectors.toSet());
61-
}
62-
63-
public String getContent() {
64-
return content == null ? "" : content;
65-
}
66-
67-
@DataBoundConstructor
68-
public DingTalkNotifierConfig(
69-
boolean checked,
70-
String robotId,
71-
String robotName,
72-
boolean atAll,
73-
String atMobile,
74-
String content,
75-
Set<String> noticeOccasions) {
76-
this.checked = checked;
77-
this.robotId = robotId;
78-
this.robotName = robotName;
79-
this.atAll = atAll;
80-
this.atMobile = atMobile;
81-
this.content = content;
82-
this.noticeOccasions = noticeOccasions;
83-
}
84-
85-
public DingTalkNotifierConfig(DingTalkRobotConfig robotConfig) {
86-
this(
87-
false,
88-
robotConfig.getId(),
89-
robotConfig.getName(),
90-
false,
91-
null,
92-
null,
93-
getDefaultNoticeOccasions());
94-
}
95-
96-
public void copy(DingTalkNotifierConfig notifierConfig) {
97-
this.setChecked(notifierConfig.isChecked());
98-
this.setAtAll(notifierConfig.isAtAll());
99-
this.setAtMobile(notifierConfig.getAtMobile());
100-
this.setContent(notifierConfig.getContent());
101-
this.setNoticeOccasions(notifierConfig.getNoticeOccasions());
102-
}
103-
104-
@Extension
105-
public static class DingTalkNotifierConfigDescriptor extends Descriptor<DingTalkNotifierConfig> {
106-
107-
/**
108-
* 通知时机列表
109-
*
110-
* @return 通知时机
111-
*/
112-
public NoticeOccasionEnum[] getNoticeOccasionTypes() {
113-
return NoticeOccasionEnum.values();
114-
}
115-
}
30+
private boolean disabled;
31+
private boolean checked;
32+
33+
private String robotId;
34+
35+
private String robotName;
36+
37+
private boolean atAll;
38+
39+
private String atMobile;
40+
41+
private String content;
42+
43+
private Set<String> noticeOccasions;
44+
45+
private static Set<String> getDefaultNoticeOccasions() {
46+
return DingTalkGlobalConfig.getInstance().getNoticeOccasions();
47+
}
48+
49+
public Set<String> getNoticeOccasions() {
50+
return noticeOccasions == null ? getDefaultNoticeOccasions() : noticeOccasions;
51+
}
52+
53+
public Set<String> resolveAtMobiles(EnvVars envVars) {
54+
if (StringUtils.isEmpty(atMobile)) {
55+
return new HashSet<>(16);
56+
}
57+
String realMobile = envVars.expand(atMobile);
58+
return Arrays.stream(
59+
StringUtils.split(
60+
// 支持多行,一行支持多个手机号
61+
realMobile.replace("\n", ","),
62+
","
63+
)
64+
)
65+
.collect(Collectors.toSet());
66+
}
67+
68+
public String getContent() {
69+
return content == null ? "" : content;
70+
}
71+
72+
@DataBoundConstructor
73+
public DingTalkNotifierConfig(
74+
boolean disabled,
75+
boolean checked,
76+
String robotId,
77+
String robotName,
78+
boolean atAll,
79+
String atMobile,
80+
String content,
81+
Set<String> noticeOccasions) {
82+
this.disabled = disabled;
83+
this.checked = checked;
84+
this.robotId = robotId;
85+
this.robotName = robotName;
86+
this.atAll = atAll;
87+
this.atMobile = atMobile;
88+
this.content = content;
89+
this.noticeOccasions = noticeOccasions;
90+
}
91+
92+
public DingTalkNotifierConfig(DingTalkRobotConfig robotConfig) {
93+
this(
94+
false,
95+
false,
96+
robotConfig.getId(),
97+
robotConfig.getName(),
98+
false,
99+
null,
100+
null,
101+
getDefaultNoticeOccasions()
102+
);
103+
}
104+
105+
public void copy(DingTalkNotifierConfig notifierConfig) {
106+
try {
107+
BeanUtils.copyProperties(this, notifierConfig);
108+
} catch (IllegalAccessException | InvocationTargetException e) {
109+
log.error("读取机器人配置失败", e);
110+
throw new RuntimeException(e);
111+
}
112+
}
113+
114+
@Extension
115+
public static class DingTalkNotifierConfigDescriptor extends Descriptor<DingTalkNotifierConfig> {
116+
117+
/**
118+
* 通知时机列表
119+
*
120+
* @return 通知时机
121+
*/
122+
public NoticeOccasionEnum[] getNoticeOccasionTypes() {
123+
return NoticeOccasionEnum.values();
124+
}
125+
}
116126
}

src/main/java/io/jenkins/plugins/DingTalkRunListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ private void send(Run<?, ?> run, TaskListener listener, NoticeOccasionEnum notic
222222
String duration = run.getDurationString();
223223
List<ButtonModel> btns = Utils.createDefaultBtns(jobUrl);
224224
List<String> result = new ArrayList<>();
225-
List<DingTalkNotifierConfig> notifierConfigs = property.getCheckedNotifierConfigs();
225+
List<DingTalkNotifierConfig> notifierConfigs = property.getAvailableNotifierConfigs();
226226

227227
for (DingTalkNotifierConfig item : notifierConfigs) {
228228
boolean skipped = skip(listener, noticeOccasion, item);

0 commit comments

Comments
 (0)