Skip to content

Commit 4deafb4

Browse files
author
Eero Aaltonen
committed
feat: add method to get build runs of build name
1 parent 3a0cbb2 commit 4deafb4

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ This library enables you to manage Artifactory resources such as users, groups,
4545
+ [Delete an artifact](#delete-an-artifact)
4646
* [Builds](#builds)
4747
+ [Get a list of all builds](#get-a-list-of-all-builds)
48+
+ [Get a list of build runs](#get-a-list-of-build-runs)
4849
+ [Get the information about a build](#get-the-information-about-a-build)
4950
+ [Create build](#create-build)
5051
+ [Promote a build](#promote-a-build)
@@ -513,6 +514,12 @@ art.artifacts.delete("<ARTIFACT_PATH_IN_ARTIFACTORY>")
513514
build_list: BuildListResponse = art.builds.list()
514515
```
515516

517+
#### Get a list of build runs
518+
519+
```python
520+
build_runs: BuildRuns = art.builds.get_build_runs("<build_name>")
521+
```
522+
516523
#### Get the information about a build
517524

518525
```python

pyartifactory/models/build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class BuildRuns(BaseModel):
4848
"""Models artifactory build runs."""
4949

5050
uri: str
51-
buildsNumber: Optional[List[Run]] = None
51+
buildsNumbers: Optional[List[Run]] = None
5252

5353

5454
class BuildArtifact(BaseModel):

pyartifactory/objects/build.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
BuildPromotionRequest,
1818
BuildPromotionResult,
1919
BuildProperties,
20+
BuildRuns,
2021
)
2122
from pyartifactory.objects.object import ArtifactoryObject
2223

@@ -28,6 +29,22 @@ class ArtifactoryBuild(ArtifactoryObject):
2829

2930
_uri = "build"
3031

32+
def get_build_runs(self, build_name: str) -> BuildRuns:
33+
"""Provides information about the build runs for the given build name.
34+
35+
:param build_name: Build name to be retrieved
36+
:return: BuildRuns model object containing server response
37+
"""
38+
try:
39+
response = self._get(
40+
f"api/{self._uri}/{build_name}",
41+
)
42+
logger.debug("Build Runs successfully retrieved")
43+
except requests.exceptions.HTTPError as error:
44+
self._raise_exception(error)
45+
46+
return BuildRuns(**response.json())
47+
3148
def get_build_info(
3249
self,
3350
build_name: str,

tests/test_build.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,20 @@
1818
BuildPromotionRequest,
1919
BuildPromotionResult,
2020
BuildProperties,
21+
BuildRuns,
22+
Run,
2123
)
2224

2325
URL = "http://localhost:8080/artifactory"
2426
AUTH = ("user", "password_or_apiKey")
2527

28+
BUILD_RUNS = BuildRuns(
29+
uri=f"{URL}/api/build/build_name",
30+
buildsNumbers=[
31+
Run(uri="/number", started="2025-09-05T19:55:09.593+0000"),
32+
Run(uri="/other", started="2025-09-05T19:55:28.040+0000"),
33+
],
34+
)
2635
BUILD_INFO = BuildInfo(uri=f"{URL}/api/build/build_name/number")
2736
BUILD_LIST_RESPONSE = BuildListResponse(uri=f"{URL}/api/build")
2837
BUILD_NOT_FOUND_ERROR = BuildError(errors=[{"status": 404, "message": "Not found"}])
@@ -44,6 +53,37 @@
4453
NOT_FOUND_EXCEPTION_BODY = requests.exceptions.HTTPError(response=NOT_FOUND_HTTP_RESPONSE)
4554

4655

56+
@responses.activate
57+
def test_get_build_numbers_success(mocker):
58+
responses.add(
59+
responses.GET,
60+
f"{URL}/api/build/build_name",
61+
json=BUILD_RUNS.model_dump(),
62+
status=200,
63+
)
64+
65+
artifactory_build = ArtifactoryBuild(AuthModel(url=URL, auth=AUTH))
66+
mocker.spy(artifactory_build, "get_build_runs")
67+
get_build_runs = artifactory_build.get_build_runs("build_name")
68+
69+
assert isinstance(get_build_runs, BuildRuns)
70+
assert get_build_runs == BUILD_RUNS
71+
72+
73+
@responses.activate
74+
def test_get_build_numbers_error(mocker):
75+
responses.add(
76+
responses.GET,
77+
f"{URL}/api/build/non_build",
78+
body=NOT_FOUND_EXCEPTION_BODY,
79+
status=404,
80+
)
81+
artifactory_build = ArtifactoryBuild(AuthModel(url=URL, auth=AUTH))
82+
mocker.spy(artifactory_build, "get_build_runs")
83+
with pytest.raises(BuildNotFoundError):
84+
artifactory_build.get_build_runs("non_build")
85+
86+
4787
@responses.activate
4888
def test_get_build_info_success(mocker):
4989
responses.add(

0 commit comments

Comments
 (0)