Skip to content

Commit 569de2a

Browse files
feat(objects): add Project CI Lint support
Add support for validating a project's CI configuration [1] [1] https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration
1 parent 3df404c commit 569de2a

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

docs/gl_objects/projects.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,29 @@ Get total fetches in last 30 days of a project::
819819

820820
total_fetches = project.additionalstatistics.get().fetches['total']
821821

822+
Project CI Lint
823+
=============================
824+
825+
Reference
826+
---------
827+
828+
* v4 API:
829+
830+
+ :class:`gitlab.v4.objects.ProjectCiLint`
831+
+ :class:`gitlab.v4.objects.ProjectCiLintManager`
832+
+ :attr:`gitlab.v4.objects.Project.ci_lint`
833+
834+
* GitLab API: https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration
835+
836+
Examples
837+
---------
838+
839+
Validate a project's CI configuration::
840+
841+
lint_result = project.ci_lint.get()
842+
assert lint_result.valid is True # Test that the .gitlab-ci.yml is valid
843+
print(lint_result.merged_yaml) # Print the merged YAML file
844+
822845
Project storage
823846
=============================
824847

gitlab/v4/objects/projects.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
"""
2+
GitLab API:
3+
https://docs.gitlab.com/ee/api/projects.html
4+
https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration
5+
"""
16
from typing import (
27
Any,
38
Callable,
@@ -97,6 +102,8 @@
97102
"ProjectRemoteMirrorManager",
98103
"ProjectStorage",
99104
"ProjectStorageManager",
105+
"ProjectCiLint",
106+
"ProjectCiLintManager",
100107
]
101108

102109

@@ -158,6 +165,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
158165
badges: ProjectBadgeManager
159166
boards: ProjectBoardManager
160167
branches: ProjectBranchManager
168+
ci_lint: "ProjectCiLintManager"
161169
clusters: ProjectClusterManager
162170
commits: ProjectCommitManager
163171
customattributes: ProjectCustomAttributeManager
@@ -1055,3 +1063,17 @@ class ProjectStorageManager(GetWithoutIdMixin, RESTManager):
10551063

10561064
def get(self, **kwargs: Any) -> ProjectStorage:
10571065
return cast(ProjectStorage, super().get(**kwargs))
1066+
1067+
1068+
class ProjectCiLint(RESTObject):
1069+
pass
1070+
1071+
1072+
class ProjectCiLintManager(GetWithoutIdMixin, RESTManager):
1073+
_path = "/projects/{project_id}/ci/lint"
1074+
_obj_cls = ProjectCiLint
1075+
_from_parent_attrs = {"project_id": "id"}
1076+
# https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration
1077+
1078+
def get(self, **kwargs: Any) -> ProjectCiLint:
1079+
return cast(ProjectCiLint, super().get(**kwargs))

tests/unit/objects/test_projects.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@
8282
"status": "created",
8383
"source": "trigger",
8484
}
85+
ci_lint_get_content = {
86+
"valid": True,
87+
"merged_yaml": "---\n:test_job:\n :script: echo 1\n",
88+
"errors": [],
89+
"warnings": [],
90+
}
8591

8692

8793
@pytest.fixture
@@ -541,6 +547,19 @@ def resp_artifact():
541547
yield rsps
542548

543549

550+
@pytest.fixture
551+
def resp_ci_lint():
552+
with responses.RequestsMock() as rsps:
553+
rsps.add(
554+
method=responses.GET,
555+
url="http://localhost/api/v4/projects/1/ci/lint",
556+
json=ci_lint_get_content,
557+
content_type="application/json",
558+
status=200,
559+
)
560+
yield rsps
561+
562+
544563
def test_get_project(gl, resp_get_project):
545564
data = gl.projects.get(1)
546565
assert isinstance(data, Project)
@@ -756,3 +775,8 @@ def test_project_pull_mirror(project, resp_start_pull_mirroring_project):
756775
def test_project_snapshot(project, resp_snapshot_project):
757776
tar_file = project.snapshot()
758777
assert isinstance(tar_file, bytes)
778+
779+
780+
def test_project_ci_lint_get(project, resp_ci_lint):
781+
lint_result = project.ci_lint.get()
782+
assert lint_result.valid is True

0 commit comments

Comments
 (0)