Skip to content

Commit dad6805

Browse files
Merge pull request #920 from python-gitlab/feat/deployment-create
feat: add deployment creation
2 parents e790b1e + ca256a0 commit dad6805

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

docs/gl_objects/deployments.rst

+16
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,19 @@ List deployments for a project::
2323
Get a single deployment::
2424

2525
deployment = project.deployments.get(deployment_id)
26+
27+
Create a new deployment::
28+
29+
deployment = project.deployments.create({
30+
"environment": "Test",
31+
"sha": "1agf4gs",
32+
"ref": "master",
33+
"tag": False,
34+
"status": "created",
35+
})
36+
37+
Update a deployment::
38+
39+
deployment = project.deployments.get(42)
40+
deployment.status = "failed"
41+
deployment.save()

gitlab/tests/test_gitlab.py

+44
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,50 @@ def resp_mark_all_as_done(url, request):
651651
with HTTMock(resp_mark_all_as_done):
652652
self.gl.todos.mark_all_as_done()
653653

654+
def test_deployment(self):
655+
content = '{"id": 42, "status": "success", "ref": "master"}'
656+
json_content = json.loads(content)
657+
658+
@urlmatch(
659+
scheme="http",
660+
netloc="localhost",
661+
path="/api/v4/projects/1/deployments",
662+
method="post",
663+
)
664+
def resp_deployment_create(url, request):
665+
headers = {"content-type": "application/json"}
666+
return response(200, json_content, headers, None, 5, request)
667+
668+
@urlmatch(
669+
scheme="http",
670+
netloc="localhost",
671+
path="/api/v4/projects/1/deployments/42",
672+
method="put",
673+
)
674+
def resp_deployment_update(url, request):
675+
headers = {"content-type": "application/json"}
676+
return response(200, json_content, headers, None, 5, request)
677+
678+
with HTTMock(resp_deployment_create):
679+
deployment = self.gl.projects.get(1, lazy=True).deployments.create(
680+
{
681+
"environment": "Test",
682+
"sha": "1agf4gs",
683+
"ref": "master",
684+
"tag": False,
685+
"status": "created",
686+
}
687+
)
688+
self.assertEqual(deployment.id, 42)
689+
self.assertEqual(deployment.status, "success")
690+
self.assertEqual(deployment.ref, "master")
691+
692+
with HTTMock(resp_deployment_update):
693+
json_content["status"] = "failed"
694+
deployment.status = "failed"
695+
deployment.save()
696+
self.assertEqual(deployment.status, "failed")
697+
654698
def test_update_submodule(self):
655699
@urlmatch(
656700
scheme="http", netloc="localhost", path="/api/v4/projects/1$", method="get"

gitlab/v4/objects.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -3735,15 +3735,16 @@ def set_approvers(self, approver_ids=None, approver_group_ids=None, **kwargs):
37353735
self.gitlab.http_put(path, post_data=data, **kwargs)
37363736

37373737

3738-
class ProjectDeployment(RESTObject):
3738+
class ProjectDeployment(RESTObject, SaveMixin):
37393739
pass
37403740

37413741

3742-
class ProjectDeploymentManager(RetrieveMixin, RESTManager):
3742+
class ProjectDeploymentManager(RetrieveMixin, CreateMixin, UpdateMixin, RESTManager):
37433743
_path = "/projects/%(project_id)s/deployments"
37443744
_obj_cls = ProjectDeployment
37453745
_from_parent_attrs = {"project_id": "id"}
37463746
_list_filters = ("order_by", "sort")
3747+
_create_attrs = (("sha", "ref", "tag", "status", "environment"), tuple())
37473748

37483749

37493750
class ProjectProtectedBranch(ObjectDeleteMixin, RESTObject):

0 commit comments

Comments
 (0)