← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~artemstreltsov/launchpad-buildd:snaps_snap_download_workaround into launchpad-buildd:master

 

Artem Streltsov has proposed merging ~artemstreltsov/launchpad-buildd:snaps_snap_download_workaround into launchpad-buildd:master.

Commit message:
Add workaround to update snapd to latest version in snap builds to avoid icon download issue

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~artemstreltsov/launchpad-buildd/+git/launchpad-buildd/+merge/495050
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~artemstreltsov/launchpad-buildd:snaps_snap_download_workaround into launchpad-buildd:master.
diff --git a/lpbuildd/target/build_snap.py b/lpbuildd/target/build_snap.py
index 5d957ae..098daf2 100644
--- a/lpbuildd/target/build_snap.py
+++ b/lpbuildd/target/build_snap.py
@@ -150,6 +150,39 @@ class BuildSnap(
         self.backend.run(["apt-get", "-y", "install"] + deps)
         if self.backend.supports_snapd:
             self.snap_store_set_proxy()
+        if self.args.proxy_url:
+            # XXX jugmac00 2024-04-17: this is configuring an SVN server;
+            # it is currently unclear whether this is still necessary for
+            # building snaps
+            # jugmac00 reached out both to William and Claudio to figure out
+            self.install_svn_servers(self.args.proxy_url)
+            if not self.args.use_fetch_service:
+                self.install_snapd_proxy(self.args.proxy_url)
+        if self.args.use_fetch_service:
+            # Deleting apt cache /var/lib/apt/lists before
+            # installing the fetch service
+            self.install_apt_proxy()
+            self.delete_apt_cache()
+            self.install_mitm_certificate()
+            self.install_snapd_proxy(proxy_url=self.args.proxy_url)
+            self.backend.run(["apt-get", "-y", "update"])
+            self.restart_snapd()
+            self.configure_git_protocol_v2()
+
+        if self.backend.supports_snapd:
+            # Upgrade snapd to latest version
+            env = self.build_proxy_environment(
+                proxy_url=self.args.proxy_url,
+                use_fetch_service=self.args.use_fetch_service,
+            )
+            cmd = ["snap", "download", "snapd", "--basename=snapd"]
+            if env:
+                self.backend.run(cmd, env=env)
+            else:
+                self.backend.run(cmd)
+            self.backend.run(["snap", "ack", "snapd.assert"])
+            self.backend.run(["snap", "install", "snapd.snap"])
+
         for snap_name, channel in sorted(self.args.channels.items()):
             # snapcraft is handled separately, since it requires --classic.
             if snap_name != "snapcraft":
@@ -172,22 +205,6 @@ class BuildSnap(
                     "snapcraft",
                 ]
             )
-        if self.args.proxy_url:
-            # XXX jugmac00 2024-04-17: this is configuring an SVN server;
-            # it is currently unclear whether this is still necessary for
-            # building snaps
-            # jugmac00 reached out both to William and Claudio to figure out
-            self.install_svn_servers(self.args.proxy_url)
-        if self.args.use_fetch_service:
-            # Deleting apt cache /var/lib/apt/lists before
-            # installing the fetch service
-            self.install_apt_proxy()
-            self.delete_apt_cache()
-            self.install_mitm_certificate()
-            self.install_snapd_proxy(proxy_url=self.args.proxy_url)
-            self.backend.run(["apt-get", "-y", "update"])
-            self.restart_snapd()
-            self.configure_git_protocol_v2()
 
     def repo(self):
         """Collect git or bzr branch."""
diff --git a/lpbuildd/target/run_ci.py b/lpbuildd/target/run_ci.py
index 79a7732..8f60ab1 100644
--- a/lpbuildd/target/run_ci.py
+++ b/lpbuildd/target/run_ci.py
@@ -1,9 +1,9 @@
 # Copyright 2022 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-import subprocess
 import logging
 import os
+import subprocess
 
 from lpbuildd.target.build_snap import SnapChannelsAction
 from lpbuildd.target.operation import Operation
