@@ -65,34 +65,33 @@ func CanUploadRunResult(ctx context.Context, db *gorp.DbMap, store cache.Store,
65
65
return false , sdk .WrapError (sdk .ErrInvalidData , "unable to upload artifact on a terminated job" )
66
66
}
67
67
68
+ // We don't check duplicate filename duplicates for artifact manager
69
+ if runResultCheck .ResultType == sdk .WorkflowRunResultTypeArtifactManager {
70
+ return true , nil
71
+ }
72
+
68
73
// Check File Name
69
74
runResults , err := LoadRunResultsByRunIDAndType (ctx , db , runResultCheck .RunID , runResultCheck .ResultType )
70
75
if err != nil {
71
76
return false , sdk .WrapError (err , "unable to load run results for run %d" , runResultCheck .RunID )
72
77
}
73
- for _ , result := range runResults {
78
+ for _ , runResult := range runResults {
74
79
var fileName string
75
80
switch runResultCheck .ResultType {
76
81
case sdk .WorkflowRunResultTypeArtifact :
77
- refArt , err := result .GetArtifact ()
82
+ refArt , err := runResult .GetArtifact ()
78
83
if err != nil {
79
84
return false , err
80
85
}
81
86
fileName = refArt .Name
82
87
case sdk .WorkflowRunResultTypeCoverage :
83
- refCov , err := result .GetCoverage ()
88
+ refCov , err := runResult .GetCoverage ()
84
89
if err != nil {
85
90
return false , err
86
91
}
87
92
fileName = refCov .Name
88
- case sdk .WorkflowRunResultTypeArtifactManager :
89
- refArt , err := result .GetArtifactManager ()
90
- if err != nil {
91
- return false , err
92
- }
93
- fileName = refArt .Name
94
93
case sdk .WorkflowRunResultTypeStaticFile :
95
- refArt , err := result .GetStaticFile ()
94
+ refArt , err := runResult .GetStaticFile ()
96
95
if err != nil {
97
96
return false , err
98
97
}
@@ -106,7 +105,7 @@ func CanUploadRunResult(ctx context.Context, db *gorp.DbMap, store cache.Store,
106
105
// If we find a run result with same check, check subnumber
107
106
var previousNodeRunUpload * sdk.WorkflowNodeRun
108
107
for _ , nr := range nrs {
109
- if nr .ID != result .WorkflowNodeRunID {
108
+ if nr .ID != runResult .WorkflowNodeRunID {
110
109
continue
111
110
}
112
111
previousNodeRunUpload = & nr
@@ -117,10 +116,10 @@ func CanUploadRunResult(ctx context.Context, db *gorp.DbMap, store cache.Store,
117
116
}
118
117
119
118
// Check Sub num
120
- if result .SubNum == nrs [0 ].SubNumber {
119
+ if runResult .SubNum == nrs [0 ].SubNumber {
121
120
return false , sdk .WrapError (sdk .ErrConflictData , "artifact %s has already been uploaded" , runResultCheck .Name )
122
121
}
123
- if result .SubNum > nrs [0 ].SubNumber {
122
+ if runResult .SubNum > nrs [0 ].SubNumber {
124
123
return false , sdk .WrapError (sdk .ErrConflictData , "artifact %s cannot be uploaded into a previous run" , runResultCheck .Name )
125
124
}
126
125
}
@@ -174,8 +173,8 @@ func AddResult(ctx context.Context, db *gorp.DbMap, store cache.Store, wr *sdk.W
174
173
}
175
174
176
175
// Check validity of the request + complete runResuklt with md5,size,type
177
- func verifyAddResultArtifactManager (ctx context.Context , db gorp.SqlExecutor , store cache.Store , wr * sdk.WorkflowRun , runResult * sdk.WorkflowRunResult ) (string , error ) {
178
- artResult , err := runResult .GetArtifactManager ()
176
+ func verifyAddResultArtifactManager (ctx context.Context , db gorp.SqlExecutor , store cache.Store , wr * sdk.WorkflowRun , newRunResult * sdk.WorkflowRunResult ) (string , error ) {
177
+ artNewResult , err := newRunResult .GetArtifactManager ()
179
178
if err != nil {
180
179
return "" , err
181
180
}
@@ -209,24 +208,72 @@ func verifyAddResultArtifactManager(ctx context.Context, db gorp.SqlExecutor, st
209
208
if err != nil {
210
209
return "" , err
211
210
}
212
- fileInfo , err := artifactClient .GetFileInfo (artResult .RepoName , artResult .Path )
211
+ fileInfo , err := artifactClient .GetFileInfo (artNewResult .RepoName , artNewResult .Path )
213
212
if err != nil {
214
213
return "" , err
215
214
}
216
- artResult .Size = fileInfo .Size
217
- artResult .MD5 = fileInfo .Md5
218
- artResult .RepoType = fileInfo .Type
219
- if artResult .FileType == "" {
220
- artResult .FileType = artResult .RepoType
215
+ artNewResult .Size = fileInfo .Size
216
+ artNewResult .MD5 = fileInfo .Md5
217
+ artNewResult .RepoType = fileInfo .Type
218
+ if artNewResult .FileType == "" {
219
+ artNewResult .FileType = artNewResult .RepoType
221
220
}
222
221
223
- if err := artResult .IsValid (); err != nil {
222
+ if err := artNewResult .IsValid (); err != nil {
224
223
return "" , err
225
224
}
226
- dataUpdated , _ := json .Marshal (artResult )
227
- runResult .DataRaw = dataUpdated
225
+ dataUpdated , _ := json .Marshal (artNewResult )
226
+ newRunResult .DataRaw = dataUpdated
227
+
228
+ // Check existing run-result duplicates
229
+ var nrs []sdk.WorkflowNodeRun
230
+ for _ , nodeRuns := range wr .WorkflowNodeRuns {
231
+ if len (nodeRuns ) < 1 {
232
+ continue
233
+ }
234
+ // Get last noderun
235
+ nodeRun := nodeRuns [0 ]
236
+ if nodeRun .ID != newRunResult .WorkflowNodeRunID {
237
+ continue
238
+ }
239
+ nrs = nodeRuns
240
+ }
241
+ runResults , err := LoadRunResultsByRunIDAndType (ctx , db , wr .ID , newRunResult .Type )
242
+ if err != nil {
243
+ return "" , sdk .WrapError (err , "unable to load run results for run %d" , wr .ID )
244
+ }
245
+ for _ , runResult := range runResults {
246
+ artRunResult , _ := runResult .GetArtifactManager ()
247
+ // if name is different: no problem
248
+ if artRunResult .Name != artNewResult .Name {
249
+ continue
250
+ }
251
+ // if name is the same but type is different: no problem
252
+ if artRunResult .RepoType != artNewResult .RepoType {
253
+ continue
254
+ }
255
+ // It can also be a new run
256
+ var previousNodeRunUpload * sdk.WorkflowNodeRun
257
+ for _ , nr := range nrs {
258
+ if nr .ID != runResult .WorkflowNodeRunID {
259
+ continue
260
+ }
261
+ previousNodeRunUpload = & nr
262
+ break
263
+ }
264
+ if previousNodeRunUpload == nil {
265
+ return "" , sdk .NewErrorFrom (sdk .ErrConflictData , "run-result %s has already been created from another pipeline" , artNewResult .Name )
266
+ }
267
+ // Check Sub num
268
+ if runResult .SubNum == nrs [0 ].SubNumber {
269
+ return "" , sdk .NewErrorFrom (sdk .ErrConflictData , "run-result %s has already been created" , artNewResult .Name )
270
+ }
271
+ if runResult .SubNum > nrs [0 ].SubNumber {
272
+ return "" , sdk .NewErrorFrom (sdk .ErrConflictData , "run-result %s cannot be created into a previous run" , artNewResult .Name )
273
+ }
274
+ }
228
275
229
- cacheKey := GetRunResultKey (runResult .WorkflowRunID , runResult .Type , artResult .Name )
276
+ cacheKey := GetRunResultKey (newRunResult .WorkflowRunID , newRunResult .Type , artNewResult .Name )
230
277
b , err := store .Exist (cacheKey )
231
278
if err != nil {
232
279
return cacheKey , err
0 commit comments