Skip to content

Commit 45fd36e

Browse files
authored
feat: add support for git revision and context dir options to image builds (#933)
Add `repository_revision` and `context_dir` fields to `build_parameters` (session environments built from code). Details: * `repository_revision` allows users to specify a git revision (branch, tag or commit) to build from. * `context_dir` allows users to specify the relative path to a folder to build from * Both `context_dir` and `repository_revision` can be reset by providing the empty string in the `PATCH` endpoint.
1 parent 8be58eb commit 45fd36e

9 files changed

Lines changed: 285 additions & 4 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""update sessions.build_parameters table
2+
3+
Revision ID: 9ec3d97e3b3d
4+
Revises: b402b9d584bf
5+
Create Date: 2025-07-21 13:33:06.079306
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
from alembic import op
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "9ec3d97e3b3d"
14+
down_revision = "b402b9d584bf"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade() -> None:
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column(
22+
"build_parameters", sa.Column("repository_revision", sa.String(length=500), nullable=True), schema="sessions"
23+
)
24+
op.add_column("build_parameters", sa.Column("context_dir", sa.String(length=500), nullable=True), schema="sessions")
25+
# ### end Alembic commands ###
26+
27+
28+
def downgrade() -> None:
29+
# ### commands auto generated by Alembic - please adjust! ###
30+
op.drop_column("build_parameters", "context_dir", schema="sessions")
31+
op.drop_column("build_parameters", "repository_revision", schema="sessions")
32+
# ### end Alembic commands ###

components/renku_data_services/session/api.spec.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,24 @@ components:
648648
type: string
649649
minLength: 1
650650
maxLength: 99
651+
RepositoryRevision:
652+
description: A git revision
653+
type: string
654+
minLength: 1
655+
maxLength: 500
656+
RepositoryRevisionPatch:
657+
description: A git revision
658+
type: string
659+
maxLength: 500
660+
BuildContextDir:
661+
description: The relative path to a folder
662+
type: string
663+
minLength: 1
664+
maxLength: 500
665+
BuildContextDirPatch:
666+
description: The relative path to a folder
667+
type: string
668+
maxLength: 500
651669
EnvironmentIdOnlyPatch:
652670
type: object
653671
properties:
@@ -704,6 +722,10 @@ components:
704722
$ref: "#/components/schemas/BuilderVariant"
705723
frontend_variant:
706724
$ref: "#/components/schemas/FrontendVariant"
725+
repository_revision:
726+
$ref: "#/components/schemas/RepositoryRevision"
727+
context_dir:
728+
$ref: "#/components/schemas/BuildContextDir"
707729
required:
708730
- repository
709731
- builder_variant
@@ -727,6 +749,10 @@ components:
727749
$ref: "#/components/schemas/BuilderVariant"
728750
frontend_variant:
729751
$ref: "#/components/schemas/FrontendVariant"
752+
repository_revision:
753+
$ref: "#/components/schemas/RepositoryRevisionPatch"
754+
context_dir:
755+
$ref: "#/components/schemas/BuildContextDirPatch"
730756
ContainerImage:
731757
description: A container image
732758
type: string

components/renku_data_services/session/apispec.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2025-04-10T14:23:45+00:00
3+
# timestamp: 2025-07-21T13:24:31+00:00
44

55
from __future__ import annotations
66

@@ -186,7 +186,7 @@ class EnvironmentWithoutContainerImage(BaseAPISpec):
186186
min_length=1,
187187
)
188188
is_archived: Optional[bool] = Field(
189-
None,
189+
False,
190190
description="Whether this environment is archived and not for use in new projects or not",
191191
)
192192

@@ -323,7 +323,7 @@ class EnvironmentPatch(BaseAPISpec):
323323
min_length=1,
324324
)
325325
is_archived: Optional[bool] = Field(
326-
None,
326+
False,
327327
description="Whether this environment is archived and not for use in new projects or not",
328328
)
329329

