Skip to content

Commit 994937d

Browse files
committed
create job of build
1 parent b38aee1 commit 994937d

File tree

11 files changed

+147
-99
lines changed

11 files changed

+147
-99
lines changed

src/main/java/com/flowci/build/business/impl/CreateBuildImpl.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.flowci.build.business.CreateBuild;
44
import com.flowci.build.model.Build;
55
import com.flowci.build.model.BuildYaml;
6+
import com.flowci.build.model.Job;
67
import com.flowci.build.repo.BuildRepo;
78
import com.flowci.build.repo.BuildYamlRepo;
89
import com.flowci.build.repo.JobRepo;
@@ -12,8 +13,9 @@
1213
import com.flowci.flow.business.FetchFlowYamlContent;
1314
import com.flowci.flow.model.Flow;
1415
import com.flowci.yaml.business.ParseYaml;
15-
import com.flowci.yaml.model.Command;
16-
import com.flowci.yaml.model.Step;
16+
import com.flowci.yaml.model.v2.CommandV2;
17+
import com.flowci.yaml.model.v2.DockerV2;
18+
import com.flowci.yaml.model.v2.StepV2;
1719
import jakarta.annotation.Nullable;
1820
import jakarta.transaction.Transactional;
1921
import lombok.AllArgsConstructor;
@@ -23,6 +25,7 @@
2325
import java.util.HashSet;
2426
import java.util.List;
2527
import java.util.Set;
28+
import java.util.stream.Collectors;
2629

