← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~ruinedyourlife/launchpad-buildd:process-craft-env-vars into launchpad-buildd:master

 

Quentin Debhi has proposed merging ~ruinedyourlife/launchpad-buildd:process-craft-env-vars into launchpad-buildd:master.

Commit message:
Process cargo & maven env variables

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~ruinedyourlife/launchpad-buildd/+git/launchpad-buildd/+merge/480177
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~ruinedyourlife/launchpad-buildd:process-craft-env-vars into launchpad-buildd:master.
diff --git a/lpbuildd/craft.py b/lpbuildd/craft.py
index ee21c7f..d61ef34 100644
--- a/lpbuildd/craft.py
+++ b/lpbuildd/craft.py
@@ -38,6 +38,7 @@ class CraftBuildManager(BuildManagerProxyMixin, DebianBuildManager):
         self.launchpad_instance = extra_args.get("launchpad_instance")
         self.launchpad_server_url = extra_args.get("launchpad_server_url")
         self.proxy_service = None
+        self.environment_variables = extra_args.get("environment_variables")
 
         super().initiate(files, chroot, extra_args)
 
@@ -69,6 +70,9 @@ class CraftBuildManager(BuildManagerProxyMixin, DebianBuildManager):
             args.extend(["--launchpad-instance", self.launchpad_instance])
         if self.launchpad_server_url:
             args.extend(["--launchpad-server-url", self.launchpad_server_url])
+        if self.environment_variables:
+            for key, value in self.environment_variables.items():
+                args.extend(["--environment-variable", f"{key}={value}"])
         args.append(self.name)
         self.runTargetSubProcess("build-craft", *args)
 
diff --git a/lpbuildd/target/build_craft.py b/lpbuildd/target/build_craft.py
index 1e506ed..2a0e4ba 100644
--- a/lpbuildd/target/build_craft.py
+++ b/lpbuildd/target/build_craft.py
@@ -150,7 +150,111 @@ class BuildCraft(
         )
         self.vcs_update_status(self.buildd_path)
 
+    def setup_cargo_credentials(self):
+        """Set up Cargo credential files if needed."""
+        env_vars = dict(
+            pair.split("=", maxsplit=1) 
+            for pair in self.args.environment_variables
+        )
+        
+        # Check if we have any cargo-related variables
+        cargo_vars = {k: v for k, v in env_vars.items() if k.startswith("CARGO_")}
+        if not cargo_vars:
+            return
+
+        # Create .cargo directory
+        cargo_dir = os.path.join(self.buildd_path, ".cargo")
+        self.backend.run(["mkdir", "-p", cargo_dir])
+
+        # Parse registry URLs and tokens
+        registries = {}
+        for key, value in cargo_vars.items():
+            if key.endswith("_URL"):
+                registry_name = key[6:-4].lower()  # Remove CARGO_ and _URL
+                registries.setdefault(registry_name, {})["url"] = value
+            elif key.endswith("_TOKEN"):
+                registry_name = key[6:-6].lower()  # Remove CARGO_ and _TOKEN
+                registries.setdefault(registry_name, {})["token"] = value
+
+        # Create config.toml manually
+        config_toml = '[registry]\nglobal-credential-providers = ["cargo:token"]\n\n'
+        
+        # Add registry sections
+        for name, reg in registries.items():
+            config_toml += f'[registries.{name}-stable-local]\nindex = "{reg["url"]}"\n\n'
+        
+        # Add source.crates-io section
+        first_registry = next(iter(registries.keys()), "crates-io")
+        config_toml += f'[source.crates-io]\nreplace-with = "{first_registry}"\n'
+
+        with self.backend.open(os.path.join(cargo_dir, "config.toml"), "w") as f:
+            f.write(config_toml)
+
+        # Create credentials.toml manually
+        creds_toml = ""
+        for name, reg in registries.items():
+            if "token" in reg:
+                creds_toml += f'[registries.{name}-stable-local]\ntoken = "Bearer {reg["token"]}"\n\n'
+
+        with self.backend.open(os.path.join(cargo_dir, "credentials.toml"), "w") as f:
+            f.write(creds_toml)
+
+    def setup_maven_credentials(self):
+        """Set up Maven credential files if needed."""
+        env_vars = dict(
+            pair.split("=", maxsplit=1) 
+            for pair in self.args.environment_variables
+        )
+        
+        # Check if we have any maven-related variables
+        maven_vars = {k: v for k, v in env_vars.items() if k.startswith("MAVEN_")}
+        if not maven_vars:
+            return
+
+        # Create .m2 directory
+        m2_dir = os.path.join(self.buildd_path, ".m2")
+        self.backend.run(["mkdir", "-p", m2_dir])
+
+        # Parse repository URLs and credentials
+        repositories = {}
+        for key, value in maven_vars.items():
+            if key.endswith("_URL"):
+                repo_name = key[6:-4].lower()  # Remove MAVEN_ and _URL
+                repositories.setdefault(repo_name, {})["url"] = value
+            elif key.endswith("_USERNAME"):
+                repo_name = key[6:-9].lower()  # Remove MAVEN_ and _USERNAME
+                repositories.setdefault(repo_name, {})["username"] = value
+            elif key.endswith("_PASSWORD"):
+                repo_name = key[6:-9].lower()  # Remove MAVEN_ and _PASSWORD
+                repositories.setdefault(repo_name, {})["password"] = value
+
+        # Create settings.xml
+        settings_xml = """<?xml version="1.0" encoding="UTF-8"?>
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0";
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd";>
+    <servers>
+"""
+        for name, repo in repositories.items():
+            if "username" in repo and "password" in repo:
+                settings_xml += f"""        <server>
+            <id>{name}</id>
+            <username>{repo['username']}</username>
+            <password>{repo['password']}</password>
+        </server>
+"""
+        settings_xml += """    </servers>
+</settings>
+"""
+        with self.backend.open(os.path.join(m2_dir, "settings.xml"), "w") as f:
+            f.write(settings_xml)
+
     def build(self):
+        """Running build phase..."""
+        # Set up credential files before building
+        self.setup_cargo_credentials()
+        self.setup_maven_credentials()
+
         logger.info("Running build phase...")
         build_context_path = os.path.join(
             "/home/buildd", self.args.name, self.args.build_path