<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Cjwatson on Launchpad Blog</title>
    <link>https://blog.launchpad.net/authors/cjwatson/</link>
    <description>News and updates from the Launchpad team</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 22 Nov 2023 14:00:43 +0000</lastBuildDate>
    <atom:link href="https://blog.launchpad.net/feed/authors/cjwatson/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Self-service riscv64 builds</title>
      <link>https://blog.launchpad.net/ppa/self-service-riscv64-builds/</link>
      <pubDate>Wed, 22 Nov 2023 14:00:43 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4397</guid>
      <description>&lt;p&gt;Launchpad has supported building for riscv64 for a while, since it was a requirement to get Ubuntu&amp;rsquo;s riscv64 port going.  We don&amp;rsquo;t actually have riscv64 hardware in our datacentre, since we&amp;rsquo;d need server-class hardware with the hypervisor extension and that&amp;rsquo;s still in its infancy; instead, we do full-system emulation of riscv64 on beefy amd64 hardware using &lt;code&gt;qemu&lt;/code&gt;.  This has worked well enough for a while, although it isn&amp;rsquo;t exactly fast.&lt;/p&gt;
&lt;p&gt;The biggest problem with our setup wasn&amp;rsquo;t so much performance, though; it was that we were just using a bunch of manually-provisioned virtual machines, and they weren&amp;rsquo;t being reset to a clean state between builds.  As a result, it would have been possible for a malicious build to compromise future builds on the same builder: it would only need a chroot or container escape.  This violated our standard security model for builders, in which each build runs in an isolated ephemeral VM, and each VM is destroyed and restarted from a clean image at the end of every build.  As a result, we had to limit the set of people who were allowed to have riscv64 builds on Launchpad, and we had to restrict things like snap recipes to only use very tightly-pinned parts from elsewhere on the internet (pinning is often a good idea anyway, but at an infrastructural level it isn&amp;rsquo;t something we need to require on other architectures).&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve wanted to bring this onto the same footing as our other architectures for some time.  In Canonical&amp;rsquo;s most recent product development cycle, we worked with the OpenStack team to get &lt;a href=&#34;https://bugs.launchpad.net/bugs/2023211&#34;&gt;riscv64 emulation support into nova&lt;/a&gt;, and installed a backport of this on our newest internal cloud region.  This almost took care of the problem.  However, Launchpad builder images start out as &lt;a href=&#34;https://cloud-images.ubuntu.com/&#34;&gt;standard Ubuntu cloud images&lt;/a&gt;, which on riscv64 are only available from Ubuntu 22.04 LTS onwards; in testing 22.04-based VMs on other relatively slow architectures we already knew that we were seeing some mysterious hangs in snap recipe builds.  Figuring this out blocked us for some time, and involved some pretty intensive debugging of the &amp;ldquo;&lt;code&gt;strace&lt;/code&gt; absolutely everything in sight and see if anything sensible falls out&amp;rdquo; variety.  We eventually narrowed this down to a LXD bug and were at least able to provide a &lt;a href=&#34;https://github.com/canonical/lxd/pull/12530&#34;&gt;workaround&lt;/a&gt;, at which point bringing up new builders was easy.&lt;/p&gt;
&lt;p&gt;As a result, you can now enable riscv64 builds for yourself in your PPAs or snap recipes.  Visit the PPA and follow the &amp;ldquo;Change details&amp;rdquo; link, or visit the snap recipe and follow the &amp;ldquo;Edit snap package&amp;rdquo; link; you&amp;rsquo;ll see a list of checkboxes under &amp;ldquo;Processors&amp;rdquo;, and you can enable or disable any that aren&amp;rsquo;t greyed out, including riscv64.  This now means that all Ubuntu architectures are fully virtualized and unrestricted in Launchpad, making it easier for developers to experiment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New domain names for PPAs</title>
      <link>https://blog.launchpad.net/ppa/new-domain-names-for-ppas/</link>
      <pubDate>Wed, 16 Feb 2022 18:08:27 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4375</guid>
      <description>&lt;p&gt;Since they were introduced in 2007, Launchpad&amp;rsquo;s Personal Package Archives (PPAs) have always been hosted on ppa.launchpad.net.  This has generally worked well, but one significant snag became clear later on: it was difficult to add &lt;a href=&#34;https://bugs.launchpad.net/launchpad/+bug/1473091&#34;&gt;HTTPS support for PPAs&lt;/a&gt; due to the way that cookies work on the web.&lt;/p&gt;
