Merge "Fix duplicate and reversed artifacts"
This commit is contained in:
commit
4bf68a40a8
|
@ -57,12 +57,16 @@
|
||||||
name: library-user
|
name: library-user
|
||||||
requires: libraries
|
requires: libraries
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: hold
|
||||||
|
|
||||||
- project:
|
- project:
|
||||||
name: org/project1
|
name: org/project1
|
||||||
check:
|
check:
|
||||||
jobs:
|
jobs:
|
||||||
- image-builder
|
- image-builder
|
||||||
- library-builder
|
- library-builder
|
||||||
|
- hold
|
||||||
gate:
|
gate:
|
||||||
queue: integrated
|
queue: integrated
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -74,6 +78,7 @@
|
||||||
jobs:
|
jobs:
|
||||||
- image-user
|
- image-user
|
||||||
- library-user
|
- library-user
|
||||||
|
- hold
|
||||||
gate:
|
gate:
|
||||||
queue: integrated
|
queue: integrated
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
@ -4977,16 +4977,41 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
|
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
|
||||||
self.waitUntilSettled()
|
self.waitUntilSettled()
|
||||||
|
|
||||||
self.assertEqual(len(self.builds), 2)
|
self.assertEqual(len(self.builds), 3)
|
||||||
|
|
||||||
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
|
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
|
||||||
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
||||||
B.subject, A.data['id'])
|
B.subject, A.data['id'])
|
||||||
|
self.executor_server.returnData(
|
||||||
|
'image-builder', B,
|
||||||
|
{'zuul':
|
||||||
|
{'artifacts': [
|
||||||
|
{'name': 'image2', 'url': 'http://example.com/image2'},
|
||||||
|
]}}
|
||||||
|
)
|
||||||
|
self.executor_server.returnData(
|
||||||
|
'library-builder', B,
|
||||||
|
{'zuul':
|
||||||
|
{'artifacts': [
|
||||||
|
{'name': 'library2', 'url': 'http://example.com/library2'},
|
||||||
|
]}}
|
||||||
|
)
|
||||||
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
|
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
|
||||||
self.waitUntilSettled()
|
self.waitUntilSettled()
|
||||||
|
|
||||||
self.assertEqual(len(self.builds), 2)
|
self.assertEqual(len(self.builds), 6)
|
||||||
|
|
||||||
|
C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
|
||||||
|
C.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
||||||
|
C.subject, B.data['id'])
|
||||||
|
self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.assertEqual(len(self.builds), 7)
|
||||||
|
|
||||||
|
self.executor_server.release('image-*')
|
||||||
|
self.executor_server.release('library-*')
|
||||||
|
self.waitUntilSettled()
|
||||||
self.executor_server.hold_jobs_in_build = False
|
self.executor_server.hold_jobs_in_build = False
|
||||||
self.executor_server.release()
|
self.executor_server.release()
|
||||||
self.waitUntilSettled()
|
self.waitUntilSettled()
|
||||||
|
@ -4994,8 +5019,14 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
self.assertHistory([
|
self.assertHistory([
|
||||||
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='image-user', result='SUCCESS', changes='1,1 2,1'),
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='library-user', result='SUCCESS', changes='1,1 2,1'),
|
dict(name='image-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='library-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='image-user', result='SUCCESS', changes='1,1 2,1 3,1'),
|
||||||
|
dict(name='library-user', result='SUCCESS',
|
||||||
|
changes='1,1 2,1 3,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1 3,1'),
|
||||||
], ordered=False)
|
], ordered=False)
|
||||||
image_user = self.getJobFromHistory('image-user')
|
image_user = self.getJobFromHistory('image-user')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -5007,6 +5038,13 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
'job': 'image-builder',
|
'job': 'image-builder',
|
||||||
'url': 'http://example.com/image',
|
'url': 'http://example.com/image',
|
||||||
'name': 'image',
|
'name': 'image',
|
||||||
|
}, {
|
||||||
|
'project': 'org/project1',
|
||||||
|
'change': '2',
|
||||||
|
'patchset': '1',
|
||||||
|
'job': 'image-builder',
|
||||||
|
'url': 'http://example.com/image2',
|
||||||
|
'name': 'image2',
|
||||||
}])
|
}])
|
||||||
library_user = self.getJobFromHistory('library-user')
|
library_user = self.getJobFromHistory('library-user')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -5018,6 +5056,13 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
'job': 'library-builder',
|
'job': 'library-builder',
|
||||||
'url': 'http://example.com/library',
|
'url': 'http://example.com/library',
|
||||||
'name': 'library',
|
'name': 'library',
|
||||||
|
}, {
|
||||||
|
'project': 'org/project1',
|
||||||
|
'change': '2',
|
||||||
|
'patchset': '1',
|
||||||
|
'job': 'library-builder',
|
||||||
|
'url': 'http://example.com/library2',
|
||||||
|
'name': 'library2',
|
||||||
}])
|
}])
|
||||||
|
|
||||||
@simple_layout('layouts/provides-requires.yaml')
|
@simple_layout('layouts/provides-requires.yaml')
|
||||||
|
@ -5042,19 +5087,54 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
self.assertHistory([
|
self.assertHistory([
|
||||||
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
], ordered=False)
|
], ordered=False)
|
||||||
|
|
||||||
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
|
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
|
||||||
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
||||||
B.subject, A.data['id'])
|
B.subject, A.data['id'])
|
||||||
|
self.executor_server.returnData(
|
||||||
|
'image-builder', B,
|
||||||
|
{'zuul':
|
||||||
|
{'artifacts': [
|
||||||
|
{'name': 'image2', 'url': 'http://example.com/image2'},
|
||||||
|
]}}
|
||||||
|
)
|
||||||
|
self.executor_server.returnData(
|
||||||
|
'library-builder', B,
|
||||||
|
{'zuul':
|
||||||
|
{'artifacts': [
|
||||||
|
{'name': 'library2', 'url': 'http://example.com/library2'},
|
||||||
|
]}}
|
||||||
|
)
|
||||||
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
|
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
|
||||||
self.waitUntilSettled()
|
self.waitUntilSettled()
|
||||||
|
self.assertHistory([
|
||||||
|
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
||||||
|
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
|
dict(name='image-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='library-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
], ordered=False)
|
||||||
|
|
||||||
|
C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
|
||||||
|
C.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
||||||
|
C.subject, B.data['id'])
|
||||||
|
self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
self.assertHistory([
|
self.assertHistory([
|
||||||
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
dict(name='image-builder', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
dict(name='library-builder', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='image-user', result='SUCCESS', changes='1,1 2,1'),
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
dict(name='library-user', result='SUCCESS', changes='1,1 2,1'),
|
dict(name='image-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='library-builder', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
|
||||||
|
dict(name='image-user', result='SUCCESS', changes='1,1 2,1 3,1'),
|
||||||
|
dict(name='library-user', result='SUCCESS',
|
||||||
|
changes='1,1 2,1 3,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1 3,1'),
|
||||||
], ordered=False)
|
], ordered=False)
|
||||||
image_user = self.getJobFromHistory('image-user')
|
image_user = self.getJobFromHistory('image-user')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -5066,6 +5146,13 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
'job': 'image-builder',
|
'job': 'image-builder',
|
||||||
'url': 'http://example.com/image',
|
'url': 'http://example.com/image',
|
||||||
'name': 'image',
|
'name': 'image',
|
||||||
|
}, {
|
||||||
|
'project': 'org/project1',
|
||||||
|
'change': '2',
|
||||||
|
'patchset': '1',
|
||||||
|
'job': 'image-builder',
|
||||||
|
'url': 'http://example.com/image2',
|
||||||
|
'name': 'image2',
|
||||||
}])
|
}])
|
||||||
library_user = self.getJobFromHistory('library-user')
|
library_user = self.getJobFromHistory('library-user')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -5077,6 +5164,13 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
'job': 'library-builder',
|
'job': 'library-builder',
|
||||||
'url': 'http://example.com/library',
|
'url': 'http://example.com/library',
|
||||||
'name': 'library',
|
'name': 'library',
|
||||||
|
}, {
|
||||||
|
'project': 'org/project1',
|
||||||
|
'change': '2',
|
||||||
|
'patchset': '1',
|
||||||
|
'job': 'library-builder',
|
||||||
|
'url': 'http://example.com/library2',
|
||||||
|
'name': 'library2',
|
||||||
}])
|
}])
|
||||||
|
|
||||||
@simple_layout('layouts/provides-requires.yaml')
|
@simple_layout('layouts/provides-requires.yaml')
|
||||||
|
@ -5090,6 +5184,7 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
self.assertHistory([
|
self.assertHistory([
|
||||||
dict(name='image-builder', result='FAILURE', changes='1,1'),
|
dict(name='image-builder', result='FAILURE', changes='1,1'),
|
||||||
dict(name='library-builder', result='FAILURE', changes='1,1'),
|
dict(name='library-builder', result='FAILURE', changes='1,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
], ordered=False)
|
], ordered=False)
|
||||||
|
|
||||||
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
|
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
|
||||||
|
@ -5101,6 +5196,8 @@ class TestProvidesRequires(ZuulDBTestCase):
|
||||||
self.assertHistory([
|
self.assertHistory([
|
||||||
dict(name='image-builder', result='FAILURE', changes='1,1'),
|
dict(name='image-builder', result='FAILURE', changes='1,1'),
|
||||||
dict(name='library-builder', result='FAILURE', changes='1,1'),
|
dict(name='library-builder', result='FAILURE', changes='1,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1'),
|
||||||
|
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
|
||||||
], ordered=False)
|
], ordered=False)
|
||||||
self.assertIn('image-user : SKIPPED', B.messages[0])
|
self.assertIn('image-user : SKIPPED', B.messages[0])
|
||||||
self.assertIn('not met by build', B.messages[0])
|
self.assertIn('not met by build', B.messages[0])
|
||||||
|
|
|
@ -2257,7 +2257,7 @@ class QueueItem(object):
|
||||||
data.append(artifact)
|
data.append(artifact)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def providesRequirements(self, requirements, data):
|
def providesRequirements(self, requirements, data, recurse=True):
|
||||||
# Mutates data and returns true/false if requirements
|
# Mutates data and returns true/false if requirements
|
||||||
# satisfied.
|
# satisfied.
|
||||||
if not requirements:
|
if not requirements:
|
||||||
|
@ -2271,7 +2271,8 @@ class QueueItem(object):
|
||||||
found = True
|
found = True
|
||||||
break
|
break
|
||||||
if found:
|
if found:
|
||||||
if not item.providesRequirements(requirements, data):
|
if not item.providesRequirements(requirements, data,
|
||||||
|
recurse=False):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
# Look for this item in the SQL DB.
|
# Look for this item in the SQL DB.
|
||||||
|
@ -2299,6 +2300,8 @@ class QueueItem(object):
|
||||||
data += artifacts
|
data += artifacts
|
||||||
if not self.item_ahead:
|
if not self.item_ahead:
|
||||||
return True
|
return True
|
||||||
|
if not recurse:
|
||||||
|
return True
|
||||||
return self.item_ahead.providesRequirements(requirements, data)
|
return self.item_ahead.providesRequirements(requirements, data)
|
||||||
|
|
||||||
def jobRequirementsReady(self, job):
|
def jobRequirementsReady(self, job):
|
||||||
|
@ -2307,6 +2310,7 @@ class QueueItem(object):
|
||||||
try:
|
try:
|
||||||
data = []
|
data = []
|
||||||
ret = self.item_ahead.providesRequirements(job.requires, data)
|
ret = self.item_ahead.providesRequirements(job.requires, data)
|
||||||
|
data.reverse()
|
||||||
job.updateArtifactData(data)
|
job.updateArtifactData(data)
|
||||||
except RequirementsError as e:
|
except RequirementsError as e:
|
||||||
self.warning(str(e))
|
self.warning(str(e))
|
||||||
|
|
Loading…
Reference in New Issue