@@ -360,6 +360,12 @@ class BuildParameters(BaseAPISpec):
360360
frontend_variant: str = Field(
361361
..., description="User's Frontend Choice.", max_length=99, min_length=1
362362
)
363+
repository_revision: Optional[str] = Field(
364+
None, description="A git revision", max_length=500, min_length=1
365+
)
366+
context_dir: Optional[str] = Field(
367+
None, description="The relative path to a folder", max_length=500, min_length=1
368+
)
363369

364370

365371
class BuildParametersPost(BuildParameters):
@@ -377,6 +383,12 @@ class BuildParametersPatch(BaseAPISpec):
377383
frontend_variant: Optional[str] = Field(
378384
None, description="User's Frontend Choice.", max_length=99, min_length=1
379385
)
386+
repository_revision: Optional[str] = Field(
387+
None, description="A git revision", max_length=500
388+
)
389+
context_dir: Optional[str] = Field(
390+
None, description="The relative path to a folder", max_length=500
391+
)
380392

381393

382394
class BuildCommonPart(BaseAPISpec):

components/renku_data_services/session/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ def validate_unsaved_build_parameters(
6767
repository=environment.repository,
6868
builder_variant=environment.builder_variant,
6969
frontend_variant=environment.frontend_variant,
70+
repository_revision=environment.repository_revision,
71+
context_dir=environment.context_dir,
7072
)
7173

7274

@@ -91,6 +93,8 @@ def validate_build_parameters_patch(environment: apispec.BuildParametersPatch) -
9193
repository=environment.repository,
9294
builder_variant=environment.builder_variant,
9395
frontend_variant=environment.frontend_variant,
96+
repository_revision=environment.repository_revision,
97+
context_dir=environment.context_dir,
9498
)
9599

96100

components/renku_data_services/session/db.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ def __copy_environment(
141141
builder_variant=environment.build_parameters.builder_variant,
142142
frontend_variant=environment.build_parameters.frontend_variant,
143143
repository=environment.build_parameters.repository,
144+
repository_revision=environment.build_parameters.repository_revision,
145+
context_dir=environment.build_parameters.context_dir,
144146
)
145147
session.add(new_build_parameters)
146148

@@ -165,6 +167,8 @@ def __insert_build_parameters_environment(
165167
builder_variant=new_build_parameters_environment.builder_variant,
166168
frontend_variant=new_build_parameters_environment.frontend_variant,
167169
repository=new_build_parameters_environment.repository,
170+
repository_revision=new_build_parameters_environment.repository_revision,
171+
context_dir=new_build_parameters_environment.context_dir,
168172
)
169173
session.add(build_parameters_orm)
170174

