summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/gl_objects/builds.py16
-rw-r--r--docs/gl_objects/builds.rst6
-rw-r--r--gitlab/mixins.py19
-rw-r--r--gitlab/tests/test_mixins.py19
-rw-r--r--gitlab/v4/objects.py6
5 files changed, 63 insertions, 3 deletions
diff --git a/docs/gl_objects/builds.py b/docs/gl_objects/builds.py
index 0f616e8..03d3653 100644
--- a/docs/gl_objects/builds.py
+++ b/docs/gl_objects/builds.py
@@ -44,6 +44,22 @@ project.triggers.delete(trigger_token)
trigger.delete()
# end trigger delete
+# pipeline trigger
+def get_or_create_trigger(project):
+ trigger_decription = 'my_trigger_id'
+ for t in project.triggers.list():
+ if t.description == trigger_decription:
+ return t
+ return project.triggers.create({'description': trigger_decription})
+
+trigger = get_or_create_trigger(project)
+pipeline = project.trigger_pipeline('master', trigger.token, variables={"DEPLOY_ZONE": "us-west1"})
+while pipeline.finished_at is None:
+ pipeline.refresh()
+ os.sleep(1)
+
+# end pipeline trigger
+
# list
builds = project.builds.list() # v3
jobs = project.jobs.list() # v4
diff --git a/docs/gl_objects/builds.rst b/docs/gl_objects/builds.rst
index 2791188..c9b7330 100644
--- a/docs/gl_objects/builds.rst
+++ b/docs/gl_objects/builds.rst
@@ -102,6 +102,12 @@ Remove a trigger:
:start-after: # trigger delete
:end-before: # end trigger delete
+Full example with wait for finish:
+
+.. literalinclude:: builds.py
+ :start-after: # pipeline trigger
+ :end-before: # end pipeline trigger
+
Pipeline schedule
=================
diff --git a/gitlab/mixins.py b/gitlab/mixins.py
index cb35efc..ea21e10 100644
--- a/gitlab/mixins.py
+++ b/gitlab/mixins.py
@@ -68,6 +68,25 @@ class GetWithoutIdMixin(object):
return self._obj_cls(self, server_data)
+class RefreshMixin(object):
+ @exc.on_http_error(exc.GitlabGetError)
+ def refresh(self, **kwargs):
+ """Refresh a single object from server.
+
+ Args:
+ **kwargs: Extra options to send to the Gitlab server (e.g. sudo)
+
+ Returns None (updates the object)
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabGetError: If the server cannot perform the request
+ """
+ path = '%s/%s' % (self.manager.path, self.id)
+ server_data = self.manager.gitlab.http_get(path, **kwargs)
+ self._update_attrs(server_data)
+
+
class ListMixin(object):
@exc.on_http_error(exc.GitlabListError)
def list(self, **kwargs):
diff --git a/gitlab/tests/test_mixins.py b/gitlab/tests/test_mixins.py
index c51322a..5c10597 100644
--- a/gitlab/tests/test_mixins.py
+++ b/gitlab/tests/test_mixins.py
@@ -153,6 +153,25 @@ class TestMixinMethods(unittest.TestCase):
self.assertEqual(obj.foo, 'bar')
self.assertEqual(obj.id, 42)
+ def test_refresh_mixin(self):
+ class O(RefreshMixin, FakeObject):
+ pass
+
+ @urlmatch(scheme="http", netloc="localhost", path='/api/v4/tests/42',
+ method="get")
+ def resp_cont(url, request):
+ headers = {'Content-Type': 'application/json'}
+ content = '{"id": 42, "foo": "bar"}'
+ return response(200, content, headers, None, 5, request)
+
+ with HTTMock(resp_cont):
+ mgr = FakeManager(self.gl)
+ obj = O(mgr, {'id': 42})
+ res = obj.refresh()
+ self.assertIsNone(res)
+ self.assertEqual(obj.foo, 'bar')
+ self.assertEqual(obj.id, 42)
+
def test_get_without_id_mixin(self):
class M(GetWithoutIdMixin, FakeManager):
pass
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
index 16564e4..80a6ca5 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -909,7 +909,7 @@ class ProjectCustomAttributeManager(RetrieveMixin, SetMixin, DeleteMixin,
_from_parent_attrs = {'project_id': 'id'}
-class ProjectJob(RESTObject):
+class ProjectJob(RESTObject, RefreshMixin):
@cli.register_custom_action('ProjectJob')
@exc.on_http_error(exc.GitlabJobCancelError)
def cancel(self, **kwargs):
@@ -1045,7 +1045,7 @@ class ProjectJobManager(RetrieveMixin, RESTManager):
_from_parent_attrs = {'project_id': 'id'}
-class ProjectCommitStatus(RESTObject):
+class ProjectCommitStatus(RESTObject, RefreshMixin):
pass
@@ -1964,7 +1964,7 @@ class ProjectPipelineJobsManager(ListMixin, RESTManager):
_list_filters = ('scope',)
-class ProjectPipeline(RESTObject):
+class ProjectPipeline(RESTObject, RefreshMixin):
_managers = (('jobs', 'ProjectPipelineJobManager'), )
@cli.register_custom_action('ProjectPipeline')