@@ -69,7 +69,7 @@ class RunCIPrepare(
         result = subprocess.run(
             ["sudo", "service", "apparmor", "restart"],
             capture_output=True,
-            check=True
+            check=True,
         )
         logger.info("Command output: %s" % result.stdout)
         logger.info("Command errors (if any): %s" % result.stderr)
diff --git a/lpbuildd/target/tests/test_build_snap.py b/lpbuildd/target/tests/test_build_snap.py
index 3a94727..35079f4 100644
--- a/lpbuildd/target/tests/test_build_snap.py
+++ b/lpbuildd/target/tests/test_build_snap.py
@@ -73,6 +73,9 @@ class TestBuildSnap(TestCase):
             MatchesListwise(
                 [
                     RanAptGet("install", "bzr", "snapcraft"),
+                    RanSnap("download", "snapd", "--basename=snapd"),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -96,6 +99,9 @@ class TestBuildSnap(TestCase):
             MatchesListwise(
                 [
                     RanAptGet("install", "git", "snapcraft"),
+                    RanSnap("download", "snapd", "--basename=snapd"),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -147,6 +153,9 @@ class TestBuildSnap(TestCase):
                     RanCommand(
                         ["snap", "set", "core", "proxy.store=store-id"]
                     ),
+                    RanSnap("download", "snapd", "--basename=snapd"),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -181,6 +190,35 @@ class TestBuildSnap(TestCase):
                         "install", "python3", "socat", "git", "snapcraft"
                     ),
                     RanCommand(["mkdir", "-p", "/root/.subversion"]),
+                    RanCommand(
+                        [
+                            "snap",
+                            "set",
+                            "system",
+                            "proxy.http=http://proxy.example:3128/";,
+                        ]
+                    ),
+                    RanCommand(
+                        [
+                            "snap",
+                            "set",
+                            "system",
+                            "proxy.https=http://proxy.example:3128/";,
+                        ]
+                    ),
+                    RanSnap(
+                        "download",
+                        "snapd",
+                        "--basename=snapd",
+                        http_proxy="http://proxy.example:3128/";,
+                        https_proxy="http://proxy.example:3128/";,
+                        HTTP_PROXY="http://proxy.example:3128/";,
+                        HTTPS_PROXY="http://proxy.example:3128/";,
+                        GIT_PROXY_COMMAND="/usr/local/bin/lpbuildd-git-proxy",
+                        SNAPPY_STORE_NO_CDN="1",
+                    ),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -258,6 +296,26 @@ class TestBuildSnap(TestCase):
                             "snapd",
                         ]
                     ),
+                    RanSnap(
+                        "download",
+                        "snapd",
+                        "--basename=snapd",
+                        http_proxy="http://proxy.example:3128/";,
+                        https_proxy="http://proxy.example:3128/";,
+                        HTTP_PROXY="http://proxy.example:3128/";,
+                        HTTPS_PROXY="http://proxy.example:3128/";,
+                        GIT_PROXY_COMMAND="/usr/local/bin/lpbuildd-git-proxy",
+                        SNAPPY_STORE_NO_CDN="1",
+                        CARGO_HTTP_CAINFO=(
+                            "/usr/local/share/ca-certificates/local-ca.crt"
+                        ),
+                        REQUESTS_CA_BUNDLE=(
+                            "/usr/local/share/ca-certificates/local-ca.crt"
+                        ),
+                        GOPROXY="direct",
+                    ),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -357,6 +415,26 @@ class TestBuildSnap(TestCase):
                             "snapd",
                         ]
                     ),
+                    RanSnap(
+                        "download",
+                        "snapd",
+                        "--basename=snapd",
+                        http_proxy="http://proxy.example:3128/";,
+                        https_proxy="http://proxy.example:3128/";,
+                        HTTP_PROXY="http://proxy.example:3128/";,
+                        HTTPS_PROXY="http://proxy.example:3128/";,
+                        GIT_PROXY_COMMAND="/usr/local/bin/lpbuildd-git-proxy",
+                        SNAPPY_STORE_NO_CDN="1",
+                        CARGO_HTTP_CAINFO=(
+                            "/usr/local/share/ca-certificates/local-ca.crt"
+                        ),
+                        REQUESTS_CA_BUNDLE=(
+                            "/usr/local/share/ca-certificates/local-ca.crt"
+                        ),
+                        GOPROXY="direct",
+                    ),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                 ]
             ),
         )
@@ -410,6 +488,9 @@ class TestBuildSnap(TestCase):
             MatchesListwise(
                 [
                     RanAptGet("install", "bzr", "sudo"),
+                    RanSnap("download", "snapd", "--basename=snapd"),
+                    RanSnap("ack", "snapd.assert"),
+                    RanSnap("install", "snapd.snap"),
                     RanSnap("install", "--channel=candidate", "core"),
                     RanSnap("refresh", "--channel=candidate", "core"),
                     RanSnap("install", "--channel=beta", "core18"),