@@ -262,6 +266,14 @@ async def __update_environment_build_parameters(
262266
environment.build_parameters.builder_variant = build_parameters.builder_variant
263267
if build_parameters.frontend_variant is not None:
264268
environment.build_parameters.frontend_variant = build_parameters.frontend_variant
269+
if build_parameters.repository_revision == "":
270+
environment.build_parameters.repository_revision = None
271+
elif build_parameters.repository_revision:
272+
environment.build_parameters.repository_revision = build_parameters.repository_revision
273+
if build_parameters.context_dir == "":
274+
environment.build_parameters.context_dir = None
275+
elif build_parameters.context_dir:
276+
environment.build_parameters.context_dir = build_parameters.context_dir
265277

266278
async def update_environment(
267279
self, user: base_models.APIUser, environment_id: ULID, patch: models.EnvironmentPatch
@@ -406,6 +418,8 @@ async def insert_launcher(
406418
builder_variant=launcher.environment.builder_variant,
407419
frontend_variant=launcher.environment.frontend_variant,
408420
repository=launcher.environment.repository,
421+
repository_revision=launcher.environment.repository_revision,
422+
context_dir=launcher.environment.context_dir,
409423
)
410424
session.add(build_parameters_orm)
411425

@@ -700,6 +714,8 @@ async def __update_launcher_environment(
700714
builder_variant=new_custom_built_environment.builder_variant,
701715
frontend_variant=new_custom_built_environment.frontend_variant,
702716
repository=new_custom_built_environment.repository,
717+
repository_revision=new_custom_built_environment.repository_revision,
718+
context_dir=new_custom_built_environment.context_dir,
703719
)
704720
session.add(build_parameters_orm)
705721

@@ -1024,6 +1040,8 @@ def _get_buildrun_params(
10241040
raise errors.UnauthorizedError(message="You do not have the required permissions for this operation.")
10251041

10261042
git_repository = build_parameters.repository
1043+
git_repository_revision = build_parameters.repository_revision
1044+
context_dir = build_parameters.context_dir
10271045

10281046
output_image_prefix = (
10291047
self.builds_config.build_output_image_prefix or constants.BUILD_DEFAULT_OUTPUT_IMAGE_PREFIX
@@ -1072,6 +1090,8 @@ def _get_buildrun_params(
10721090
labels=labels,
10731091
annotations=annotations,
10741092
frontend=build_parameters.frontend_variant,
1093+
git_repository_revision=git_repository_revision,
1094+
context_dir=context_dir,
10751095
)
10761096

10771097
async def _get_environment_authorization(

components/renku_data_services/session/k8s_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,10 @@ async def create_image_build(self, params: models.ShipwrightBuildRunParams, user
183183
spec=crs.BuildRunSpec(
184184
build=crs.Build(
185185
spec=crs.BuildSpec(
186-
source=crs.GitSource(git=crs.Git(url=params.git_repository)),
186+
source=crs.GitSource(
187+
git=crs.Git(url=params.git_repository, revision=params.git_repository_revision),
188+
contextDir=params.context_dir,
189+
),
187190
strategy=crs.Strategy(kind="BuildStrategy", name=params.build_strategy_name),
188191
paramValues=[
189192
crs.ParamValue(name="frontend", value=params.frontend),

components/renku_data_services/session/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class UnsavedBuildParameters:
6060
repository: str
6161
builder_variant: str
6262
frontend_variant: str
63+
repository_revision: str | None = None
64+
context_dir: str | None = None
6365

6466

6567
@dataclass(kw_only=True, frozen=True, eq=True)
@@ -128,6 +130,8 @@ class BuildParametersPatch:
128130
repository: str | None = None
129131
builder_variant: str | None = None
130132
frontend_variant: str | None = None
133+
repository_revision: str | None = None
134+
context_dir: str | None = None
131135

132136

133137
@dataclass(eq=True, kw_only=True)
@@ -307,6 +311,8 @@ class ShipwrightBuildRunParams:
307311
annotations: dict[str, str] | None = None
308312
frontend: str = FrontendVariant.vscodium.value
309313
build_image: str | None = None
314+
git_repository_revision: str | None = None
315+
context_dir: str | None = None
310316

311317

312318
@dataclass(frozen=True, eq=True, kw_only=True)

components/renku_data_services/session/orm.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,21 @@ class BuildParametersORM(BaseORM):
203203

204204
frontend_variant: Mapped[str] = mapped_column("frontend_variant", String(99))
205205

206+
repository_revision: Mapped[str | None] = mapped_column(
207+
"repository_revision", String(500), nullable=True, default=None
208+
)
209+
210+
context_dir: Mapped[str | None] = mapped_column("context_dir", String(500), nullable=True, default=None)
211+
206212
def dump(self) -> models.BuildParameters:
207213
"""Create a session build parameters model from the BuildParametersORM."""
208214
return models.BuildParameters(
209215
id=self.id,
210216
repository=self.repository,
211217
builder_variant=self.builder_variant,
212218
frontend_variant=self.frontend_variant,
219+
repository_revision=self.repository_revision,
220+
context_dir=self.context_dir,
213221
)
214222

215223

0 commit comments

Comments
 (0)