Skip to content

Commit 025c3ec

Browse files
authored
Merge pull request #373 from FlowCI/feature/1498
Feature/1498
2 parents 6aa19fe + 838d424 commit 025c3ec

File tree

10 files changed

+94
-8
lines changed

10 files changed

+94
-8
lines changed

core/src/main/java/com/flowci/core/agent/domain/ShellIn.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ public enum ShellType {
4444

4545
private List<String> pwsh;
4646

47-
private int timeout = 1800;
47+
private int timeout = 1800; // from StepNode.timeout
48+
49+
private int retry; // from StepNode.retry
4850

4951
private Vars<String> inputs;
5052

core/src/main/java/com/flowci/core/agent/manager/AgentEventManager.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,19 @@ public <T> void writeMessage(String token, ResponseMessage<T> msg) {
5454

5555
try {
5656
byte[] bytes = objectMapper.writeValueAsBytes(msg);
57-
session.sendMessage(new BinaryMessage(bytes));
57+
writeMessage(session, bytes);
5858
} catch (IOException e) {
5959
log.warn("Unable to write response message for agent {}: {}", token, e.getMessage());
6060
}
6161
}
6262

63-
public void writeMessage(String token, byte[] bytes) throws IOException {
63+
public void writeMessage(String token, byte[] bytes) {
6464
WebSocketSession session = agentSessionStore.get(token);
6565
if (session == null) {
6666
log.warn("Agent {} not connected", token);
6767
return;
6868
}
69-
70-
session.sendMessage(new BinaryMessage(bytes));
69+
writeMessage(session, bytes);
7170
}
7271

7372
@Override
@@ -123,12 +122,22 @@ public void afterConnectionClosed(WebSocketSession session, CloseStatus status)
123122
private <T> void writeMessage(WebSocketSession session, ResponseMessage<T> msg) {
124123
try {
125124
byte[] bytes = objectMapper.writeValueAsBytes(msg);
126-
session.sendMessage(new BinaryMessage(bytes));
125+
writeMessage(session, bytes);
127126
} catch (IOException e) {
128127
log.warn(e);
129128
}
130129
}
131130

131+
private void writeMessage(WebSocketSession session, byte[] body) {
132+
synchronized (session) {
133+
try {
134+
session.sendMessage(new BinaryMessage(body));
135+
} catch (IOException e) {
136+
log.warn(e);
137+
}
138+
}
139+
}
140+
132141
private void onConnected(WebSocketSession session, String token, byte[] body) {
133142
try {
134143
AgentInit init = objectMapper.readValue(body, AgentInit.class);

core/src/main/java/com/flowci/core/job/manager/CmdManagerImpl.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public CmdIn createShellCmd(Job job, Step step, NodeTree tree) {
6464
.setPwsh(linkScript(node, ShellIn.ShellType.PowerShell))
6565
.setEnvFilters(linkFilters(node))
6666
.setInputs(linkInputs(node).merge(job.getContext(), false))
67-
.setTimeout(job.getTimeout());
67+
.setTimeout(linkTimeout(node, job.getTimeout()))
68+
.setRetry(linkRetry(node, 0));
6869

6970
if (node.hasPlugin()) {
7071
setPlugin(node.getPlugin(), in);
@@ -112,6 +113,36 @@ private StringVars linkInputs(Node current) {
112113
return output;
113114
}
114115

116+
private Integer linkRetry(StepNode current, Integer defaultRetry) {
117+
if (current.hasRetry()) {
118+
return current.getRetry();
119+
}
120+
121+
if (current.hasParent()) {
122+
Node parent = current.getParent();
123+
if (parent instanceof StepNode) {
124+
return linkRetry((StepNode) parent, defaultRetry);
125+
}
126+
}
127+
128+
return defaultRetry;
129+
}
130+
131+
private Integer linkTimeout(StepNode current, Integer defaultTimeout) {
132+
if (current.hasTimeout()) {
133+
return current.getTimeout();
134+
}
135+
136+
if (current.hasParent()) {
137+
Node parent = current.getParent();
138+
if (parent instanceof StepNode) {
139+
return linkTimeout((StepNode) parent, defaultTimeout);
140+
}
141+
}
142+
143+
return defaultTimeout;
144+
}
145+
115146
private Set<String> linkFilters(StepNode current) {
116147
Set<String> output = new LinkedHashSet<>();
117148

core/src/main/java/com/flowci/core/plugin/domain/PluginParser.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import lombok.NoArgsConstructor;
2828
import lombok.NonNull;
2929
import org.yaml.snakeyaml.Yaml;
30-
import sun.jvm.hotspot.oops.ObjectHeap;
3130

3231
import java.io.InputStream;
3332
import java.util.LinkedList;

core/src/test/java/com/flowci/core/test/job/CmdManagerTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ public void should_handle_step_in_step() throws IOException {
162162

163163
// then: verify step 2 - 1 cmd
164164
ShellIn cmdStep2_1 = (ShellIn) cmdManager.createShellCmd(job, stepService.get(job.getId(), step2_1.getPathAsString()), tree);
165+
Assert.assertEquals(500, cmdStep2_1.getTimeout());
166+
Assert.assertEquals(2, cmdStep2_1.getRetry());
165167

166168
// input should be overwrite
167169
Assert.assertEquals("overwrite-parent", cmdStep2_1.getInputs().get("STEP_2"));
@@ -178,6 +180,8 @@ public void should_handle_step_in_step() throws IOException {
178180
// then: verify step 2 - 2 cmd
179181
ShellIn cmdStep2_2 = (ShellIn) cmdManager.createShellCmd(job, stepService.get(job.getId(), step2_2.getPathAsString()), tree);
180182
Assert.assertEquals("parent", cmdStep2_2.getInputs().get("STEP_2"));
183+
Assert.assertEquals(1000, cmdStep2_2.getTimeout());
184+
Assert.assertEquals(5, cmdStep2_2.getRetry());
181185

182186
// scripts should be linked
183187
Assert.assertEquals("echo 2", cmdStep2_2.getBash().get(0));

core/src/test/resources/step-in-step.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ steps:
1919
is_runtime: true
2020
- image: "mysql"
2121
bash: "echo 2"
22+
timeout: 500
23+
retry: 2
2224

2325
steps:
2426
- name: step-2-1
@@ -28,6 +30,8 @@ steps:
2830
echo "step-2-1"
2931
3032
- name: step-2-2
33+
timeout: 1000
34+
retry: 5
3135
docker:
3236
image: "redis"
3337
bash: |

tree/src/main/java/com/flowci/tree/StepNode.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,24 @@ public class StepNode extends Node {
3636
*/
3737
private String plugin;
3838

39+
/**
40+
* Step timeout in seconds
41+
*/
42+
private Integer timeout;
43+
44+
/**
45+
* Num of retry times
46+
*/
47+
private Integer retry; // num of retry
48+
49+
/**
50+
* Env vars export to job context
51+
*/
3952
private Set<String> exports = new HashSet<>(0);
4053

54+
/**
55+
* Order in the node tree
56+
*/
4157
private int order;
4258

4359
/**
@@ -68,4 +84,14 @@ public boolean hasScript() {
6884
public boolean isRootStep() {
6985
return parent instanceof FlowNode;
7086
}
87+
88+
@JsonIgnore
89+
public boolean hasTimeout() {
90+
return timeout != null;
91+
}
92+
93+
@JsonIgnore
94+
public boolean hasRetry() {
95+
return retry != null;
96+
}
7197
}

tree/src/main/java/com/flowci/tree/yml/StepYml.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public class StepYml extends YmlBase<StepNode> {
5353

5454
private String plugin;
5555

56+
private Integer retry; // num of retry
57+
58+
private Integer timeout; // timeout in seconds
59+
5660
private List<String> exports = new LinkedList<>();
5761

5862
private boolean allow_failure = false;
@@ -62,6 +66,8 @@ public class StepYml extends YmlBase<StepNode> {
6266
setEnvs(node.getEnvironments());
6367
setBash(node.getBash());
6468
setPwsh(node.getPwsh());
69+
setRetry(node.getRetry());
70+
setTimeout(node.getTimeout());
6571
setPlugin(node.getPlugin());
6672
setAllow_failure(node.isAllowFailure());
6773
}
@@ -71,6 +77,8 @@ public StepNode toNode(Node parent, int index) {
7177
node.setCondition(condition);
7278
node.setBash(bash);
7379
node.setPwsh(pwsh);
80+
node.setRetry(retry);
81+
node.setTimeout(timeout);
7482
node.setPlugin(plugin);
7583
node.setExports(Sets.newHashSet(exports));
7684
node.setAllowFailure(allow_failure);

tree/src/test/java/com/flowci/tree/test/YmlParserTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public void should_get_node_from_yml() {
8080
Assert.assertEquals("step-1", step1.getName()); // step-1 is default name
8181
Assert.assertEquals("echo step", step1.getEnv("FLOW_WORKSPACE"));
8282
Assert.assertEquals("echo step version", step1.getEnv("FLOW_VERSION"));
83+
Assert.assertEquals(3600, step1.getTimeout().intValue());
8384

8485
Assert.assertTrue(step1.isAllowFailure());
8586
Assert.assertEquals("println(FLOW_WORKSPACE)\ntrue\n", step1.getCondition());
@@ -88,6 +89,7 @@ public void should_get_node_from_yml() {
8889
Assert.assertEquals("step2", step2.getName());
8990
Assert.assertEquals("echo 2", step2.getBash());
9091
Assert.assertEquals("echo powershell", step2.getPwsh());
92+
Assert.assertNull(step2.getTimeout());
9193

9294
DockerOption dockerOption = step2.getDockers().get(0);
9395
Assert.assertNotNull(dockerOption);

tree/src/test/resources/flow.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ steps:
3131
envs:
3232
FLOW_WORKSPACE: "echo step"
3333
FLOW_VERSION: "echo step version"
34+
timeout: 3600
3435
allow_failure: true
3536
3637
- name: step2

0 commit comments

Comments
 (0)