Merge "Add queue-name parameter to job"

This commit is contained in:
Jenkins
2014-04-30 14:25:35 +00:00
committed by Gerrit Code Review
7 changed files with 125 additions and 3 deletions
+12
View File
@@ -644,6 +644,18 @@ each job as it builds a list from the project specification.
The name of the job. This field is treated as a regular expression
and will be applied to each job that matches.
**queue-name (optional)**
Zuul will automatically combine projects that share a job into
shared change queues for dependent pipeline managers. In order to
report statistics about these queues, it is convenient for them to
have names. Zuul can automatically name change queues, however
these can grow quite long and are prone to changing as projects in
the queue change. If you assign a queue-name to a job, Zuul will
use that as the name for the shared change queue that contains that
job instead of the automatically generated one. It is an error for
a shared change queue to have more than one job with a queue-name if
they are not the same.
**failure-message (optional)**
The message that should be reported to Gerrit if the job fails.
+74
View File
@@ -0,0 +1,74 @@
pipelines:
- name: check
manager: IndependentPipelineManager
trigger:
gerrit:
- event: patchset-created
success:
gerrit:
verified: 1
failure:
gerrit:
verified: -1
- name: post
manager: IndependentPipelineManager
trigger:
gerrit:
- event: ref-updated
ref: ^(?!refs/).*$
- name: gate
manager: DependentPipelineManager
failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
trigger:
gerrit:
- event: comment-added
approval:
- approved: 1
success:
gerrit:
verified: 2
submit: true
failure:
gerrit:
verified: -2
start:
gerrit:
verified: 0
precedence: high
jobs:
- name: project1-project2-integration
queue-name: integration
- name: project1-test1
queue-name: not_integration
projects:
- name: org/project1
check:
- project1-merge:
- project1-test1
- project1-test2
- project1-project2-integration
gate:
- project1-merge:
- project1-test1
- project1-test2
- project1-project2-integration
post:
- project1-post
- name: org/project2
check:
- project2-merge:
- project2-test1
- project2-test2
- project1-project2-integration
gate:
- project2-merge:
- project2-test1
- project2-test2
- project1-project2-integration
post:
- project2-post
+2
View File
@@ -114,6 +114,8 @@ jobs:
- '.*-requires'
- name: node-project-test1
parameter-function: select_debian_node
- name: project1-project2-integration
queue-name: integration
project-templates:
- name: test-one-and-two
+15
View File
@@ -2964,6 +2964,21 @@ class TestScheduler(testtools.TestCase):
self.assertTrue(re.search("project-test2.*SUCCESS", desc))
self.assertTrue(re.search("Reported result.*SUCCESS", desc))
def test_queue_names(self):
"Test shared change queue names"
project1 = self.sched.layout.projects['org/project1']
project2 = self.sched.layout.projects['org/project2']
q1 = self.sched.layout.pipelines['gate'].getQueue(project1)
q2 = self.sched.layout.pipelines['gate'].getQueue(project2)
self.assertEqual(q1.name, 'integration')
self.assertEqual(q2.name, 'integration')
self.config.set('zuul', 'layout_config',
'tests/fixtures/layout-bad-queue.yaml')
with testtools.ExpectedException(
Exception, "More than one name assigned to change queue"):
self.sched.reconfigure(self.config)
def test_queue_precedence(self):
"Test that queue precedence works"
+1
View File
@@ -108,6 +108,7 @@ class LayoutSchema(object):
}
job = {v.Required('name'): str,
'queue-name': str,
'failure-message': str,
'success-message': str,
'failure-pattern': str,
+16 -2
View File
@@ -314,6 +314,8 @@ class ChangeQueue(object):
window_decrease_type='exponential', window_decrease_factor=2):
self.pipeline = pipeline
self.name = ''
self.assigned_name = None
self.generated_name = None
self.projects = []
self._jobs = set()
self.queue = []
@@ -334,10 +336,21 @@ class ChangeQueue(object):
def addProject(self, project):
if project not in self.projects:
self.projects.append(project)
self._jobs |= set(self.pipeline.getJobTree(project).getJobs())
names = [x.name for x in self.projects]
names.sort()
self.name = ', '.join(names)
self._jobs |= set(self.pipeline.getJobTree(project).getJobs())
self.generated_name = ', '.join(names)
for job in self._jobs:
if job.queue_name:
if (self.assigned_name and
job.queue_name != self.assigned_name):
raise Exception("More than one name assigned to "
"change queue: %s != %s" %
(self.assigned_name, job.queue_name))
self.assigned_name = job.queue_name
self.name = self.assigned_name or self.generated_name
def enqueueChange(self, change):
item = QueueItem(self.pipeline, change)
@@ -431,6 +444,7 @@ class Job(object):
def __init__(self, name):
# If you add attributes here, be sure to add them to the copy method.
self.name = name
self.queue_name = None
self.failure_message = None
self.success_message = None
self.failure_pattern = None
+5 -1
View File
@@ -315,6 +315,9 @@ class Scheduler(threading.Thread):
job = layout.getJob(config_job['name'])
# Be careful to only set attributes explicitly present on
# this job, to avoid squashing attributes set by a meta-job.
m = config_job.get('queue-name', None)
if m:
job.queue_name = m
m = config_job.get('failure-message', None)
if m:
job.failure_message = m
@@ -1665,7 +1668,8 @@ class DependentPipelineManager(BasePipelineManager):
self.log.info(" Shared change queues:")
for queue in new_change_queues:
self.pipeline.addQueue(queue)
self.log.info(" %s" % queue)
self.log.info(" %s containing %s" % (
queue, queue.generated_name))
def combineChangeQueues(self, change_queues):
self.log.debug("Combining shared queues")