Skip to content

Commit 425c653

Browse files
abderrahimjuergbi
authored andcommitted
buildelement.py: Add the digest-environment config property
This allows setting an environment variable inside the sandbox to the CAS digest of one or more dependencies. Co-authored by: Adrien Plazas <[email protected]>
1 parent 7e88474 commit 425c653

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

src/buildstream/buildelement.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ def configure(self, node):
219219
def configure_dependencies(self, dependencies):
220220

221221
self.__layout = {} # pylint: disable=attribute-defined-outside-init
222+
self.__digest_environment = {} # pylint: disable=attribute-defined-outside-init
222223

223224
# FIXME: Currently this forcefully validates configurations
224225
# for all BuildElement subclasses so they are unable to
@@ -227,9 +228,18 @@ def configure_dependencies(self, dependencies):
227228
for dep in dependencies:
228229
# Determine the location to stage each element, default is "/"
229230
location = "/"
231+
230232
if dep.config:
231-
dep.config.validate_keys(["location"])
232-
location = dep.config.get_str("location")
233+
dep.config.validate_keys(["digest-environment", "location"])
234+
235+
location = dep.config.get_str("location", "/")
236+
237+
digest_var_name = dep.config.get_str("digest-environment", None)
238+
239+
if digest_var_name is not None:
240+
element_list = self.__digest_environment.setdefault(digest_var_name, [])
241+
element_list.append((dep.element, dep.path))
242+
233243
try:
234244
element_list = self.__layout[location]
235245
except KeyError:
@@ -268,6 +278,16 @@ def get_unique_key(self):
268278
}
269279
dictionary["layout"] = layout_key
270280

281+
# Specify the layout in the key, if buildstream is to generate an environment
282+
# variable with the digest
283+
#
284+
if self.__digest_environment:
285+
sorted_envs = sorted(self.__digest_environment)
286+
digest_key = {
287+
env: [dependency_path for _, dependency_path in self.__digest_environment[env]] for env in sorted_envs
288+
}
289+
dictionary["digest-enviornment"] = digest_key
290+
271291
return dictionary
272292

273293
def configure_sandbox(self, sandbox):
@@ -286,7 +306,20 @@ def configure_sandbox(self, sandbox):
286306
sandbox.set_work_directory(command_dir)
287307

288308
# Setup environment
289-
sandbox.set_environment(self.get_environment())
309+
env = self.get_environment()
310+
311+
# Add "CAS digest" environment variables
312+
sorted_envs = sorted(self.__digest_environment)
313+
for digest_variable in sorted_envs:
314+
element_list = [element for element, _ in self.__digest_environment[digest_variable]]
315+
with self.timed_activity(
316+
f"Staging dependencies for '{digest_variable}' in subsandbox", silent_nested=True
317+
), self.subsandbox(sandbox) as subsandbox:
318+
self.stage_dependency_artifacts(subsandbox, element_list)
319+
digest = subsandbox.get_virtual_directory()._get_digest()
320+
env[digest_variable] = "{}/{}".format(digest.hash, digest.size_bytes)
321+
322+
sandbox.set_environment(env)
290323

291324
def stage(self, sandbox):
292325

0 commit comments

Comments
 (0)