&lt;p&gt;Launchpad uses a cookie for your login session, which is of course security-critical, and because we use multiple domain names for the main web application (bugs.launchpad.net, code.launchpad.net, and so on), the session cookie domain has to be set to allow subdomains of launchpad.net.  We set the &amp;ldquo;Secure&amp;rdquo; flag on session cookies to ensure that browsers only ever send them over HTTPS, as well as the &amp;ldquo;HttpOnly&amp;rdquo; flag to prevent direct access to it from JavaScript; but there are still ways in which arbitrary JS on an HTTPS subdomain of launchpad.net might be able to exfiltrate or abuse users&amp;rsquo; session cookies.  As a result, we can never allow any HTTPS subdomain of launchpad.net to publish completely user-generated HTML that we don&amp;rsquo;t process first.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t currently know of a way to get ppa.launchpad.net to serve arbitrary HTML as &lt;code&gt;Content-Type: text/html&lt;/code&gt;, but this is quite a brittle protection as there are certainly ways (used for things like installer uploads) to upload arbitrary files to ppa.launchpad.net under a user-controlled directory structure, and we don&amp;rsquo;t want the webapp&amp;rsquo;s security to depend on nobody figuring out how to convince a browser to interpret any of that as arbitrary HTML.  The librarian is already on a separate launchpadlibrarian.net domain name for a similar reason.&lt;/p&gt;
&lt;p&gt;To resolve this dilemma, we&amp;rsquo;ve added a new ppa.launchpadcontent.net domain name which supports both HTTP and HTTPS (and similarly private-ppa.launchpadcontent.net for private PPAs, which as before is HTTPS-only).  &lt;code&gt;add-apt-repository&lt;/code&gt; in Ubuntu 22.04 will &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/software-properties/+bug/1959015&#34;&gt;use the new domain name by default&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The old names will carry on working indefinitely - we know they&amp;rsquo;re embedded in lots of configuration and scripts, and we have no inclination to break all of those - but we recommend moving to the new names where possible.  ppa.launchpad.net will remain HTTP-only.&lt;/p&gt;
&lt;p&gt;Some systems may need to be updated to support the new domain name, particularly things like HTTP(S) proxy configuration files and &lt;code&gt;no_proxy&lt;/code&gt; environment variables.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Login regression for users with non-ASCII names</title>
      <link>https://blog.launchpad.net/general/login-regression-for-users-with-non-ascii-names/</link>
      <pubDate>Thu, 20 Aug 2020 10:01:59 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4339</guid>
      <description>&lt;p&gt;On 2020-08-13, we deployed an update that caused users whose full names contain non-ASCII characters (which is of course &lt;a href=&#34;https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/&#34;&gt;very common&lt;/a&gt;) to be unable to log into Launchpad.  We heard about this serious regression from users on 2020-08-17, and rolled out a fix on 2020-08-18.  We&amp;rsquo;re sorry about this; it doesn&amp;rsquo;t meet the standards of both inclusion and quality that we set for ourselves.  This post aims to explain what happened, technical details of why it happened, and the steps we&amp;rsquo;ve taken to avoid it happening again.&lt;/p&gt;
&lt;p&gt;Launchpad still runs on Python 2.  This is &lt;a href=&#34;https://www.python.org/doc/sunset-python-2/&#34;&gt;a problem&lt;/a&gt;, and we&amp;rsquo;ve been gradually chipping away at it for the last couple of years.  With about three-quarters of a million lines of Python code in the main tree and over 200 dependencies, it&amp;rsquo;s a big job - but we&amp;rsquo;re well underway!&lt;/p&gt;
&lt;p&gt;Some of those dependencies have been difficult problems in their own right.  The one at issue here was &lt;a href=&#34;https://pypi.org/project/python-openid/&#34;&gt;python-openid&lt;/a&gt;, which we use as part of our login workflow, but which hasn&amp;rsquo;t been actively maintained for over ten years.  Fortunately, in this case we didn&amp;rsquo;t have to port it ourselves, because there were already a couple of forks featuring Python 3 support while preserving more or less the same interface: we chose &lt;a href=&#34;https://pypi.org/project/python-openid2/&#34;&gt;python-openid2&lt;/a&gt; on the grounds that it had done a good job of maintaining both Python 2 and 3 support in the same codebase, which we needed in order to arrange a practical transition, and that it was in itself well-maintained.  We worked with upstream to fix a couple of issues discovered by the Launchpad test suite that blocked us migrating to it (notably &lt;a href=&#34;https://github.com/ziima/python-openid/pull/41&#34;&gt;PR #41&lt;/a&gt;, although that was fixed as &lt;a href=&#34;https://github.com/ziima/python-openid/pull/43&#34;&gt;PR #43&lt;/a&gt; instead), and &lt;a href=&#34;https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/387907&#34;&gt;switched Launchpad over&lt;/a&gt; once python-openid2 3.2 was released.  So far, so good.&lt;/p&gt;
&lt;p&gt;One of the major reasons for much of the disruption in the Python 3 transition was to provide a clean separation between the concept of a sequence of bytes and a text string, which was often a problem for code that needed to handle Unicode: it&amp;rsquo;s all too common in Python 2 to have code that works on the ASCII domain (which can be represented either as &lt;code&gt;str&lt;/code&gt; or &lt;code&gt;unicode&lt;/code&gt;) but that fails on Unicode strings outside that subset.  Launchpad is less prone to that than many Python 2 applications because the &lt;a href=&#34;https://en.wikipedia.org/wiki/Object-relational_mapping&#34;&gt;ORM&lt;/a&gt; we use (&lt;a href=&#34;https://pypi.org/project/storm/&#34;&gt;Storm&lt;/a&gt;) has always been relatively strict about the boundary between bytes and text; nevertheless, having a stricter data model here is a good thing for us in the long term.  It might seem ironic that we ran into exactly such a bug as part of porting to Python 3; but then, we aren&amp;rsquo;t using the new interpreter yet.&lt;/p&gt;
&lt;p&gt;Launchpad uses the &lt;a href=&#34;https://openid.net/specs/openid-simple-registration-extension-1_0.html&#34;&gt;OpenID Simple Registration Extension&lt;/a&gt; in its login workflow.  It specifically requests the user&amp;rsquo;s full name from Canonical&amp;rsquo;s OpenID provider (&lt;a href=&#34;https://login.ubuntu.com/&#34;&gt;login.ubuntu.com&lt;/a&gt;, which we generally call &amp;ldquo;SSO&amp;rdquo;): this means that if the user has an SSO account but not yet a Launchpad account, we can create a Launchpad account for them without them needing to enter their name again.  That full name is encoded as a UTF-8 string, which in turn is URL-encoded using the usual %xx mechanism.  This means that if, say, your name is &lt;a href=&#34;https://en.wikipedia.org/wiki/Gr%C3%A1inne_N%C3%AD_Mh%C3%A1ille&#34;&gt;Gráinne Ní Mháille&lt;/a&gt;, it will show up in the OpenID response&amp;rsquo;s query string as &lt;code&gt;openid.sreg.fullname=Gr%C3%A1inne+N%C3%AD+Mh%C3%A1ille&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;python-openid2 uses its &lt;code&gt;openid.urinorm&lt;/code&gt; module to normalise parts of the response, decoding and re-encoding it to make sure comparisons work as expected; this is built on top of the URL handling code in Python&amp;rsquo;s standard library.  Now, unlike Python 3, Python 2&amp;rsquo;s &lt;a href=&#34;https://docs.python.org/2/library/urllib.html#urllib.urlencode&#34;&gt;urlencode&lt;/a&gt; has undocumented restrictions on values in the &lt;code&gt;query&lt;/code&gt; argument: if the &lt;code&gt;doseq&lt;/code&gt; argument is False (the default), then it converts values using &lt;code&gt;str(v)&lt;/code&gt;, while if it&amp;rsquo;s True then it converts Unicode values using &lt;code&gt;v.encode(&amp;quot;ASCII&amp;quot;, &amp;quot;replace&amp;quot;)&lt;/code&gt; (potentially losing information!).  In this case, &lt;code&gt;doseq&lt;/code&gt; is False, and the input given to it is always text (&lt;code&gt;unicode&lt;/code&gt; on Python 2): this works fine if the input is within the ASCII subset, but if it&amp;rsquo;s not:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; urlencode({u&amp;#39;openid.sreg.fullname&amp;#39;: u&amp;#39;Gráinne Ní Mháille&amp;#39;})
Traceback (most recent call last):
  File &amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
  File &amp;#34;/usr/lib/python2.7/urllib.py&amp;#34;, line 1350, in urlencode
    v = quote_plus(str(v))
UnicodeEncodeError: &amp;#39;ascii&amp;#39; codec can&amp;#39;t encode character u&amp;#39;\xe1&amp;#39; in position 2: ordinal not in range(128)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The fix is that on Python 2 one must always pass values to &lt;code&gt;urlencode&lt;/code&gt; as bytes rather than text:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; urlencode({u&amp;#39;openid.sreg.fullname&amp;#39;: u&amp;#39;Gráinne Ní Mháille&amp;#39;.encode(&amp;#39;UTF-8&amp;#39;)})
&amp;#39;openid.sreg.fullname=Gr%C3%A1inne+N%C3%AD+Mh%C3%A1ille&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We&amp;rsquo;ve sent &lt;a href=&#34;https://github.com/ziima/python-openid/pull/47&#34;&gt;PR #47&lt;/a&gt; to python-openid2 to implement this.  We&amp;rsquo;ve also made a temporary local fork of python-openid2 containing this patch and deployed it to Launchpad production.&lt;/p&gt;
&lt;p&gt;One thing to be clear about here: though the root cause was a bug in python-openid2, it&amp;rsquo;s &lt;em&gt;our&lt;/em&gt; responsibility to make sure it works correctly when integrated into Launchpad.&lt;/p&gt;
&lt;p&gt;We missed this bug because of a gap in testing: although we did test the full login workflow, we only did so with a test user whose full name was entirely ASCII.  We&amp;rsquo;ve &lt;a href=&#34;https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/389437&#34;&gt;closed this gap&lt;/a&gt; now, so we&amp;rsquo;ll catch it if a dependency regresses in future.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bug emails now use the bug&#39;s address in the From: header</title>
      <link>https://blog.launchpad.net/notifications/bug-emails-now-use-the-bugs-address-in-the-from-header/</link>
      <pubDate>Wed, 20 May 2020 14:43:11 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4318</guid>
      <description>&lt;p&gt;The &lt;code&gt;From:&lt;/code&gt; addresses used by Launchpad&amp;rsquo;s bug notifications have changed, to improve the chances of our messages being delivered over modern internet email.&lt;/p&gt;
&lt;p&gt;Launchpad sends a lot of email, most of which is the result of Launchpad users performing some kind of action. For example, when somebody adds a comment to a bug, Launchpad sends that comment by email to everyone who&amp;rsquo;s subscribed to the bug.&lt;/p&gt;
&lt;p&gt;Most of Launchpad was designed in an earlier era of internet email. In that era, it was perfectly reasonable to take the attitude that we were sending email on behalf of the user - in effect, being a fancy mail user agent or perhaps a little like a mailing list - and so if we generated an email that&amp;rsquo;s a direct result of something that a user did and consisting mostly of text they wrote, it made sense to put their email address in the &lt;code&gt;From:&lt;/code&gt; header. &lt;code&gt;Reply-To:&lt;/code&gt; was set so that replies would normally go to the appropriate place (the bug, in the case of bug notifications), but if somebody wanted to go to a bit of effort to start a private side conversation then it was easy to do so; and if email clients had automatic address books then those wouldn&amp;rsquo;t get confused because the address being used was a legitimate address belonging to the user in question.&lt;/p&gt;
&lt;p&gt;Of course, some people always wanted to hide their addresses for obvious privacy reasons, so since 2006 Launchpad has had a &amp;ldquo;Hide my email address from other Launchpad users&amp;rdquo; switch (which you can set on your &lt;a href=&#34;https://launchpad.net/~/+edit&#34;&gt;Change your personal details&lt;/a&gt; page), and since 2010 Launchpad has honoured this for bug notifications, so if you have that switch set then your bug comments will be sent out as something like &amp;ldquo;&lt;code&gt;From: Your Name &amp;lt;bug-id@bugs.launchpad.net&amp;gt;&lt;/code&gt;&amp;rdquo;. This compromise worked tolerably well for a while.&lt;/p&gt;
&lt;p&gt;But spammers and other bad actors ruin everything, and the internet email landscape has changed. It&amp;rsquo;s reasonably common now for operators of email domains to publish &lt;a href=&#34;https://en.wikipedia.org/wiki/DMARC&#34;&gt;&lt;abbr title=&#34;Domain-based Message Authentication, Reporting and Conformance&#34;&gt;DMARC&lt;/abbr&gt;&lt;/a&gt; policies that require emails whose From: headers are within that domain to be authenticated in some way, and this is incompatible with the older approach. As a result, it&amp;rsquo;s been getting increasingly common for Launchpad bug notifications not to be delivered because they failed these authentication checks. Regardless of how justifiable our notification-sending practices were, we have to exist within the reality of internet email as it&amp;rsquo;s actually deployed.&lt;/p&gt;
&lt;p&gt;So, thanks to a &lt;a href=&#34;https://code.launchpad.net/~teward/launchpad/+git/launchpad/+merge/383643&#34;&gt;contribution from Thomas Ward&lt;/a&gt;, Launchpad now sends all its bug notifications as if the user in question had the &amp;ldquo;Hide my email address from other Launchpad users&amp;rdquo; switch set: that is, they&amp;rsquo;ll all appear as something like &amp;ldquo;&lt;code&gt;From: Your Name &amp;lt;bug-id@bugs.launchpad.net&amp;gt;&lt;/code&gt;&amp;rdquo;. Over time we expect to extend this sort of approach to the other types of email that we send, possibly with different details depending on the situation.&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&#34;https://help.launchpad.net/Feedback&#34;&gt;let us know&lt;/a&gt; if this causes any strange behaviour in your email client. We may not be able to fix all of them, depending on how they interact with DMARC&amp;rsquo;s requirements, but we&amp;rsquo;d like to be aware of what&amp;rsquo;s going on.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Launchpad news, March 2019 - July 2019</title>
      <link>https://blog.launchpad.net/general/launchpad-news-march-2019-july-2019/</link>
      <pubDate>Tue, 06 Aug 2019 18:16:20 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4294</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a brief changelog of what we&amp;rsquo;ve been up to since our last general update.&lt;/p&gt;
&lt;h2 id=&#34;bugs&#34;&gt;Bugs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add basic GitLab bug linking (&lt;a href=&#34;https://launchpad.net/bugs/1603679&#34;&gt;#1603679&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Expect the upstream bug ID in the &amp;ldquo;number&amp;rdquo; field of GitHub issue objects, not the &amp;ldquo;id&amp;rdquo; field (&lt;a href=&#34;https://launchpad.net/bugs/1824728&#34;&gt;#1824728&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Include metadata-only bug changes in &lt;code&gt;Person:+commentedbugs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-farm&#34;&gt;Build farm&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Filter ASCII NUL characters out of build logtails (&lt;a href=&#34;https://launchpad.net/bugs/1831500&#34;&gt;#1831500&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Encode non-bytes subprocess arguments on Python 2 to avoid crashing on non-ASCII file names under &lt;code&gt;LC_CTYPE=C&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1832072&#34;&gt;#1832072&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t preload recipe data when deleting recipes associated with branches or repositories, and add some more job indexes (&lt;a href=&#34;https://launchpad.net/bugs/1793266&#34;&gt;#1793266&lt;/a&gt;, &lt;a href=&#34;https://launchpad.net/bugs/1828062&#34;&gt;#1828062&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix crash if &lt;code&gt;checkRefPermissions&lt;/code&gt; finds that the repository is nonexistent&lt;/li&gt;
&lt;li&gt;Add a rescan button to branch merge proposals for failed branch or repository scans&lt;/li&gt;
&lt;li&gt;Land parts of the work required for Git HTTPS push tokens, though this is not yet complete (&lt;a href=&#34;https://launchpad.net/bugs/1824399&#34;&gt;#1824399&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Refactor code import authorisation to be clearer and safer&lt;/li&gt;
&lt;li&gt;Set line-height on &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; elements in Bazaar file views&lt;/li&gt;
&lt;li&gt;Work in progress to redeploy Launchpad&amp;rsquo;s Git backend on more scalable infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade to PostgreSQL 10&lt;/li&gt;
&lt;li&gt;Fix make-lp-user, broken by the fix for &lt;a href=&#34;https://launchpad.net/bugs/1576142&#34;&gt;#1576142&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use our own GPG key retrieval implementation when verifying signatures rather than relying on auto-key-retrieve&lt;/li&gt;
&lt;li&gt;Give urlfetch a default timeout, fixing a regression in process-mail (&lt;a href=&#34;https://launchpad.net/bugs/1820552&#34;&gt;#1820552&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Make test suite pass on Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;Retry webhook deliveries that respond with 4xx for an hour rather than a day&lt;/li&gt;
&lt;li&gt;Merge up to a current version of Storm&lt;/li&gt;
&lt;li&gt;Upgrade to Celery 4.1.1&lt;/li&gt;
&lt;li&gt;Move development sites from &lt;code&gt;.dev&lt;/code&gt; to &lt;code&gt;.test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Upgrade to Twisted 19.2.1&lt;/li&gt;
&lt;li&gt;Upgrade to requests 2.22.0&lt;/li&gt;
&lt;li&gt;Use defusedxml to parse untrusted XML&lt;/li&gt;
&lt;li&gt;Improve caching of several delegated authorization checks (#&lt;a href=&#34;https://launchpad.net/bugs/1834625&#34;&gt;1834625&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;registry&#34;&gt;Registry&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix redaction in pillar listings of projects for which the user only has &lt;code&gt;LimitedView&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1650430&#34;&gt;#1650430&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tighten up the permitted pattern for newly-chosen usernames&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;snappy&#34;&gt;Snappy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Landed parts of the work required to support private snap builds, though this is not yet complete (&lt;a href=&#34;https://launchpad.net/bugs/1639975&#34;&gt;#1639975&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Generalise snap channel handling slightly, allowing channel selection for core16 and core18&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;build-aux/snap/snapcraft.yaml&lt;/code&gt; to the list of possible &lt;code&gt;snapcraft.yaml&lt;/code&gt; paths (&lt;a href=&#34;https://launchpad.net/bugs/1805219&#34;&gt;#1805219&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;build-request-id&lt;/code&gt; and &lt;code&gt;build-request-timestamp&lt;/code&gt; to &lt;code&gt;SNAPCRAFT_IMAGE_INFO&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Allow selecting source snap channels when requesting manual snap builds (&lt;a href=&#34;https://launchpad.net/bugs/1791265&#34;&gt;#1791265&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Push build start timestamps to the store, and use release intents so that builds are more reliably released to channels in the proper sequence (&lt;a href=&#34;https://launchpad.net/bugs/1684529&#34;&gt;#1684529&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Try to manually resolve symlinks in remote Git repositories when fetching &lt;code&gt;snapcraft.yaml&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1797366&#34;&gt;#1797366&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Consistently commit transactions in &lt;code&gt;SnapStoreUploadJob&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1833424&#34;&gt;#1833424&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Use build request jobs for all snap build requests in the web UI&lt;/li&gt;
&lt;li&gt;Honour &amp;ldquo;&lt;code&gt;base: bare&lt;/code&gt;&amp;rdquo; and &amp;ldquo;&lt;code&gt;build-base&lt;/code&gt;&amp;rdquo; when requesting snap builds (&lt;a href=&#34;https://launchpad.net/bugs/1819196&#34;&gt;#1819196&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;soyuz-package-management&#34;&gt;Soyuz (package management)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add command-not-found metadata in the archive to the Release file&lt;/li&gt;
&lt;li&gt;Check the &lt;code&gt;.deb&lt;/code&gt; format using &lt;code&gt;dpkg-deb&lt;/code&gt; rather than &lt;code&gt;ar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add s390x Secure Initial Program Load signing support (&lt;a href=&#34;https://launchpad.net/bugs/1829749&#34;&gt;#1829749&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add u-boot Flat Image Tree signing support (&lt;a href=&#34;https://launchpad.net/bugs/1831942&#34;&gt;#1831942&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&#34;https://manpages.ubuntu.com/manpages/xenial/en/man1/timeout.1.html&#34;&gt;timeout(1)&lt;/a&gt; to limit &lt;code&gt;debdiff&lt;/code&gt; rather than using &lt;a href=&#34;https://manpages.ubuntu.com/manpages/xenial/en/man3/alarm.3posix.html&#34;&gt;alarm(3)&lt;/a&gt; ourselves&lt;/li&gt;
&lt;li&gt;Allow configuring the binary file retention period of a &lt;code&gt;LiveFS&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1832477&#34;&gt;#1832477&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Import source packages from Debian bullseye&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Launchpad news, February 2019</title>
      <link>https://blog.launchpad.net/general/launchpad-news-february-2019/</link>
      <pubDate>Thu, 07 Mar 2019 16:32:09 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4290</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a brief changelog for this month.&lt;/p&gt;
&lt;h2 id=&#34;build-farm&#34;&gt;Build farm&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Allow dispatching builds with base images selected based on the pocket and/or using LXD images instead of chroot tarballs where appropriate (&lt;a href=&#34;https://launchpad.net/bugs/1811677&#34;&gt;#1811677&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Store &lt;code&gt;bzr-svn&lt;/code&gt;&amp;rsquo;s cache in the import data store&lt;/li&gt;
&lt;li&gt;Allow project owners to use the Bazaar branch rescan view&lt;/li&gt;
&lt;li&gt;Canonicalise expected rule ordering in &lt;code&gt;GitRepository.setRules&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1815431&#34;&gt;#1815431&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Upgrade to pygit2 0.27.4 (&lt;a href=&#34;https://launchpad.net/bugs/1815517&#34;&gt;#1815517&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use full gpg key fingerprints in rocketfuel-setup (contributed by Andy Brody; &lt;a href=&#34;https://launchpad.net/bugs/1814206&#34;&gt;#1814206&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;snappy&#34;&gt;Snappy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://forum.snapcraft.io/t/core18-base-in-build-snapcraft-io/7715&#34;&gt;Support snap bases&lt;/a&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1812985&#34;&gt;#1812985&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;soyuz-package-management&#34;&gt;Soyuz (package management)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Allow source &lt;code&gt;.changes&lt;/code&gt; files to omit the &lt;code&gt;Binary&lt;/code&gt; field (&lt;a href=&#34;https://launchpad.net/bugs/1813037&#34;&gt;#1813037&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Launchpad news, July 2018 - January 2019</title>
      <link>https://blog.launchpad.net/general/launchpad-news-july-2018-january-2019/</link>
      <pubDate>Thu, 21 Feb 2019 23:28:42 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4283</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a brief changelog of what we&amp;rsquo;ve been up to since our last general update.&lt;/p&gt;
&lt;h2 id=&#34;bugs&#34;&gt;Bugs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Parse a few more possible Savane URL formats (&lt;a href=&#34;https://launchpad.net/bugs/197250&#34;&gt;#197250&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Compare Bugzilla versions properly when checking whether they support the Bugzilla API (part of &lt;a href=&#34;https://launchpad.net/bugs/1802798&#34;&gt;#1802798&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-farm&#34;&gt;Build farm&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configure snap proxy settings for Subversion (&lt;a href=&#34;https://launchpad.net/bugs/1668358&#34;&gt;#1668358&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Support passing &lt;code&gt;IMAGE_TARGETS&lt;/code&gt;, &lt;code&gt;REPO_SNAPSHOT_STAMP&lt;/code&gt;, and &lt;code&gt;COHORT_KEY&lt;/code&gt; variables into live filesystem builds&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;SNAPCRAFT_BUILD_ENVIRONMENT=host&lt;/code&gt; when building snaps (&lt;a href=&#34;https://launchpad.net/bugs/1791201&#34;&gt;#1791201&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Prevent gathering results of large builds from blocking responses to XML-RPC requests (&lt;a href=&#34;https://launchpad.net/bugs/1795877&#34;&gt;#1795877&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add missing indexes on &lt;code&gt;LiveFSFile(libraryfile)&lt;/code&gt; and &lt;code&gt;SnapFile(libraryfile)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Direct build failure support to Launchpad Answers rather than to the &lt;code&gt;launchpad-buildd-admins&lt;/code&gt; team (&lt;a href=&#34;https://launchpad.net/bugs/1810001&#34;&gt;#1810001&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Allow proposing merges between different branches of the same personal Git repository&lt;/li&gt;
&lt;li&gt;Fix OOPS when trying to look up &lt;code&gt;~user/project:branch&lt;/code&gt; as a unique Git repository name (&lt;a href=&#34;https://launchpad.net/bugs/1771118&#34;&gt;#1771118&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Optimise &lt;code&gt;GitRepository.fetchRefCommits&lt;/code&gt; if there are no commits to fetch&lt;/li&gt;
&lt;li&gt;Handle the case where a Bazaar branch and a Git repository have the same identity URL when creating a recipe (&lt;a href=&#34;https://launchpad.net/bugs/1623924&#34;&gt;#1623924&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Push code imports over &lt;code&gt;bzr+ssh&lt;/code&gt; rather than &lt;code&gt;sftp&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1779572&#34;&gt;#1779572&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix crash when emailing inline comments on a diff with non-ASCII characters in hunk headers (&lt;a href=&#34;https://launchpad.net/bugs/1787587&#34;&gt;#1787587&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Percent-encode reference names in &lt;code&gt;GitRef&lt;/code&gt; URLs (&lt;a href=&#34;https://launchpad.net/bugs/1787965&#34;&gt;#1787965&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add active reviews link to Git-based project pages (&lt;a href=&#34;https://launchpad.net/bugs/1777102&#34;&gt;#1777102&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix handling of non-ASCII ref names&lt;/li&gt;
&lt;li&gt;Include the appropriate username in &lt;code&gt;git+ssh://&lt;/code&gt; URLs in the UI&lt;/li&gt;
&lt;li&gt;Add instructions on creating personal Git repositories to people&amp;rsquo;s &amp;ldquo;View Git repositories&amp;rdquo; pages (&lt;a href=&#34;https://launchpad.net/bugs/1590560&#34;&gt;#1590560&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add available review targets and proposals to the Git repository overview page (&lt;a href=&#34;https://launchpad.net/bugs/1789847&#34;&gt;#1789847&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix incorrect visibility check that broke code imports targeted at private Git repositories (&lt;a href=&#34;https://launchpad.net/bugs/1789424&#34;&gt;#1789424&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Allow anonymous users to view votes for public merge proposals (&lt;a href=&#34;https://launchpad.net/bugs/1786474&#34;&gt;#1786474&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Make Git ref scan jobs for repositories with large numbers of refs take much less memory&lt;/li&gt;
&lt;li&gt;Tolerate backend timeouts while fetching commit information for &lt;code&gt;GitRef:+index&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1804395&#34;&gt;#1804395&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.launchpad.net/code/git-per-branch-permissions&#34;&gt;Add Git per-branch permissions&lt;/a&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1517559&#34;&gt;#1517559&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add rescan buttons when various kinds of code scanning jobs fail (&lt;a href=&#34;https://launchpad.net/bugs/1808320&#34;&gt;#1808320&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Convert all remaining code to use explicit proxy configuration settings rather than picking up a proxy from the environment, making the effective production settings easier to understand&lt;/li&gt;
&lt;li&gt;Add support for ECDSA SSH keys (&lt;a href=&#34;https://launchpad.net/bugs/907675&#34;&gt;#907675&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pypi.org/project/wadllib/&#34;&gt;wadllib&lt;/a&gt; 1.3.3: Reimplement MIME multipart/form-data encoding without binary corruption bugs (&lt;a href=&#34;https://launchpad.net/bugs/1729754&#34;&gt;#1729754&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pypi.org/project/lazr.restfulclient/&#34;&gt;lazr.restfulclient&lt;/a&gt; 0.14.2: Improve compatibility with various httplib2 versions (&lt;a href=&#34;https://launchpad.net/bugs/1803558&#34;&gt;#1803558&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;registry&#34;&gt;Registry&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add a &lt;code&gt;suspend-bot-account.py&lt;/code&gt; script to suspend an account by email address&lt;/li&gt;
&lt;li&gt;Weaken type of &lt;code&gt;key_text&lt;/code&gt; in &lt;code&gt;Person.deleteSSHKeysFromSSO&lt;/code&gt; so that more existing keys can be deleted (&lt;a href=&#34;https://launchpad.net/bugs/1780411&#34;&gt;#1780411&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix &lt;code&gt;SSHKey.getFullKeyText&lt;/code&gt; to not crash on some corrupt keys (&lt;a href=&#34;https://launchpad.net/bugs/1798046&#34;&gt;#1798046&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Various improvements to the &lt;code&gt;close-account&lt;/code&gt; script&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;snappy&#34;&gt;Snappy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extract initial &lt;code&gt;Snap.store_name&lt;/code&gt; from &lt;code&gt;snapcraft.yaml&lt;/code&gt; for Bazaar as well as Git&lt;/li&gt;
&lt;li&gt;Add support for Snapcraft&amp;rsquo;s &lt;a href=&#34;https://forum.snapcraft.io/t/architectures/4972&#34;&gt;architectures&lt;/a&gt; keyword (&lt;a href=&#34;https://launchpad.net/bugs/1770400&#34;&gt;#1770400&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Bump &lt;code&gt;SnapStoreUploadJob.max_retries&lt;/code&gt; to 30 to allow for longer store scan times&lt;/li&gt;
&lt;li&gt;Include the registered store package name for a snap recipe in its builds&amp;rsquo; titles if it exists and differs from the snap recipe name&lt;/li&gt;
&lt;li&gt;Move some metadata from &lt;code&gt;SnapStoreUploadJob&lt;/code&gt; to &lt;code&gt;SnapBuild&lt;/code&gt;, to prevent store upload jobs getting into states that cannot be retried&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;soyuz-package-management&#34;&gt;Soyuz (package management)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;Archive.getSigningKeyData&lt;/code&gt;, currently just proxying through to the keyserver (&lt;a href=&#34;https://launchpad.net/bugs/1667725&#34;&gt;#1667725&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;extendedKeyUsage&lt;/code&gt; information to kmod signing keys so that they can only be used to sign modules, not boot loaders or kernels (&lt;a href=&#34;https://launchpad.net/bugs/1774746&#34;&gt;#1774746&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Git per-branch permissions</title>
      <link>https://blog.launchpad.net/code/git-per-branch-permissions/</link>
      <pubDate>Thu, 10 Jan 2019 20:41:08 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4277</guid>
      <description>&lt;p&gt;We&amp;rsquo;ve had &lt;a href=&#34;https://help.launchpad.net/Code/Git&#34;&gt;Git hosting support&lt;/a&gt; in Launchpad for a few years now.  One thing that some users asked for, particularly larger users such as the Ubuntu kernel team, was the ability to set up per-branch push permissions for their repositories.  Today we rolled out the last piece of this work.&lt;/p&gt;
&lt;p&gt;Launchpad&amp;rsquo;s default behaviour is that repository owners may push anything to their own repositories, including creating new branches, force-pushing (rewriting history), and deleting branches, while nobody else may push anything.  Repository owners can now also choose to protect branches or tags, either individually or using wildcard rules.  If a branch is protected, then by default repository owners can only create or push it but cannot force-push or delete; if a tag is protected, then by default repository owners can create it but cannot move or delete it.&lt;/p&gt;
&lt;p&gt;You can also allow selected contributors to push to protected branches or tags, so if you&amp;rsquo;re collaborating with somebody on a branch and just want to be able to quickly pair-program via &lt;code&gt;git push&lt;/code&gt;, or you want a merge robot to be able to land merge proposals in your repository without having to add it to the team that owns the repository and thus give it privileges it doesn&amp;rsquo;t need, then this feature may be for you.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s some initial &lt;a href=&#34;https://help.launchpad.net/Code/Git#Permissions&#34;&gt;documentation&lt;/a&gt; on our help site, and here&amp;rsquo;s a screenshot of a repository that&amp;rsquo;s been set up to give a contributor push access to a single branch:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.launchpad.net/images/posts/2019/01/8a6d/git-permissions.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Launchpad news, June 2018</title>
      <link>https://blog.launchpad.net/general/launchpad-news-june-2018/</link>
      <pubDate>Fri, 06 Jul 2018 00:18:52 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4274</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a brief changelog for this month.&lt;/p&gt;
&lt;h2 id=&#34;bugs&#34;&gt;Bugs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Handle &lt;code&gt;Bugzilla.time()&lt;/code&gt; changes in Bugzilla 5.1.1 (&lt;a href=&#34;https://launchpad.net/bugs/1774838&#34;&gt;#1774838&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cope with the comment &lt;code&gt;author&lt;/code&gt; field being renamed to &lt;code&gt;creator&lt;/code&gt; in recent Bugzilla versions (&lt;a href=&#34;https://launchpad.net/bugs/1774838&#34;&gt;#1774838&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-farm&#34;&gt;Build farm&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Set the hostname and FQDN of LXD containers to match the host system, though with an IP address pointing to the container (&lt;a href=&#34;https://launchpad.net/bugs/1747015&#34;&gt;#1747015&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;If the extra build arguments include &lt;code&gt;fast_cleanup: True&lt;/code&gt;, then skip the final cleanup steps of the build; this can be used when building in a VM that is guaranteed to be torn down after the build&lt;/li&gt;
&lt;li&gt;Allow checking out a git tag rather than a branch (&lt;a href=&#34;https://launchpad.net/bugs/1687078&#34;&gt;#1687078&lt;/a&gt;, &lt;a href=&#34;https://forum.snapcraft.io/t/released-launchpad-buildd-163/5925&#34;&gt;forum post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add a local unauthenticated proxy on port 8222, which proxies through to the remote authenticated proxy; this should allow running a wider range of network clients, since some of them apparently don&amp;rsquo;t support authenticated proxies very well (&lt;a href=&#34;https://launchpad.net/bugs/1690834&#34;&gt;#1690834&lt;/a&gt;, &lt;a href=&#34;https://launchpad.net/bugs/1753340&#34;&gt;#1753340&lt;/a&gt;, &lt;a href=&#34;https://forum.snapcraft.io/t/released-launchpad-buildd-163/5925&#34;&gt;forum post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Run tar with correct working directory when building source tarballs for snaps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Port the loggerhead (Bazaar code browser) integration to gunicorn, allowing it to be used as an internal API as well&lt;/li&gt;
&lt;li&gt;Optimise &lt;code&gt;BuildableDistroSeries.findSeries&lt;/code&gt; (&lt;a href=&#34;https://launchpad.net/bugs/1778732&#34;&gt;#1778732&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Proxy loggerhead branch diffs through the webapp, allowing AJAX MP revision diffs to work for private branches (&lt;a href=&#34;https://launchpad.net/bugs/904070&#34;&gt;#904070&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Convert most code to use explicit proxy configuration settings rather than picking up a proxy from the environment, making the effective production settings easier to understand&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;registry&#34;&gt;Registry&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix crash while adding an ssh key with unknown type (&lt;a href=&#34;https://launchpad.net/bugs/1777507&#34;&gt;#1777507&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;miscellaneous&#34;&gt;Miscellaneous&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Improve documentation of what deactivating an account does (&lt;a href=&#34;https://launchpad.net/bugs/993153&#34;&gt;#993153&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Launchpad news, May 2018</title>
      <link>https://blog.launchpad.net/general/launchpad-news-may-2018/</link>
      <pubDate>Sat, 02 Jun 2018 19:44:45 +0000</pubDate>
      <dc:creator>Colin Watson</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4271</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a brief changelog for this month.&lt;/p&gt;
&lt;h2 id=&#34;build-farm&#34;&gt;Build farm&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Send &lt;code&gt;fast_cleanup: True&lt;/code&gt; to virtualised builds, since they can safely skip the final cleanup steps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add spam controls to code review comments (&lt;a href=&#34;https://launchpad.net/bugs/1680746&#34;&gt;#1680746&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Only consider the most recent nine successful builds when estimating recipe build durations (&lt;a href=&#34;https://launchpad.net/bugs/1770121&#34;&gt;#1770121&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Make updated code import emails more informative&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade to Twisted 17.9.0&lt;/li&gt;
&lt;li&gt;Get the test suite passing on Ubuntu 18.04 LTS&lt;/li&gt;
&lt;li&gt;Allow admins to configure users such that unsigned email from them will be rejected, as a spam defence (&lt;a href=&#34;https://launchpad.net/bugs/1714967&#34;&gt;#1714967&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;snappy&#34;&gt;Snappy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prune old snap files that have been uploaded to the store; this cleaned up about 5TB of librarian space&lt;/li&gt;
&lt;li&gt;Make the snap store client cope with a few more edge cases (&lt;a href=&#34;https://launchpad.net/bugs/1766911&#34;&gt;#1766911&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Allow branches in snap store channel names (&lt;a href=&#34;https://launchpad.net/bugs/1754405&#34;&gt;#1754405&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;soyuz-package-management&#34;&gt;Soyuz (package management)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;DistroArchSeries.setChrootFromBuild&lt;/code&gt;, allowing setting a chroot from a file produced by a live filesystem build&lt;/li&gt;
&lt;li&gt;Disambiguate URLs to source package files in the face of filename clashes in imported archives&lt;/li&gt;
&lt;li&gt;Optimise SourcePackagePublishingHistory:+listing-archive-extra (&lt;a href=&#34;https://launchpad.net/bugs/1769979&#34;&gt;#1769979&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;miscellaneous&#34;&gt;Miscellaneous&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Disable purchasing of new commercial subscriptions; existing customers have been contacted, and people with questions about this can &lt;a href=&#34;https://www.ubuntu.com/support/contact-us&#34;&gt;contact Canonical support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Various minor revisions to the terms of service from Canonical&amp;rsquo;s legal department, and a clearer data privacy policy&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
