Jürg Billeter pushed to branch bst-1.2 at BuildStream / buildstream
Commits:
-
76a66abf
by Jürg Billeter at 2018-08-28T13:29:47Z
-
1a96b537
by Valentin David at 2018-08-28T13:29:48Z
-
765dd3d9
by Jürg Billeter at 2018-08-28T13:29:48Z
-
0de2f87b
by Tristan Van Berkom at 2018-08-28T13:39:18Z
-
7da1c309
by Jürg Billeter at 2018-08-28T16:32:34Z
2 changed files:
Changes:
... | ... | @@ -1085,9 +1085,12 @@ class Element(Plugin): |
1085 | 1085 |
# until the full cache query below.
|
1086 | 1086 |
cached = self.__artifacts.contains(self, self.__weak_cache_key)
|
1087 | 1087 |
if (not self.__assemble_scheduled and not self.__assemble_done and
|
1088 |
- not cached and not self._pull_pending() and self._is_required()):
|
|
1089 |
- self._schedule_assemble()
|
|
1090 |
- return
|
|
1088 |
+ not cached and not self._pull_pending()):
|
|
1089 |
+ # For uncached workspaced elements, assemble is required
|
|
1090 |
+ # even if we only need the cache key
|
|
1091 |
+ if self._is_required() or self._get_workspace():
|
|
1092 |
+ self._schedule_assemble()
|
|
1093 |
+ return
|
|
1091 | 1094 |
|
1092 | 1095 |
if self.__strict_cache_key is None:
|
1093 | 1096 |
dependencies = [
|
... | ... | @@ -1107,13 +1110,17 @@ class Element(Plugin): |
1107 | 1110 |
self.__strong_cached = self.__artifacts.contains(self, self.__strict_cache_key)
|
1108 | 1111 |
|
1109 | 1112 |
if (not self.__assemble_scheduled and not self.__assemble_done and
|
1110 |
- not self.__cached and not self._pull_pending() and self._is_required()):
|
|
1113 |
+ not self.__cached and not self._pull_pending()):
|
|
1111 | 1114 |
# Workspaced sources are considered unstable if a build is pending
|
1112 | 1115 |
# as the build will modify the contents of the workspace.
|
1113 | 1116 |
# Determine as early as possible if a build is pending to discard
|
1114 | 1117 |
# unstable cache keys.
|
1115 |
- self._schedule_assemble()
|
|
1116 |
- return
|
|
1118 |
+ |
|
1119 |
+ # For uncached workspaced elements, assemble is required
|
|
1120 |
+ # even if we only need the cache key
|
|
1121 |
+ if self._is_required() or self._get_workspace():
|
|
1122 |
+ self._schedule_assemble()
|
|
1123 |
+ return
|
|
1117 | 1124 |
|
1118 | 1125 |
if self.__cache_key is None:
|
1119 | 1126 |
# Calculate strong cache key
|
... | ... | @@ -1382,7 +1389,6 @@ class Element(Plugin): |
1382 | 1389 |
# in a subprocess.
|
1383 | 1390 |
#
|
1384 | 1391 |
def _schedule_assemble(self):
|
1385 |
- assert self._is_required()
|
|
1386 | 1392 |
assert not self.__assemble_scheduled
|
1387 | 1393 |
self.__assemble_scheduled = True
|
1388 | 1394 |
|
... | ... | @@ -1390,6 +1396,8 @@ class Element(Plugin): |
1390 | 1396 |
for dep in self.dependencies(Scope.BUILD, recurse=False):
|
1391 | 1397 |
dep._set_required()
|
1392 | 1398 |
|
1399 |
+ self._set_required()
|
|
1400 |
+ |
|
1393 | 1401 |
# Invalidate workspace key as the build modifies the workspace directory
|
1394 | 1402 |
workspace = self._get_workspace()
|
1395 | 1403 |
if workspace:
|
... | ... | @@ -1579,6 +1587,10 @@ class Element(Plugin): |
1579 | 1587 |
# (bool): Whether a pull operation is pending
|
1580 | 1588 |
#
|
1581 | 1589 |
def _pull_pending(self):
|
1590 |
+ if self._get_workspace():
|
|
1591 |
+ # Workspace builds are never pushed to artifact servers
|
|
1592 |
+ return False
|
|
1593 |
+ |
|
1582 | 1594 |
if self.__strong_cached:
|
1583 | 1595 |
# Artifact already in local cache
|
1584 | 1596 |
return False
|
... | ... | @@ -712,3 +712,73 @@ def test_inconsitent_pipeline_message(cli, tmpdir, datafiles, kind): |
712 | 712 |
'build', element_name
|
713 | 713 |
])
|
714 | 714 |
result.assert_main_error(ErrorDomain.PIPELINE, "inconsistent-pipeline-workspaced")
|
715 |
+ |
|
716 |
+ |
|
717 |
+@pytest.mark.datafiles(DATA_DIR)
|
|
718 |
+@pytest.mark.parametrize("strict", [("strict"), ("non-strict")])
|
|
719 |
+def test_cache_key_workspace_in_dependencies(cli, tmpdir, datafiles, strict):
|
|
720 |
+ checkout = os.path.join(str(tmpdir), 'checkout')
|
|
721 |
+ element_name, project, workspace = open_workspace(cli, os.path.join(str(tmpdir), 'repo-a'),
|
|
722 |
+ datafiles, 'git', False)
|
|
723 |
+ |
|
724 |
+ element_path = os.path.join(project, 'elements')
|
|
725 |
+ back_dep_element_name = 'workspace-test-back-dep.bst'
|
|
726 |
+ |
|
727 |
+ # Write out our test target
|
|
728 |
+ element = {
|
|
729 |
+ 'kind': 'compose',
|
|
730 |
+ 'depends': [
|
|
731 |
+ {
|
|
732 |
+ 'filename': element_name,
|
|
733 |
+ 'type': 'build'
|
|
734 |
+ }
|
|
735 |
+ ]
|
|
736 |
+ }
|
|
737 |
+ _yaml.dump(element,
|
|
738 |
+ os.path.join(element_path,
|
|
739 |
+ back_dep_element_name))
|
|
740 |
+ |
|
741 |
+ # Modify workspace
|
|
742 |
+ shutil.rmtree(os.path.join(workspace, 'usr', 'bin'))
|
|
743 |
+ os.makedirs(os.path.join(workspace, 'etc'))
|
|
744 |
+ with open(os.path.join(workspace, 'etc', 'pony.conf'), 'w') as f:
|
|
745 |
+ f.write("PONY='pink'")
|
|
746 |
+ |
|
747 |
+ # Configure strict mode
|
|
748 |
+ strict_mode = True
|
|
749 |
+ if strict != 'strict':
|
|
750 |
+ strict_mode = False
|
|
751 |
+ cli.configure({
|
|
752 |
+ 'projects': {
|
|
753 |
+ 'test': {
|
|
754 |
+ 'strict': strict_mode
|
|
755 |
+ }
|
|
756 |
+ }
|
|
757 |
+ })
|
|
758 |
+ |
|
759 |
+ # Build artifact with dependency's modified workspace
|
|
760 |
+ assert cli.get_element_state(project, element_name) == 'buildable'
|
|
761 |
+ assert cli.get_element_key(project, element_name) == "{:?<64}".format('')
|
|
762 |
+ assert cli.get_element_state(project, back_dep_element_name) == 'waiting'
|
|
763 |
+ assert cli.get_element_key(project, back_dep_element_name) == "{:?<64}".format('')
|
|
764 |
+ result = cli.run(project=project, args=['build', back_dep_element_name])
|
|
765 |
+ result.assert_success()
|
|
766 |
+ assert cli.get_element_state(project, element_name) == 'cached'
|
|
767 |
+ assert cli.get_element_key(project, element_name) != "{:?<64}".format('')
|
|
768 |
+ assert cli.get_element_state(project, back_dep_element_name) == 'cached'
|
|
769 |
+ assert cli.get_element_key(project, back_dep_element_name) != "{:?<64}".format('')
|
|
770 |
+ result = cli.run(project=project, args=['build', back_dep_element_name])
|
|
771 |
+ result.assert_success()
|
|
772 |
+ |
|
773 |
+ # Checkout the result
|
|
774 |
+ result = cli.run(project=project, args=[
|
|
775 |
+ 'checkout', back_dep_element_name, checkout
|
|
776 |
+ ])
|
|
777 |
+ result.assert_success()
|
|
778 |
+ |
|
779 |
+ # Check that the pony.conf from the modified workspace exists
|
|
780 |
+ filename = os.path.join(checkout, 'etc', 'pony.conf')
|
|
781 |
+ assert os.path.exists(filename)
|
|
782 |
+ |
|
783 |
+ # Check that the original /usr/bin/hello is not in the checkout
|
|
784 |
+ assert not os.path.exists(os.path.join(checkout, 'usr', 'bin', 'hello'))
|