diff options
author | Nejc Habjan <nejc.habjan@siemens.com> | 2020-08-28 21:42:12 +0200 |
---|---|---|
committer | Nejc Habjan <nejc.habjan@siemens.com> | 2020-08-28 22:19:16 +0200 |
commit | b7a07fca775b278b1de7d5cb36c8421b7d9bebb7 (patch) | |
tree | 9cd42112139f7f3ca6db6881e5e40234540aed58 | |
parent | 4039c8cfc6c7783270f0da1e235ef5d70b420ba9 (diff) | |
download | gitlab-b7a07fca775b278b1de7d5cb36c8421b7d9bebb7.tar.gz |
feat(api): add endpoint for latest ref artifacts
-rw-r--r-- | gitlab/tests/objects/test_job_artifacts.py | 33 | ||||
-rw-r--r-- | gitlab/v4/objects.py | 34 |
2 files changed, 67 insertions, 0 deletions
diff --git a/gitlab/tests/objects/test_job_artifacts.py b/gitlab/tests/objects/test_job_artifacts.py new file mode 100644 index 0000000..c501d30 --- /dev/null +++ b/gitlab/tests/objects/test_job_artifacts.py @@ -0,0 +1,33 @@ +""" +GitLab API: https://docs.gitlab.com/ee/api/job_artifacts.html +""" + +import pytest +import responses + +from gitlab.v4.objects import Project + + +ref_name = "master" +job = "build" + + +@pytest.fixture +def resp_artifacts_by_ref_name(binary_content): + url = f"http://localhost/api/v4/projects/1/jobs/artifacts/{ref_name}/download?job={job}" + + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.GET, + url=url, + body=binary_content, + content_type="application/octet-stream", + status=200, + ) + yield rsps + + +def test_download_artifacts_by_ref_name(gl, binary_content, resp_artifacts_by_ref_name): + project = gl.projects.get(1, lazy=True) + artifacts = project.artifacts(ref_name=ref_name, job=job) + assert artifacts == binary_content diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 37c33e2..5289635 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -5087,6 +5087,40 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): path, post_data={"namespace": to_namespace}, **kwargs ) + @cli.register_custom_action("Project", ("ref_name", "job"), ("job_token",)) + @exc.on_http_error(exc.GitlabGetError) + def artifacts( + self, ref_name, job, streamed=False, action=None, chunk_size=1024, **kwargs + ): + """Get the job artifacts archive from a specific tag or branch. + + Args: + ref_name (str): Branch or tag name in repository. HEAD or SHA references + are not supported. + artifact_path (str): Path to a file inside the artifacts archive. + job (str): The name of the job. + job_token (str): Job token for multi-project pipeline triggers. + streamed (bool): If True the data will be processed by chunks of + `chunk_size` and each chunk is passed to `action` for + treatment + action (callable): Callable responsible of dealing with chunk of + data + chunk_size (int): Size of each chunk + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabGetError: If the artifacts could not be retrieved + + Returns: + str: The artifacts if `streamed` is False, None otherwise. + """ + path = "/projects/%s/jobs/artifacts/%s/download" % (self.get_id(), ref_name) + result = self.manager.gitlab.http_get( + path, job=job, streamed=streamed, raw=True, **kwargs + ) + return utils.response_content(result, streamed, action, chunk_size) + @cli.register_custom_action("Project", ("ref_name", "artifact_path", "job")) @exc.on_http_error(exc.GitlabGetError) def artifact( |