← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~alvarocs/launchpad-buildd:charms-platform-name into launchpad-buildd:master

 

Alvaro Crespo Serrano has proposed merging ~alvarocs/launchpad-buildd:charms-platform-name into launchpad-buildd:master.

Commit message:
Add 'recipe_platform_name' as argument to pass it to the builder

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~alvarocs/launchpad-buildd/+git/launchpad-buildd/+merge/483410
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~alvarocs/launchpad-buildd:charms-platform-name into launchpad-buildd:master.
diff --git a/lpbuildd/charm.py b/lpbuildd/charm.py
index c3243bf..64f22b2 100644
--- a/lpbuildd/charm.py
+++ b/lpbuildd/charm.py
@@ -36,6 +36,7 @@ class CharmBuildManager(BuildManagerProxyMixin, DebianBuildManager):
         self.proxy_url = extra_args.get("proxy_url")
         self.revocation_endpoint = extra_args.get("revocation_endpoint")
         self.proxy_service = None
+        self.recipe_platform_name = extra_args.get("recipe_platform_name")
 
         super().initiate(files, chroot, extra_args)
 
@@ -55,6 +56,8 @@ class CharmBuildManager(BuildManagerProxyMixin, DebianBuildManager):
             args.extend(["--git-path", self.git_path])
         if self.build_path is not None:
             args.extend(["--build-path", self.build_path])
+        if self.recipe_platform_name:
+            args.extend(["--recipe-platform-name", self.recipe_platform_name])
         args.append(self.name)
         self.runTargetSubProcess("build-charm", *args)
 
diff --git a/lpbuildd/target/build_charm.py b/lpbuildd/target/build_charm.py
index 1bcbd1e..f3dfc7a 100644
--- a/lpbuildd/target/build_charm.py
+++ b/lpbuildd/target/build_charm.py
@@ -41,6 +41,11 @@ class BuildCharm(
             "--build-path", default=".", help="location of charm to build."
         )
         parser.add_argument("name", help="name of charm to build")
+        parser.add_argument(
+            "--recipe_platform_name",
+            type=str,
+            help="platform name used by the craft tool"
+        )
 
     def __init__(self, args, parser):
         super().__init__(args, parser)
@@ -105,6 +110,8 @@ class BuildCharm(
         )
         check_path_escape(self.buildd_path, build_context_path)
         env = self.build_proxy_environment(proxy_url=self.args.proxy_url)
+        if self.args.recipe_platform_name:
+            env["CRAFT_PLATFORM"] = self.args.recipe_platform_name
         args = ["charmcraft", "pack", "-v", "--destructive-mode"]
         self.run_build_command(args, env=env, cwd=build_context_path)
 
diff --git a/lpbuildd/target/tests/test_build_charm.py b/lpbuildd/target/tests/test_build_charm.py
index fa0d169..0b4264d 100644
--- a/lpbuildd/target/tests/test_build_charm.py
+++ b/lpbuildd/target/tests/test_build_charm.py
@@ -608,6 +608,35 @@ class TestBuildCharm(TestCase):
             ),
         )
 
+    def test_build_with_recipe_platform_name(self):
+        args = [
+            "build-charm",
+            "--backend=fake",
+            "--series=xenial",
+            "--arch=amd64",
+            "1",
+            "--branch",
+            "lp:foo",
+            "--recipe_platform_name",
+            "ubuntu-22.04-amd64",
+            "test-image",
+        ]
+        build_charm = parse_args(args=args).operation
+        build_charm.backend.add_dir("/build/test-directory")
+        build_charm.build()
+        self.assertThat(
+            build_charm.backend.run.calls,
+            MatchesListwise(
+                [
+                    RanBuildCommand(
+                        ["charmcraft", "pack", "-v", "--destructive-mode"],
+                        cwd="/home/buildd/test-image/.",
+                        CRAFT_PLATFORM="ubuntu-22.04-amd64",
+                    ),
+                ]
+            ),
+        )
+        
     def test_run_succeeds(self):
         args = [
             "build-charm",
diff --git a/lpbuildd/tests/test_charm.py b/lpbuildd/tests/test_charm.py
index c1e0e14..efc6f3f 100644
--- a/lpbuildd/tests/test_charm.py
+++ b/lpbuildd/tests/test_charm.py
@@ -244,6 +244,74 @@ class TestCharmBuildManagerIteration(TestCase):
         )
         self.assertFalse(self.builder.wasCalled("buildFail"))
 
+    @defer.inlineCallbacks
+    def test_iterate_recipe_platform_name(self):
+        # Test that recipe_platform_name is correctly passed through.
+        args = {
+            "git_repository": "https://git.launchpad.dev/~example/+git/charm";,
+            "recipe_platform_name": "ubuntu-22.04-amd64",
+        }
+        expected_options = [
+            "--git-repository",
+            "https://git.launchpad.dev/~example/+git/charm";,
+            "--recipe-platform-name",
+            "ubuntu-22.04-amd64",
+        ]
+        yield self.startBuild(args, expected_options)
+
+        log_path = os.path.join(self.buildmanager._cachepath, "buildlog")
+        with open(log_path, "w") as log:
+            log.write("Build log for recipe platform name test.")
+
+        self.buildmanager.backend.add_file(
+            "/home/buildd/test-charm/test-charm_1_all.charm", b"I am charming."
+        )
+
+        # After building the package, reap processes.
+        yield self.buildmanager.iterate(0)
+        expected_command = [
+            "sharepath/bin/in-target",
+            "in-target",
+            "scan-for-processes",
+            "--backend=lxd",
+            "--series=xenial",
+            "--arch=i386",
+            self.buildid,
+        ]
+
+        self.assertEqual(CharmBuildState.BUILD_CHARM, self.getState())
+        self.assertEqual(expected_command, self.buildmanager.commands[-1])
+        self.assertNotEqual(
+            self.buildmanager.iterate, self.buildmanager.iterators[-1]
+        )
+        self.assertFalse(self.builder.wasCalled("buildFail"))
+        self.assertThat(
+            self.builder,
+            HasWaitingFiles.byEquality(
+                {
+                    "test-charm_1_all.charm": b"I am charming.",
+                }
+            ),
+        )
+
+        # Control returns to the DebianBuildManager in the UMOUNT state.
+        self.buildmanager.iterateReap(self.getState(), 0)
+        expected_command = [
+            "sharepath/bin/in-target",
+            "in-target",
+            "umount-chroot",
+            "--backend=lxd",
+            "--series=xenial",
+            "--arch=i386",
+            self.buildid,
+        ]
+        self.assertEqual(CharmBuildState.UMOUNT, self.getState())
+        self.assertEqual(expected_command, self.buildmanager.commands[-1])
+        self.assertEqual(
+            self.buildmanager.iterate, self.buildmanager.iterators[-1]
+        )
+        self.assertFalse(self.builder.wasCalled("buildFail"))
+
     @responses.activate
     def test_revokeProxyToken(self):
         responses.add(

Follow ups