# Either copy the params dict or make a new one.
build_params = build_params and dict(
build_params.items()) or {} # Via POSTed JSON
- params = {} # Via Get string
- with invocation:
- if len(self.get_params_list()) == 0:
- if self.is_queued():
- raise WillNotBuild('%s is already queued' % repr(self))
-
- elif self.is_running():
- if skip_if_running:
- raise WillNotBuild('%s is already running' % repr(self))
- else:
- log.warn(
- "Will re-schedule %s even though it is already running", self.name)
- elif self.has_queued_build(build_params):
- msg = 'A build with these parameters is already queued.'
- raise WillNotBuild(msg)
-
- log.info("Attempting to start %s on %s", self.name, repr(
- self.get_jenkins_obj()))
-
- url = self.get_build_triggerurl()
- # If job has file parameters - it must be triggered
- # using "/build", not by "/buildWithParameters"
- # "/buildWithParameters" will ignore non-file parameters
+ url = self.get_build_triggerurl(files)
+ if cause:
+ build_params['cause'] = cause
+
+ # Build require params as form fields
+ # and as Json.
+ data = {'json': self.mk_json_from_build_parameters(build_params, files)}
+ data.update(build_params)
+
+ response = self.jenkins.requester.post_and_confirm_status(
+ url,
+ data=data,
+ params=params,
+ files=files,
+ valid=[200, 201, 303],
+ allow_redirects=False
+ )
+
+ redirect_url = response.headers['location']
+
+ if not redirect_url.startswith("%s/queue/item" % self.jenkins.baseurl):
++
if files:
- url = "%s/build" % self.baseurl
-
- if cause:
- build_params['cause'] = cause
-
- if securitytoken:
- params['token'] = securitytoken
-
- build_params['json'] = self.mk_json_from_build_parameters(build_params, files)
- data = build_params
-
- response = self.jenkins.requester.post_and_confirm_status(
- url,
- data=data,
- params=params,
- files=files,
- valid=[200, 201]
- )
- response = response
- if invoke_pre_check_delay > 0:
- log.info(
- "Waiting for %is to allow Jenkins to catch up", invoke_pre_check_delay)
- sleep(invoke_pre_check_delay)
- if block:
- total_wait = 0
-
- while self.is_queued():
- log.info(
- "Waited %is for %s to begin...", total_wait, self.name)
- sleep(invoke_block_delay)
- total_wait += invoke_block_delay
- if self.is_running():
- running_build = self.get_last_build()
- running_build.block_until_complete(
- delay=invoke_pre_check_delay)
- return invocation
+ raise ValueError('Builds with file parameters are not '
+ 'supported by this jenkinsapi version. '
+ 'Please use previous version.')
+ else:
+ raise ValueError("Not a Queue URL: %s" % redirect_url)
+
+ qi = QueueItem(redirect_url, self.jenkins)
+ if block:
+ qi.block_until_complete(delay=delay)
+ return qi
def _buildid_for_type(self, buildtype):
"""Gets a buildid for a given type of build"""
@mock.patch.object(Build, 'get_data')
def test_build_depth(self, get_data_mock):
- build = Build('http://halob:8080/job/foo/98', 98, self.j, depth=0)
- get_data_mock.assert_called_with('http://halob:8080/job/foo/98/api/python?depth=0')
+ Build('http://halob:8080/job/foo/98', 98, self.j, depth=0)
+ get_data_mock.assert_called_with('http://halob:8080/job/foo/98/api/'
+ 'python',
+ tree=None, params={'depth': 0})
+
+ def test_get_revision_no_scm(self):
+ """ with no scm, get_revision should return None """
+ self.assertEqual(self.b.get_revision(), None)
+ def test_get_revision_no_scm(self):
+ """ with no scm, get_revision should return None """
+ self.assertEqual(self.b.get_revision(), None)
+
## TEST DISABLED - DOES NOT WORK
# def test_downstream(self):
# expected = ['SingleJob','MultipleJobs']