Merge "Don't process builds not longer in job graph"

This commit is contained in:
Zuul 2019-12-13 12:12:09 +00:00 committed by Gerrit Code Review
commit b5f294b225
3 changed files with 117 additions and 1 deletions

View File

@ -0,0 +1,61 @@
- pipeline:
name: check
manager: independent
trigger:
gerrit:
- event: patchset-created
success:
gerrit:
Verified: 1
failure:
gerrit:
Verified: -1
- job:
name: base
parent: null
run: playbooks/run.yaml
- job:
name: project-merge
- job:
name: project-test1
- job:
name: project-test2
- job:
name: project-test3
- job:
name: project-test4
- job:
name: project-test5
nodeset:
nodes:
- name: controller
label: label1
- job:
name: project-test6
- project:
name: org/project
check:
fail-fast: true
jobs:
- project-merge
- project-test2:
dependencies: project-merge
- project-test3:
dependencies:
- name: project-test2
soft: true
- project-test4:
dependencies: project-test2
- project-test5
- project-test6:
dependencies: project-merge
voting: false

View File

@ -7945,6 +7945,56 @@ class TestSchedulerFailFast(ZuulTestCase):
dict(name='project-test6', result='FAILURE', changes='1,1'),
], ordered=False)
def test_fail_fast_reconfigure(self):
"""
Tests that a pipeline that is flagged with fail-fast
doesn't abort jobs when a job is removed during reconfig.
"""
self.executor_server.hold_jobs_in_build = True
self.fake_nodepool.pause()
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
self.executor_server.failJob('project-test1', A)
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.waitUntilSettled()
self.assertEqual(len(self.builds), 1)
self.assertEqual(self.builds[0].name, 'project-merge')
self.executor_server.release('project-merge')
self.waitUntilSettled()
# Now project-test1, project-test2 and project-test6
# should be running
self.assertEqual(len(self.builds), 3)
# Commit new config that removes project-test1
self.commitConfigUpdate('common-config',
'layouts/fail-fast-reconfigure.yaml')
self.sched.reconfigure(self.config)
# Release project-test1
self.executor_server.release('project-test1')
self.waitUntilSettled()
self.fake_nodepool.unpause()
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
self.assertEqual(len(self.builds), 0)
self.assertEqual(A.reported, 1)
self.assertEqual(A.patchsets[0]['approvals'][0]['value'], "1")
self.assertHistory([
dict(name='project-merge', result='SUCCESS', changes='1,1'),
dict(name='project-test1', result='ABORTED', changes='1,1'),
dict(name='project-test2', result='SUCCESS', changes='1,1'),
dict(name='project-test3', result='SUCCESS', changes='1,1'),
dict(name='project-test4', result='SUCCESS', changes='1,1'),
dict(name='project-test5', result='SUCCESS', changes='1,1'),
dict(name='project-test6', result='SUCCESS', changes='1,1'),
], ordered=False)
class TestPipelineSupersedes(ZuulTestCase):

View File

@ -989,9 +989,14 @@ class PipelineManager(object):
item = build.build_set.item
log.debug("Build %s of %s completed" % (build, item.change))
item.pipeline.tenant.semaphore_handler.release(item, build.job)
if item.getJob(build.job.name) is None:
log.info("Build %s no longer in job graph for item %s",
build, item)
return
item.setResult(build)
item.pipeline.tenant.semaphore_handler.release(item, build.job)
log.debug("Item %s status is now:\n %s", item, item.formatStatus())
if build.retry: