diff --git a/README.rst b/README.rst index f87ff22..99cc404 100644 --- a/README.rst +++ b/README.rst @@ -23,6 +23,7 @@ the things you can use it for: * Create/delete/reconfig views * Put server in shutdown mode (quiet down) * List running builds +* Delete builds * Create/delete/update folders [#f1]_ * Set the next build number [#f2]_ * Install plugins diff --git a/jenkins/__init__.py b/jenkins/__init__.py index 932c984..75b8a87 100755 --- a/jenkins/__init__.py +++ b/jenkins/__init__.py @@ -115,6 +115,7 @@ STOP_BUILD = '%(folder_url)sjob/%(short_name)s/%(number)s/stop' BUILD_WITH_PARAMS_JOB = '%(folder_url)sjob/%(short_name)s/buildWithParameters' BUILD_INFO = '%(folder_url)sjob/%(short_name)s/%(number)d/api/json?depth=%(depth)s' BUILD_CONSOLE_OUTPUT = '%(folder_url)sjob/%(short_name)s/%(number)d/consoleText' +DELETE_BUILD = '%(folder_url)sjob/%(short_name)s/%(number)s/doDelete' NODE_LIST = 'computer/api/json' CREATE_NODE = 'computer/doCreateItem' DELETE_NODE = 'computer/%(name)s/doDelete' @@ -1216,6 +1217,16 @@ class Jenkins(object): 'POST', self._build_url(STOP_BUILD, locals()) )) + def delete_build(self, name, number): + """Delete a Jenkins build. + + :param name: Name of Jenkins job, ``str`` + :param number: Jenkins build number for the job, ``int`` + """ + folder_url, short_name = self._get_job_folder(name) + self.jenkins_open(requests.Request('POST', + self._build_url(DELETE_BUILD, locals()), b'')) + def get_running_builds(self): '''Return list of running builds. diff --git a/tests/test_build.py b/tests/test_build.py index af0ad47..2d907c7 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -203,6 +203,28 @@ class JenkinsStopBuildTest(JenkinsTestBase): self._check_requests(jenkins_mock.call_args_list) +class JenkinsDeleteBuildTest(JenkinsTestBase): + + @patch.object(jenkins.Jenkins, 'jenkins_open') + def test_simple(self, jenkins_mock): + self.j.delete_build(u'Test Job', number=52) + + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/Test%20Job/52/doDelete')) + self._check_requests(jenkins_mock.call_args_list) + + @patch.object(jenkins.Jenkins, 'jenkins_open') + def test_in_folder(self, jenkins_mock): + + self.j.delete_build(u'a Folder/Test Job', number=52) + + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/a%20Folder/job/Test%20Job/52/doDelete')) + self._check_requests(jenkins_mock.call_args_list) + + class JenkinsListRunningBuildsTest(JenkinsTestBase): @patch.object(jenkins.Jenkins, 'get_node_info') @patch.object(jenkins.Jenkins, 'get_nodes')