Don't report start on unmanaged projects
When using a check pipeline with enabled start reporting zuul reports start on all projects of the gerrit instance regardless if they are part of the pipeline or not. After that zuul notices that there are no jobs to do. The fix is to delay reporting until zuul knows if there are jobs to run. This also implies changes to reporting of syntax errors such that zuul now just reports with "syntax error" instead "starting jobs" and then almost immediately "syntax error". Change-Id: Idd754f3e42157d50012f49ef89cfb05f566efd7e
This commit is contained in:
committed by
James E. Blair
parent
7c60e4451b
commit
9842bd7eb3
25
tests/fixtures/layouts/unmanaged-project.yaml
vendored
Normal file
25
tests/fixtures/layouts/unmanaged-project.yaml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
- pipeline:
|
||||
name: check
|
||||
manager: independent
|
||||
require:
|
||||
gerrit:
|
||||
open: True
|
||||
current-patchset: True
|
||||
trigger:
|
||||
gerrit:
|
||||
- event: patchset-created
|
||||
success:
|
||||
gerrit:
|
||||
verified: 1
|
||||
failure:
|
||||
gerrit:
|
||||
verified: -1
|
||||
start:
|
||||
gerrit:
|
||||
verified: 0
|
||||
|
||||
- project:
|
||||
name: org/project1
|
||||
check:
|
||||
jobs:
|
||||
- noop
|
||||
@@ -956,7 +956,6 @@ class TestScheduler(ZuulTestCase):
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(A.reported, 1)
|
||||
self.assertEqual(B.reported, 1)
|
||||
self.assertEqual(C.reported, 1)
|
||||
|
||||
self.gearman_server.release('project-merge')
|
||||
@@ -974,7 +973,7 @@ class TestScheduler(ZuulTestCase):
|
||||
self.assertEqual(B.data['status'], 'NEW')
|
||||
self.assertEqual(C.data['status'], 'MERGED')
|
||||
self.assertEqual(A.reported, 2)
|
||||
self.assertEqual(B.reported, 2)
|
||||
self.assertIn('Merge Failed', B.messages[-1])
|
||||
self.assertEqual(C.reported, 2)
|
||||
|
||||
self.assertHistory([
|
||||
@@ -2329,7 +2328,6 @@ class TestScheduler(ZuulTestCase):
|
||||
self.assertEqual(A.data['status'], 'NEW')
|
||||
self.assertEqual(A.reported, 1)
|
||||
self.assertEqual(B.data['status'], 'NEW')
|
||||
self.assertEqual(B.reported, 1)
|
||||
self.assertEqual(len(self.history), 0)
|
||||
|
||||
# Add the "project-test3" job.
|
||||
@@ -2345,7 +2343,7 @@ class TestScheduler(ZuulTestCase):
|
||||
self.assertEqual(A.data['status'], 'MERGED')
|
||||
self.assertEqual(A.reported, 2)
|
||||
self.assertEqual(B.data['status'], 'NEW')
|
||||
self.assertEqual(B.reported, 2)
|
||||
self.assertIn('Merge Failed', B.messages[-1])
|
||||
self.assertEqual(self.getJobFromHistory('project-merge').result,
|
||||
'SUCCESS')
|
||||
self.assertEqual(self.getJobFromHistory('project-test1').result,
|
||||
@@ -3397,6 +3395,16 @@ For CI problems and help debugging, contact ci@example.org"""
|
||||
self.assertFalse(self.smtp_messages[1]['body'].startswith(failure_msg))
|
||||
self.assertTrue(self.smtp_messages[1]['body'].endswith(footer_msg))
|
||||
|
||||
@simple_layout('layouts/unmanaged-project.yaml')
|
||||
def test_unmanaged_project_start_message(self):
|
||||
"Test start reporting is not done for unmanaged projects."
|
||||
self.init_repo("org/project", tag='init')
|
||||
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
|
||||
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(0, len(A.messages))
|
||||
|
||||
@skip("Disabled for early v3 development")
|
||||
def test_merge_failure_reporters(self):
|
||||
"""Check that the config is set up correctly"""
|
||||
|
||||
@@ -262,9 +262,9 @@ class TestInRepoConfig(ZuulTestCase):
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(A.data['status'], 'NEW')
|
||||
self.assertEqual(A.reported, 2,
|
||||
"A should report start and failure")
|
||||
self.assertIn('syntax error', A.messages[1],
|
||||
self.assertEqual(A.reported, 1,
|
||||
"A should report failure")
|
||||
self.assertIn('syntax error', A.messages[0],
|
||||
"A should have a syntax error reported")
|
||||
|
||||
def test_trusted_syntax_error(self):
|
||||
@@ -283,9 +283,9 @@ class TestInRepoConfig(ZuulTestCase):
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(A.data['status'], 'NEW')
|
||||
self.assertEqual(A.reported, 2,
|
||||
"A should report start and failure")
|
||||
self.assertIn('syntax error', A.messages[1],
|
||||
self.assertEqual(A.reported, 1,
|
||||
"A should report failure")
|
||||
self.assertIn('syntax error', A.messages[0],
|
||||
"A should have a syntax error reported")
|
||||
|
||||
def test_untrusted_yaml_error(self):
|
||||
@@ -303,9 +303,9 @@ class TestInRepoConfig(ZuulTestCase):
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(A.data['status'], 'NEW')
|
||||
self.assertEqual(A.reported, 2,
|
||||
"A should report start and failure")
|
||||
self.assertIn('syntax error', A.messages[1],
|
||||
self.assertEqual(A.reported, 1,
|
||||
"A should report failure")
|
||||
self.assertIn('syntax error', A.messages[0],
|
||||
"A should have a syntax error reported")
|
||||
|
||||
def test_untrusted_shadow_error(self):
|
||||
@@ -323,9 +323,9 @@ class TestInRepoConfig(ZuulTestCase):
|
||||
self.waitUntilSettled()
|
||||
|
||||
self.assertEqual(A.data['status'], 'NEW')
|
||||
self.assertEqual(A.reported, 2,
|
||||
"A should report start and failure")
|
||||
self.assertIn('not permitted to shadow', A.messages[1],
|
||||
self.assertEqual(A.reported, 1,
|
||||
"A should report failure")
|
||||
self.assertIn('not permitted to shadow', A.messages[0],
|
||||
"A should have a syntax error reported")
|
||||
|
||||
|
||||
|
||||
@@ -312,9 +312,7 @@ class PipelineManager(object):
|
||||
item.enqueue_time = enqueue_time
|
||||
item.live = live
|
||||
self.reportStats(item)
|
||||
if not quiet:
|
||||
if len(self.pipeline.start_actions) > 0:
|
||||
self.reportStart(item)
|
||||
item.quiet = quiet
|
||||
self.enqueueChangesBehind(change, quiet, ignore_requirements,
|
||||
change_queue)
|
||||
zuul_driver = self.sched.connections.drivers['zuul']
|
||||
@@ -580,6 +578,14 @@ class PipelineManager(object):
|
||||
self.cancelJobs(item)
|
||||
if actionable:
|
||||
ready = self.prepareItem(item) and self.prepareJobs(item)
|
||||
# Starting jobs reporting should only be done once if there are
|
||||
# jobs to run for this item.
|
||||
if ready and len(self.pipeline.start_actions) > 0 \
|
||||
and len(item.job_graph.jobs) > 0 \
|
||||
and not item.reported_start \
|
||||
and not item.quiet:
|
||||
self.reportStart(item)
|
||||
item.reported_start = True
|
||||
if item.current_build_set.unable_to_merge:
|
||||
failing_reasons.append("it has a merge conflict")
|
||||
if item.current_build_set.config_error:
|
||||
|
||||
@@ -1273,6 +1273,8 @@ class QueueItem(object):
|
||||
self.enqueue_time = None
|
||||
self.dequeue_time = None
|
||||
self.reported = False
|
||||
self.reported_start = False
|
||||
self.quiet = False
|
||||
self.active = False # Whether an item is within an active window
|
||||
self.live = True # Whether an item is intended to be processed at all
|
||||
self.layout = None # This item's shadow layout
|
||||
|
||||
Reference in New Issue
Block a user