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:
Tobias Henkel
2017-05-16 13:40:03 +02:00
committed by James E. Blair
parent 7c60e4451b
commit 9842bd7eb3
5 changed files with 60 additions and 19 deletions

View 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

View File

@@ -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"""

View File

@@ -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")

View File

@@ -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:

View File

@@ -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