2730
@Slf4j
2831
@Component
@@ -31,7 +34,7 @@ public class CreateBuildImpl implements CreateBuild {
3134

3235
private final FetchFlow fetchFlow;
3336
private final FetchFlowYamlContent fetchFlowYamlContent;
34-
private final ParseYaml parseYamlV2;
37+
private final ParseYaml<DockerV2, StepV2, CommandV2> parseYamlV2;
3538
private final BuildRepo buildRepo;
3639
private final BuildYamlRepo buildYamlRepo;
3740
private final JobRepo jobRepo;
@@ -43,10 +46,7 @@ public Build invoke(Long flowId, Build.Trigger trigger, @Nullable Variables inpu
4346
var flow = fetchFlow.invoke(flowId);
4447

4548
var yaml = fetchFlowYamlContent.invoke(flowId, false);
46-
var yamlObj = parseYamlV2.invoke(yaml);
47-
var agentTags = yamlObj.getAgents() == null
48-
? Set.<String>of()
49-
: new HashSet<>(yamlObj.getAgents());
49+
var flowYamlObj = parseYamlV2.invoke(yaml);
5050

5151
var build = new Build();
5252
build.setFlowId(flow.getId());
@@ -65,11 +65,35 @@ public Build invoke(Long flowId, Build.Trigger trigger, @Nullable Variables inpu
6565
buildYaml.setUpdatedBy(build.getUpdatedBy());
6666
buildYamlRepo.save(buildYaml);
6767

68-
68+
createJobs(flowYamlObj.getNext(), build, 1, new HashSet<Job.Id>());
6969
log.info("build {} is created for flow {} with trigger {}", build.getBuildAlias(), flowId, trigger);
7070
return build;
7171
}
7272

73+
private void createJobs(List<StepV2> steps, Build build, Integer sequence, Set<Job.Id> saved) {
74+
for (var step : steps) {
75+
var id = new Job.Id(build.getId(), step.getName());
76+
if (saved.contains(id)) {
77+
continue;
78+
}
79+
80+
var next = step.getNext();
81+
82+
var job = new Job();
83+
job.setId(id);
84+
job.setNext(next.stream().map((StepV2::getName)).toArray(String[]::new));
85+
job.setStatus(Job.Status.CREATED);
86+
job.setAgentTags(step.getAgents().toArray(new String[0]));
87+
job.setCreatedBy(build.getCreatedBy());
88+
job.setUpdatedBy(build.getUpdatedBy());
89+
90+
jobRepo.save(job);
91+
saved.add(id);
92+
93+
createJobs(step.getNext(), build, sequence + 1, saved);
94+
}
95+
}
96+
7397
private Variables toBuildVariables(Flow flow, Variables inputs) {
7498
if (inputs == null) {
7599
return flow.getVariables();

src/main/java/com/flowci/build/model/Job.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
import com.flowci.common.model.EntityBase;
44
import com.flowci.common.model.Variables;
5-
import io.hypersistence.utils.hibernate.type.array.LongArrayType;
65
import io.hypersistence.utils.hibernate.type.array.StringArrayType;
76
import io.hypersistence.utils.hibernate.type.json.JsonType;
87
import jakarta.annotation.Nullable;
98
import jakarta.persistence.*;
9+
import lombok.AllArgsConstructor;
1010
import lombok.Data;
1111
import lombok.EqualsAndHashCode;
12+
import lombok.NoArgsConstructor;
1213
import org.hibernate.annotations.Type;
1314

15+
import java.io.Serializable;
1416
import java.util.Map;
1517

1618
/**
@@ -34,18 +36,24 @@ public enum Status {
3436
TIMEOUT
3537
}
3638

37-
@Id
38-
private Long id;
39-
40-
private Long buildId;
39+
@Data
40+
@Embeddable
41+
@NoArgsConstructor
42+
@AllArgsConstructor
43+
public static class Id implements Serializable {
44+
private Long buildId;
45+
private String name;
46+
}
4147

42-
private String name;
48+
@EmbeddedId
49+
private Id id;
4350

4451
/**
45-
* Dependency job id list
52+
* Next step name list
4653
*/
47-
@org.hibernate.annotations.Type(LongArrayType.class)
48-
private Long[] dependencies;
54+
@Nullable
55+
@org.hibernate.annotations.Type(StringArrayType.class)
56+
private String[] next;
4957

5058
@Enumerated(EnumType.STRING)
5159
private Status status;

src/main/java/com/flowci/build/repo/JobRepo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
import org.springframework.stereotype.Repository;
66

77
@Repository
8-
public interface JobRepo extends JpaRepository<Job, Long> {
8+
public interface JobRepo extends JpaRepository<Job, Job.Id> {
99
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.flowci.yaml.business;
22

3+
import com.flowci.yaml.model.Command;
4+
import com.flowci.yaml.model.Docker;
35
import com.flowci.yaml.model.Flow;
6+
import com.flowci.yaml.model.Step;
47

5-
public interface ParseYaml {
6-
Flow invoke(String yaml);
8+
public interface ParseYaml<D extends Docker, S extends Step<D, S, C>, C extends Command> {
9+
Flow<D, S, C> invoke(String yaml);
710
}

src/main/java/com/flowci/yaml/business/impl/ParseYamlV2Impl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.flowci.yaml.business.ParseYaml;
88
import com.flowci.yaml.exception.InvalidYamlException;
99
import com.flowci.yaml.model.Step;
10+
import com.flowci.yaml.model.v2.CommandV2;
11+
import com.flowci.yaml.model.v2.DockerV2;
1012
import com.flowci.yaml.model.v2.FlowV2;
1113
import com.flowci.yaml.model.v2.StepV2;
1214
import lombok.extern.slf4j.Slf4j;
@@ -22,7 +24,7 @@
2224

2325
@Slf4j
2426
@Component
25-
public class ParseYamlV2Impl implements ParseYaml {
27+
public class ParseYamlV2Impl implements ParseYaml<DockerV2, StepV2, CommandV2> {
2628

2729
private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
2830
private static final ValidName.NameValidator nameValidator = new ValidName.NameValidator();
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package com.flowci.yaml.model;
22

3-
import jakarta.annotation.Nullable;
4-
53
import java.util.List;
64

75
public interface Flow<D extends Docker, S extends Step<D, S, C>, C extends Command> extends Base<D> {
86

97
List<S> getSteps();
108

11-
List<S> next(@Nullable String current);
9+
List<S> getNext();
1210

1311
S getStep(String name);
1412
}

src/main/java/com/flowci/yaml/model/v2/FlowV2.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,10 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.flowci.yaml.model.Flow;
5-
import jakarta.annotation.Nullable;
65
import lombok.Getter;
76
import lombok.Setter;
8-
import org.springframework.util.StringUtils;
97

10-
import java.util.LinkedList;
11-
import java.util.List;
12-
import java.util.Map;
13-
import java.util.Set;
8+
import java.util.*;
149

1510
import static org.springframework.util.CollectionUtils.isEmpty;
1611

@@ -36,17 +31,13 @@ public StepV2 getStep(String name) {
3631

3732
@Override
3833
@JsonIgnore
39-
public List<StepV2> next(@Nullable String current) {
40-
if (!StringUtils.hasText(current)) {
41-
return stepsWithoutDependencies();
42-
}
43-
44-
var step = stepNameMapping.get(current);
45-
if (step == null) {
46-
throw new IllegalArgumentException("Invalid step name: " + current);
47-
}
34+
public List<StepV2> getNext() {
35+
return stepsWithoutDependencies();
36+
}
4837

49-
return step.getNext();
38+
public List<StepV2> getNext(String stepName) {
39+
var step = stepNameMapping.get(stepName);
40+
return step == null ? Collections.emptyList() : step.getNext();
5041
}
5142

5243
private List<StepV2> stepsWithoutDependencies() {

src/main/java/com/flowci/yaml/model/v2/StepV2.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import lombok.Getter;
99
import lombok.Setter;
1010

11+
import java.util.Collections;
1112
import java.util.LinkedList;
1213
import java.util.List;
1314
import java.util.Set;
@@ -52,6 +53,19 @@ public class StepV2 extends BaseV2 implements Step<DockerV2, StepV2, CommandV2>
5253
// ref to next steps
5354
private List<StepV2> next = new LinkedList<>();
5455

56+
@Override
57+
public Set<String> getAgents() {
58+
if (this.agents != null) {
59+
return this.agents;
60+
}
61+
62+
if (this.parent.getAgents() != null) {
63+
return this.parent.getAgents();
64+
}
65+
66+
return Collections.emptySet();
67+
}
68+
5569
@Override
5670
public DockerV2 getDocker() {
5771
if (this.docker != null) {

src/main/resources/db/migration/V1__Init.sql

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,19 @@ CREATE TABLE builds_yaml
9999

100100
CREATE TABLE jobs
101101
(
102-
id BIGINT PRIMARY KEY,
103-
build_id BIGINT NOT NULL,
104-
name VARCHAR(100) NOT NULL,
105-
status VARCHAR(20) NOT NULL,
106-
agent_tags VARCHAR(20)[] NOT NULL,
107-
dependencies BIGINT[] NOT NULL,
102+
build_id BIGINT NOT NULL,
103+
name VARCHAR(100) NOT NULL,
104+
next VARCHAR(100)[] NOT NULL,
105+
status VARCHAR(20) NOT NULL,
106+
agent_tags VARCHAR(20)[] NOT NULL,
107+
dependencies BIGINT[],
108108
agent_id BIGINT,
109109
variables JSON,
110-
output JSON
111-
);
110+
output JSON,
111+
created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
112+
created_by BIGINT,
113+
updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
114+
updated_by BIGINT,
112115

113-
DROP SEQUENCE IF EXISTS jobs_id_sequence;
114-
CREATE SEQUENCE jobs_id_sequence START 1000 INCREMENT 1 OWNED BY jobs.id;
116+
PRIMARY KEY (build_id, name)
117+
);

0 commit comments

Comments
 (0)