Source code for gcip2.pipeline.pipeline

 1import dataclasses
 2from collections.abc import Iterable
 3from typing import Self
 4
 5import injector
 6
 7from gcip2.pipeline_core import (
 8    Default,
 9    Image,
10    Job,
11    JobBuilderImpl,
12    Pipeline,
13    Stage,
14    Workflow,
15    WorkflowAutoCancel,
16    WorkflowAutoCancelOnNewCommit,
17    WorkflowRule,
18    WorkflowWhen,
19)
20from gcip2.project_config import ProjectConfig
21
22
[docs] 23class _PipelineBuilder:
[docs] 24 def build(self) -> Pipeline: 25 raise NotImplementedError
26 27
[docs] 28@injector.inject 29@dataclasses.dataclass 30class _BasePipelineBuilder(_PipelineBuilder): 31 _config: ProjectConfig 32 _di: injector.Injector 33 34 model: Pipeline = dataclasses.field(init=False, default_factory=Pipeline) 35 36 def __post_init__(self): 37 "extension point for childs" 38
[docs] 39 def apply(self: Self) -> Self: 40 return self
41
[docs] 42 def build(self: Self) -> Pipeline: 43 if not self.model.default: 44 self.model.default = Default() 45 46 if not self.model.default.image: 47 image_data = self._config.compose.images.get("base_python") 48 if not image_data: 49 raise ValueError(f"image_data not found in {self._config.compose.path.name}") 50 self.model.default.image = Image(name=image_data.image) 51 52 if not self.model.default.tags: 53 self.model.default.tags = ["static-k8s"] 54 55 if not self.model.stages: 56 self.model.stages = [Stage.JOBS] 57 58 return self.model.model_copy(deep=True)
59
[docs] 60 def job(self, job_class: type[JobBuilderImpl]) -> JobBuilderImpl: 61 return self._di.create_object(job_class)
62
[docs] 63 def add_jobs(self, jobs: Iterable[Job | JobBuilderImpl]): 64 self.model.jobs.extend(jobs)
65
[docs] 66 def with_workflow(self, workflow: Workflow): 67 self.model.workflow = workflow 68 return self
69
[docs] 70 def with_default(self, default: Default): 71 self.model.default = default 72 return self
73 74
[docs] 75class PipelineBuilderImpl(_BasePipelineBuilder): 76 def __post_init__(self) -> None: 77 self.model.workflow = Workflow( 78 auto_cancel=WorkflowAutoCancel(on_new_commit=WorkflowAutoCancelOnNewCommit.NONE), 79 rules=[ 80 WorkflowRule( 81 if_='$CI_PIPELINE_SOURCE == "push" && $CI_OPEN_MERGE_REQUESTS', 82 when=WorkflowWhen.NEVER, 83 ), 84 WorkflowRule( 85 when=WorkflowWhen.ALWAYS, 86 ), 87 ], 88 )
89 90
[docs] 91class GitlabCiBuilderImpl(_BasePipelineBuilder): 92 pass