File tree Expand file tree Collapse file tree 2 files changed +44
-2
lines changed
Expand file tree Collapse file tree 2 files changed +44
-2
lines changed Original file line number Diff line number Diff line change @@ -508,6 +508,8 @@ def validate_json(d):
508508 return True
509509
510510 jobs = {}
511+ all_job_names = set ([j ['name' ] for j in d ['jobs' ]])
512+ all_deps = {}
511513 for i in range (0 , len (d ['jobs' ])):
512514 job = d ['jobs' ][i ]
513515 job_name = job ['name' ]
@@ -537,12 +539,23 @@ def validate_json(d):
537539 if job_name == parent_name :
538540 raise ValidationError (path , "Job '%s' may not depend on itself" % parent_name )
539541
540- if parent_name not in jobs :
542+ if parent_name not in all_job_names :
541543 raise ValidationError (path + ".depends_on" , "Job '%s' not found" % parent_name )
542544
543545 if parent_name in deps :
544546 raise ValidationError (path + ".depends_on" , "'%s' duplicate dependencies" % parent_name )
545547
546548 deps [parent_name ] = True
547549
550+ if deps :
551+ all_deps [job_name ] = deps
552+
553+ for job_name , deps in all_deps .items ():
554+ queue = list (deps .keys ())
555+ for dep_job in queue :
556+ if dep_job == job_name :
557+ raise ValidationError ("Jobs" , "Circular dependency detected." )
558+ if dep_job in all_deps :
559+ queue .extend (all_deps [dep_job ].keys ())
560+
548561 return True
Original file line number Diff line number Diff line change @@ -43,7 +43,36 @@ def test_dep_defined_later(self):
4343 }]
4444 }
4545
46- self .raises_expect (d , "#jobs[0].depends_on: Job 'compile' not found" )
46+ validate_json (d )
47+
48+ def test_dep_detect_circular_dependency (self ):
49+ d = {
50+ "version" : 1 ,
51+ "jobs" : [{
52+ "type" : "docker" ,
53+ "name" : "a" ,
54+ "docker_file" : "Dockerfile" ,
55+ "resources" : {"limits" : {"cpu" : 1 , "memory" : 1024 }},
56+ "build_only" : False ,
57+ "depends_on" : ["b" ]
58+ }, {
59+ "type" : "docker" ,
60+ "name" : "b" ,
61+ "docker_file" : "Dockerfile" ,
62+ "build_only" : False ,
63+ "depends_on" : ["c" ],
64+ "resources" : {"limits" : {"cpu" : 1 , "memory" : 1024 }},
65+ }, {
66+ "type" : "docker" ,
67+ "name" : "c" ,
68+ "docker_file" : "Dockerfile" ,
69+ "build_only" : False ,
70+ "depends_on" : ["a" ],
71+ "resources" : {"limits" : {"cpu" : 1 , "memory" : 1024 }},
72+ }]
73+ }
74+
75+ self .raises_expect (d , "Jobs: Circular dependency detected." )
4776
4877 def test_dep_not_found (self ):
4978 d = {
You can’t perform that action at this time.
0 commit comments