<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Toby Bellwood</title>
    <description>The latest articles on DEV Community by Toby Bellwood (@tobybellwood).</description>
    <link>https://dev.to/tobybellwood</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F189288%2Fc0943aed-88af-459e-ab7a-65a432e17893.jpg</url>
      <title>DEV Community: Toby Bellwood</title>
      <link>https://dev.to/tobybellwood</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tobybellwood"/>
    <language>en</language>
    <item>
      <title>Lagoon v2.21 released</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 17 Sep 2024 05:28:24 +0000</pubDate>
      <link>https://dev.to/uselagoon/lagoon-v221-released-2p7i</link>
      <guid>https://dev.to/uselagoon/lagoon-v221-released-2p7i</guid>
      <description>&lt;p&gt;We are excited to announce the release of Lagoon v2.21.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s New in v2.21?
&lt;/h2&gt;

&lt;p&gt;This release includes a series of new features and enhancements to improve user flexibility and security.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deprecating Unsupported and Unmaintained Images
&lt;/h2&gt;

&lt;p&gt;Unsupported or unmaintained images may have unresolved vulnerabilities, creating security risks for customers. Deprecation ensures users migrate to more secure, maintained versions.&lt;/p&gt;

&lt;p&gt;There are now warnings in the Lagoon UI and Docker Desktop. We will continue to post the warning and while at this time we do not intend to remove out-of-date images, we could potentially block builds in the future. &lt;/p&gt;

&lt;p&gt;Lagoon users take heed: &lt;strong&gt;we cannot guarantee compatibility with potentially broken builds forever&lt;/strong&gt;. It is in your best interest to keep your code up to date, and action any build warnings that Lagoon detects.&lt;/p&gt;

&lt;p&gt;Warnings can be viewed in Docker Desktop, via a &lt;code&gt;docker inspect&lt;/code&gt; command or in future releases of Lagoon, highlighted in a build.&lt;br&gt;
If the image has a suggested replacement, it will be mentioned in the warning.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fycyf4tpjx06epxzg3bu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fycyf4tpjx06epxzg3bu3.png" alt="example of a Build warning showing deprecated images" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To learn more please read further &lt;a href="https://docs.lagoon.sh/docker-images/deprecated-images/" rel="noopener noreferrer"&gt;here in the Lagoon documentation&lt;/a&gt;.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple Volume Mounts
&lt;/h2&gt;

&lt;p&gt;By supporting multiple volume mounts per pod, a single pod can access multiple persistent storage locations, which is essential for enabling more applications, frameworks, and languages to run on Lagoon. This feature boosts Lagoon’s ability to run diverse and complex setups within a single pod architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path Based Routing
&lt;/h2&gt;

&lt;p&gt;Path-based routing within an environment means that an ingress can direct traffic to different services based on the request’s URL path. This enhancement, which allows routing multiple paths to different services within the same ingress or namespace ultimately improves flexibility, scalability, and simplicity in how traffic is managed across multiple services in an environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base Image Refresh
&lt;/h2&gt;

&lt;p&gt;For projects that use custom upstream images, there is now additional functionality that forces Lagoon to check for a new image automatically on every build, just by adding the &lt;code&gt;lagoon.base.image:&lt;/code&gt; label to any image in the docker-compose.yml file and setting the value to the upstream image you want to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade to Keycloak 24
&lt;/h2&gt;

&lt;p&gt;This upgrade ensures better security, performance, and usability for managing identities and access. It will also give Lagoon greater support for authentication methods, and you can expect to hear more from us on this in the coming months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Our latest release is a commitment to enhancing and improving Lagoon and the user experience. These updates are designed to help our customers manage their environments more effectively and securely.&lt;/p&gt;

&lt;p&gt;Additionally, we are working with users to understand the importance of maintaining your code base and fixing errors. Together, we're building a more robust, efficient, and user-friendly platform that empowers your development process.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Upcoming Lagoon CLI release v0.30.0 - there's a lot of changes!</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Thu, 15 Aug 2024 20:55:47 +0000</pubDate>
      <link>https://dev.to/uselagoon/upcoming-lagoon-cli-release-v0300-theres-a-lot-of-changes-13d8</link>
      <guid>https://dev.to/uselagoon/upcoming-lagoon-cli-release-v0300-theres-a-lot-of-changes-13d8</guid>
      <description>&lt;h2&gt;
  
  
  Lagoon CLI v0.30.0: Breaking Changes and New Features
&lt;/h2&gt;

&lt;p&gt;We are excited to announce the upcoming release of Lagoon CLI v0.30.0 next week. This is a significant release that introduces several breaking changes, as well as some powerful new features. We want to give our users advance notice of what to expect, so you can prepare your tooling and workflows for a smooth transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pinning CLI Versions for Stability
&lt;/h2&gt;

&lt;p&gt;As Lagoon CLI has not yet reached a stable v1.0.0 release, occasional breaking changes are necessary to improve the tool. With v0.30.0 introducing multiple breaking changes, it has the potential to disrupt scripts and automation using the CLI.&lt;/p&gt;

&lt;p&gt;We strongly recommend pinning a specific version of the CLI in your tooling. This allows you to control when you update and adapt to any breaking changes. If you want to test the latest lagoon-cli version locally before updating, you can always build it from the source: &lt;a href="https://www.github.com/uselagoon/lagoon-cli" rel="noopener noreferrer"&gt;https://www.github.com/uselagoon/lagoon-cli&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Overview of Changes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/uselagoon/lagoon-cli/releases/tag/v0.30.0" rel="noopener noreferrer"&gt;release notes&lt;/a&gt; will provide a full list of changes in v0.30.0, and the &lt;a href="https://uselagoon.github.io/lagoon-cli" rel="noopener noreferrer"&gt;docs&lt;/a&gt; will be updated when released.&lt;/p&gt;

&lt;p&gt;Here are some key areas to be aware of in advance - we've tried to cover most of the main items that have changed:&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Updates
&lt;/h2&gt;

&lt;p&gt;amazee.io customers using Lagoon CLI should update some configuration values to use the latest DNS/hostnames:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graphql: https://api.amazeeio.cloud/graphql
hostname: token.amazeeio.cloud
port: "22"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SSH Host Key Verification
&lt;/h2&gt;

&lt;p&gt;SSH connections will now attempt verification of the host keys of the ssh endpoints, you may see messages like this in your output (it is logged to stderr)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Warning: Permanently added 'ssh.us2.amazee.io:22' to the list of known hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may also have an old host key saved in your known hosts file, if you encounter an error that contains the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll have to remove the old host key from your known hosts file manually (&lt;a href="http://ssh-known_hosts-ignore-temporarily" rel="noopener noreferrer"&gt;http://ssh-known_hosts-ignore-temporarily&lt;/a&gt;) &lt;/p&gt;

&lt;h2&gt;
  
  
  Flags Standardization
&lt;/h2&gt;

&lt;p&gt;All command flags have been changed from camelCase to kebab-case for consistency. The short code/aliases have stayed the same&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--autoIdle&lt;/code&gt; is now &lt;code&gt;--auto-idle&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--gitUrl&lt;/code&gt; is now &lt;code&gt;--git-url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--productionEnvironment&lt;/code&gt; is now &lt;code&gt;--production-environment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flags related to OpenShift have been generalized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--openshift&lt;/code&gt; options now use &lt;code&gt;--deploytarget&lt;/code&gt; instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Binary 0|1 flags for enabling/disabling features now use true|false: - &lt;code&gt;--autoIdle 0&lt;/code&gt; becomes &lt;code&gt;--auto-idle=false&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--deploymentsDisabled 1&lt;/code&gt; becomes &lt;code&gt;--deployments-disabled=true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Streamlined Output
&lt;/h2&gt;

&lt;p&gt;Some commands (&lt;code&gt;get environment&lt;/code&gt;, &lt;code&gt;get project&lt;/code&gt; and &lt;code&gt;list deploytargets&lt;/code&gt;) have had their output tables streamlined. In these cases, a new &lt;code&gt;--wide&lt;/code&gt; flag will display additional fields in the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Command Structure Changes
&lt;/h2&gt;

&lt;p&gt;The structure of some commands has changed, particularly around organization-related functionality. Refer to the documentation for an overview of the new command syntax.&lt;/p&gt;

&lt;p&gt;Described below are some of the changes to be aware of if you're using organizations,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lagoon add organization organization&lt;/code&gt; becomes &lt;code&gt;lagoon add organization&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon add organization project&lt;/code&gt; becomes &lt;code&gt;--organization-name&lt;/code&gt; flag on &lt;code&gt;lagoon add project&lt;/code&gt;
&amp;gt; Don't forget to add this flag if you work with organizations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon add organization group&lt;/code&gt; becomes &lt;code&gt;--organization-name&lt;/code&gt; flag on &lt;code&gt;lagoon add group&lt;/code&gt;
&amp;gt; Don't forget to add this flag if you work with organizations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon add organization deploytarget&lt;/code&gt; becomes &lt;code&gt;lagoon add organization-deploytarget&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon add organization user&lt;/code&gt; becomes &lt;code&gt;lagoon add organization-administrator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon delete organization organization&lt;/code&gt; becomes &lt;code&gt;lagoon delete organization&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon delete organization project&lt;/code&gt; becomes &lt;code&gt;lagoon delete organization-project&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon delete organization deploytarget&lt;/code&gt; becomes &lt;code&gt;lagoon delete organization-deploytarget&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon delete organization user&lt;/code&gt; becomes &lt;code&gt;lagoon delete organization-administrator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon list organization organizations&lt;/code&gt; becomes &lt;code&gt;lagoon list organizations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon list organization projects&lt;/code&gt; becomes &lt;code&gt;lagoon list organization-projects&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon list organization groups&lt;/code&gt; becomes &lt;code&gt;lagoon list organization-groups&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon list organization deploytargets&lt;/code&gt; becomes &lt;code&gt;lagoon list organization-deploytargets&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lagoon list organization users&lt;/code&gt; becomes &lt;code&gt;lagoon list organization-administrators&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Log Streaming Support
&lt;/h2&gt;

&lt;p&gt;Lagoon CLI v0.30.0 introduces support for retrieving and streaming container logs. It allows for truncating and following logs for services and containers, similar to SSH commands.&lt;/p&gt;

&lt;p&gt;This feature requires support from the remote cluster and will be progressively rolled out to amazee.io clusters in the coming weeks and months.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Embrace the Change, Get in Touch&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We're thrilled to bring you this powerful new version of Lagoon CLI. While the breaking changes may require some adjustment, we believe the improvements in consistency, capability, and performance are well worth it.&lt;/p&gt;

&lt;p&gt;If you have any questions or need assistance with this transition, don't hesitate to reach out to us - either in the Lagoon support channels or via your existing support arrangements. We're here to ensure your Lagoon experience remains smooth and productive.&lt;/p&gt;

&lt;p&gt;Get ready to take your workflow to the next level with Lagoon CLI v0.30.0!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Managing upstream security fixes in uselagoon docker images</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 24 Jan 2023 22:21:55 +0000</pubDate>
      <link>https://dev.to/uselagoon/managing-upstream-security-fixes-in-uselagoon-docker-images-3bdo</link>
      <guid>https://dev.to/uselagoon/managing-upstream-security-fixes-in-uselagoon-docker-images-3bdo</guid>
      <description>&lt;p&gt;This week, the Git project &lt;a href="https://lore.kernel.org/git/xmqq7cxl9h0i.fsf@gitster.g/T/#u" rel="noopener noreferrer"&gt;announced&lt;/a&gt; a maintenance release to patch two CVEs (CVE-2022-41903 and CVE-2022-23521).&lt;/p&gt;

&lt;p&gt;I thought this would be a good opportunity to cover how the Lagoon team handles ensuring these updates make it through to our uselagoon-produced images.&lt;/p&gt;

&lt;p&gt;The majority of our images are based on upstream images, created by the application, framework, or language maintainers.&lt;/p&gt;

&lt;p&gt;Using The Node.js runtime as an example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lagoon publishes a range of node images on Docker Hub (e.g. &lt;a href="https://hub.docker.com/r/uselagoon/node-18/tags" rel="noopener noreferrer"&gt;https://hub.docker.com/r/uselagoon/node-18/tags&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;This image is built using a &lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/images/node/18.Dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;We inherit the &lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/images/node/18.Dockerfile#LL3-L3C27" rel="noopener noreferrer"&gt;upstream image&lt;/a&gt; &lt;code&gt;FROM node:18.13-alpine3.17&lt;/code&gt; and then we add a number of customisations.&lt;/li&gt;
&lt;li&gt;This node image is just one of a range published by the Node.js team (&lt;a href="https://hub.docker.com/_/node" rel="noopener noreferrer"&gt;https://hub.docker.com/_/node&lt;/a&gt;), and they also have the &lt;a href="https://github.com/nodejs/docker-node/blob/main/18/alpine3.17/Dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt; for their build available&lt;/li&gt;
&lt;li&gt;The node image itself is built from the &lt;a href="https://github.com/nodejs/docker-node/blob/main/18/alpine3.17/Dockerfile#L1" rel="noopener noreferrer"&gt;upstream image&lt;/a&gt; &lt;code&gt;FROM alpine:3.17&lt;/code&gt; and customised to add the nodejs runtime and supporting libraries.&lt;/li&gt;
&lt;li&gt;The Dockerfile used to build the Alpine image is also &lt;a href="https://github.com/alpinelinux/docker-alpine/blob/e889a60a47c564eeb5e36e87afc9d156ea7d7034/x86_64/Dockerfile" rel="noopener noreferrer"&gt;available&lt;/a&gt; - this just unzips the relevant Alpine tarball into an empty "scratch" image and sets the shell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can digress slightly to explain the image naming/tagging we use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uselagoon/node-18:22.12.0&lt;/code&gt; is the latest release of our Node.js version 18 image (December 2022 - we use CalVer for our tag convention, and release monthly)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;node:18.13-alpine3.17&lt;/code&gt; in the uselagoon image is an alias tag for the latest version 18.13 Node.js image, built using the Alpine Linux distribution, version 3.17.
There are at least 10 aliases for this same image - in our case, we want to pin it to a specific minor release (18.13) using a specific Alpine version (3.17) - we could tighten or relax these, but we feel this gives us more control over automated updates
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17b8p97w089azoi6us3r.png" alt="screenshot of image aliases" width="727" height="51"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alpine:3.17&lt;/code&gt; in the Node.js image is the alias for the latest Alpine 3.17 release (currently 3.17.1). Alpine is minor version updated twice a year &lt;a href="https://alpinelinux.org/posts/Alpine-3.17.0-released.html" rel="noopener noreferrer"&gt;https://alpinelinux.org/posts/Alpine-3.17.0-released.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know this sounds really tortuous and convoluted, but bear with me!&lt;/p&gt;

&lt;p&gt;Lagoon also publishes a version of our Node.js image, with additional tools used to "build" Node.js projects - we call it &lt;code&gt;node-18-builder&lt;/code&gt; - see the &lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/images/node-builder/18.Dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt;. We add a &lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/images/node-builder/18.Dockerfile#L12-L30" rel="noopener noreferrer"&gt;range of packages&lt;/a&gt; to the standard image, as they are not included out of the box.&lt;/p&gt;

&lt;p&gt;Because the Lagoon team maintains the images here, we are responsible for ensuring that any components added at this stage are secure, and have any available updates. The two packages I'm going to focus on here are &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;git&lt;/code&gt;, as they have some of the best documented vulnerability announcement and management strategies.&lt;/p&gt;

&lt;p&gt;Alpine-based packages (apks) are managed in the Alpine package registry, and updates are usually tied to the Alpine Linux release cycle:&lt;br&gt;
e.g. &lt;a href="https://pkgs.alpinelinux.org/package/v3.17/main/x86_64/git" rel="noopener noreferrer"&gt;Git on Alpine 3.17&lt;/a&gt; is currently at version 2.38.3-r1 - which is the correct version to address the above CVEs!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqrtlfzc5jbyd9sdcq3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqrtlfzc5jbyd9sdcq3u.png" alt="screenshot of Git package details" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Git repository linked from the actual package there is also an &lt;a href="https://git.alpinelinux.org/aports/tree/main/git/APKBUILD?h=3.17-stable" rel="noopener noreferrer"&gt;APKBUILD&lt;/a&gt; file that outlines a bit more information - and from this, we can see that those CVEs were actually addressed in the previous 2.38.3-r0 release.&lt;/p&gt;

&lt;p&gt;There may even be occasions where the Alpine Linux version of a package includes the CVE fix before the source package - you can see this clearly on &lt;a href="https://pkgs.alpinelinux.org/package/v3.16/main/x86_64/curl" rel="noopener noreferrer"&gt;curl on Alpine 3.16&lt;/a&gt; - the 7.83.1 version of curl has been patched over 10 times now - &lt;a href="https://curl.se/docs/vuln-7.83.1.html" rel="noopener noreferrer"&gt;https://curl.se/docs/vuln-7.83.1.html&lt;/a&gt; - the updated 7.87 version is only available via Alpine 3.17&lt;/p&gt;

&lt;p&gt;Reading these dockerfiles, Git repositories and package logs is a bit of a "dark art", but rest assured that the Lagoon team secretly loves it, and it's all part of our role in ensuring the safety and security of the applications running on our platforms!&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>Keeping pace with Kubernetes</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 13 Dec 2022 21:48:03 +0000</pubDate>
      <link>https://dev.to/uselagoon/keeping-pace-with-kubernetes-54i4</link>
      <guid>https://dev.to/uselagoon/keeping-pace-with-kubernetes-54i4</guid>
      <description>&lt;p&gt;As people are generally aware, most evolution in tech follows a rapid pace, and none more so than the Kubernetes project (and the surrounding ecosystem).&lt;/p&gt;

&lt;p&gt;In mid-2021, the Kubernetes Release Team &lt;a href="https://kubernetes.io/blog/2021/07/20/new-kubernetes-release-cadence/"&gt;announced&lt;/a&gt; that they will be releasing a new version of Kubernetes every 4 months, and will be supporting each release of Kubernetes for 12-14 months from release. This effectively means that Kubernetes has an N-2 support cycle (current release, and the two immediately prior to it.&lt;/p&gt;

&lt;p&gt;Each release of Kubernetes comes with an associated raft of API deprecations, releases, and additions (see &lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/"&gt;https://kubernetes.io/docs/reference/using-api/deprecation-guide/&lt;/a&gt;). These can range from relatively minor API version changes (e.g. a beta API becomes GA - usually available in parallel for 3 releases/12 months) to pretty substantial code or process changes (which require re-writes/re-architecting and have been available for 6+ releases).&lt;/p&gt;

&lt;p&gt;One such milestone release was Kubernetes 1.22 - which took significant work for the Lagoon team to achieve compliance with (see the blog at &lt;a href="https://dev.to/uselagoon/lagoon-kubernetes-122-ek8"&gt;https://dev.to/uselagoon/lagoon-kubernetes-122-ek8&lt;/a&gt;). In this release, announcing compatibility with 1.22, we also added a “minimum supported version” of 1.19, in order to be able to utilize the parallel API releases. &lt;/p&gt;

&lt;p&gt;With the release of 1.24, 1.25 (and shortly 1.26), there come similar (if not as impacting) challenges with Lagoon components.  For this reason, we will be implementing similar “minimum supported version” constraints on the Lagoon releases supporting these Kubernetes releases.&lt;/p&gt;

&lt;p&gt;When timing our Lagoon releases, however, we have some ability to define our own schedule (within certain bounds!).&lt;/p&gt;

&lt;p&gt;Looking at the timing for Kubernetes 1.24 alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was released on May 3rd, 2022&lt;/li&gt;
&lt;li&gt;It became “Generally Available” in Azure AKS in July 2022 &lt;/li&gt;
&lt;li&gt;It became available in the “Regular Channel” in Google GKE in November 2022&lt;/li&gt;
&lt;li&gt;It became available on AWS EKS in November 2022 &lt;/li&gt;
&lt;li&gt;Official EOL is July 28th, 2023&lt;/li&gt;
&lt;li&gt;Azure AKS will end support in July 2023 &lt;/li&gt;
&lt;li&gt;Google GKE will end support in September 2023&lt;/li&gt;
&lt;li&gt;Amazon EKS will end support in January 2024&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While Kubernetes has no officially published API deprecations for 1.24, there is actually one thing that does catch us out, in that service accounts no longer get secrets automatically defined for them (which we use to control builds, tasks etc) - so we will have to rewrite some of our controller code to handle the generation of time-scoped tokens instead.&lt;/p&gt;

&lt;p&gt;Given the only recent availability of 1.24 across the clusters we support and manage - this hasn’t been a pressing issue for us. But together with the EOL of 1.20 support in all the major providers, it also presents an opportunity for us to be more agile in adopting the parallel API availability and reducing the upgrade burden for new releases.&lt;/p&gt;

&lt;p&gt;The most recent version of Lagoon (v2.11.0 and the additional lagoon-remote and lagoon-logging components) already supports Kubernetes 1.24.&lt;/p&gt;

&lt;p&gt;The Lagoon team is proposing to release a version of Lagoon in early January that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Fully supports Kubernetes 1.24 (as it is now GA on all platforms)&lt;/li&gt;
&lt;li&gt;Supports a minimum Kubernetes 1.21 (even though it’s almost EOL)&lt;/li&gt;
&lt;li&gt;Introduces the API upgrades available in 1.21 (CronJob and PodDisruptionBudget)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Generally, going forwards:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;We will make Lagoon available for use on the Kubernetes versions available on the leading managed Kubernetes platforms that (we know) are running Lagoon in production (EKS, GKE, AKS).&lt;/li&gt;
&lt;li&gt;Lagoon components will have a minimum Kubernetes version to allow us to use the more modern features. We'll try to keep it close to N-3 to allow the lag from providers.&lt;/li&gt;
&lt;li&gt;Users of Lagoon should pay close attention to the Lagoon release notes, and ensure that not only Lagoon but also the underlying Kubernetes installations are regularly updated.&lt;/li&gt;
&lt;li&gt;We’ll be publishing more comprehensive helmchart-specific changelogs via our repository on artifacthub - &lt;a href="https://artifacthub.io/packages/search?org=uselagoon&amp;amp;sort=relevance&amp;amp;page=1"&gt;https://artifacthub.io/packages/search?org=uselagoon&amp;amp;sort=relevance&amp;amp;page=1&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Please reach out to the team if you want us to cover any of this in more detail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support/Release periods backgrounds:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/releases/patch-releases/#support-period"&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-release-calendar"&gt;Amazon EKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#aks-kubernetes-release-calendar"&gt;Azure AKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/release-schedule"&gt;Google GKE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/en-us/iaas/Content/ContEng/Concepts/contengaboutk8sversions.htm"&gt;Oracle OCI&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.ibm.com/docs/containers?topic=containers-cs_versions"&gt;IBM CKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/ack-releases-of-kubernetes"&gt;Alibaba ACK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Openshift 4 has varied release calendars depending on which variant you are running, and on which provider - note that Openshift support in Lagoon isn’t always guaranteed, owing to some inconsistencies with the Kubernetes implementation, and the difficulties in testing.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>releases</category>
      <category>updates</category>
      <category>k8s</category>
    </item>
    <item>
      <title>build-deploy the future, a behind the scenes look at Lagoon</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 20 Sep 2022 13:35:51 +0000</pubDate>
      <link>https://dev.to/uselagoon/build-deploy-the-future-a-behind-the-scenes-look-at-lagoon-160i</link>
      <guid>https://dev.to/uselagoon/build-deploy-the-future-a-behind-the-scenes-look-at-lagoon-160i</guid>
      <description>&lt;p&gt;When we &lt;a href="https://dev.to/uselagoon/lagoon-2-release-candidate-available-1f3l"&gt;announced&lt;/a&gt; Lagoon 2.0, we discussed how we'd reformed the architecture to better suit a distributed global platform. This unveiled the "separation" of lagoon-core and lagoon-remote, and the gradual migration of services needed for running sites on Lagoon towards the lagoon-remote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Over the last few months, we've really pushed ahead with this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Lagoon &amp;lt;&amp;gt; Harbor integration has been moved from a single core-affiliated Harbor towards a lagoon-remote being able to define and manage it's own, or a shared, Harbor install.&lt;/li&gt;
&lt;li&gt;The lagoon-core auto-idler service has been deprecated in favour of running independent idlers in lagoon-remotes (using &lt;a href="https://github.com/amazeeio/aergia-controller"&gt;Aergia&lt;/a&gt;, which has the added ability to unidle)&lt;/li&gt;
&lt;li&gt;A number of other features, such as backups, restores and logging configurations can now be set at the lagoon-remote level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The primary way, though, that lagoon-core provides lagoon-remote with the instructions is via a "Lagoon Build" sent as a message to the build-deploy controller in the lagoon-remote. This build contains most of the information needed for the controller to progress a build (the rest of the information about that specific cluster is stored against the build-deploy controller).&lt;/p&gt;

&lt;p&gt;The build itself is handled by a service image called "kubectl-build-deploy-dind" - catchy, huh? This service is essentially a collection of Bash scripts, across thousands of lines of code, that knows all the ins and outs of Lagoon - how to use the various variables, settings etc that Lagoon can control when deploying a site.&lt;/p&gt;

&lt;p&gt;With the increased capabilities of Lagoon over the last couple of years, these files are becoming increasingly more complex to maintain, and the logic is getting harder to follow. As a team, we've also evaluated the cloud-native landscape a little more closely, and looked at what other projects, tools or specifications there may be that we could utilize. Lagoon has always prided itself in its developer focus, and the predictable relationship between production and local has been key in ensuring minimal friction in deploying workloads. The other critical thought is that the majority of the fast-release work we do is on this service, and curating a full Lagoon release is a lot of effort for a simple script change.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what's happening?
&lt;/h2&gt;

&lt;p&gt;With these considerations in mind, we've decided to take the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The current "kubectl-build-deploy-dind" Bash scripts will be progressively rewritten, rearchitected and replaced by a series of Go modules, built into a new build-deploy-tool.&lt;/li&gt;
&lt;li&gt;Development of the build-deploy-tool (and the generation of the Docker image to drive the service) will be split from the main Lagoon repository, into its &lt;a href="https://github.com/uselagoon/build-deploy-tool"&gt;own repository&lt;/a&gt;, in order that it may have its own development lifecycle, allowing for targeted testing, faster releases and easier rollbacks.&lt;/li&gt;
&lt;li&gt;The parts of the tool that need to interact with the user repositories will utilize standards-compliant methods where possible. This means that the docker-compose.yml file will be read in by the compose-spec reference library &lt;a href="https://github.com/compose-spec/compose-go"&gt;compose-go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We will create a schema for the .lagoon.yml to allow easier parsing and error-detection.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What does this mean for users, administrators etc?
&lt;/h2&gt;

&lt;p&gt;Good question! Hopefully nothing. However, as we have started on this journey, migrating the first few components (see the full list &lt;a href="https://github.com/uselagoon/build-deploy-tool/issues/27"&gt;here&lt;/a&gt; across to go &amp;amp; compose-go, we've observed some things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not all "working" docker-compose.yml and .lagoon.yml files are actually valid. It's possible to make breaking errors in your file, and still have it deploy locally. Reading it in via a standards-compliant parser, however...&lt;/li&gt;
&lt;li&gt;Not all users actually test their code locally before deploying to Lagoon - otherwise they would have known that their file was badly broken...&lt;/li&gt;
&lt;li&gt;Even if those errors are in a section unrelated to the section being processed, the inability to parse the file will cause the build-deploy-tool to error out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, to counter this, we've (in Lagoon &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.8.4"&gt;release v2.8.4&lt;/a&gt;) added a new feature into the existing builds that will create a user-facing warning when the build-deploy-tool encounters an error that would ordinarily cause the process to fail, and we've generated a message in the build log.&lt;/p&gt;

&lt;p&gt;We're also working very closely with the wider team at amazee.io (as the largest installed base of Lagoons) to trawl through thousands of build logs to try and capture any of these errors to be sure that we're causing no adverse harm to running builds, and where we encounter a fatal error that we could handle, we create a test case and a workaround for it. Some are easy (such as handling the presence of local-only env files that are not pushed to Git), some are harder (like handling anchor and alias edge cases in the YAML).&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;We will also be implementing (as of Lagoon v2.10.0) the switch across to uselagoon/build-deploy-image as the main source of the builder. However - fear not, we will still be re-publishing it as the kubectl-build-deploy-dind image to match the Lagoon release. We'll build a fair amount of flexibility into Lagoon to support this - as well as allowing Lagoon admins to specify build images per remote in the API, and provide access to more cutting-edge builds outside of the Lagoon release cycle.&lt;/p&gt;

&lt;p&gt;In the meantime, keep an eye out here and we'll keep you updated on what we're up to!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>build</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Lagoon + Kubernetes 1.22 🥳</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Fri, 17 Jun 2022 06:34:11 +0000</pubDate>
      <link>https://dev.to/uselagoon/lagoon-kubernetes-122-ek8</link>
      <guid>https://dev.to/uselagoon/lagoon-kubernetes-122-ek8</guid>
      <description>&lt;p&gt;For longtime followers of Lagoon, you'll know we've been working towards Kubernetes 1.22 support ever since it was released &lt;a href="https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/"&gt;9 months ago&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whilst Kubernetes sets a fairly aggressive development and release pace (three releases per year), the major cloud providers make these releases available on a different schedule, which often lags behind the upstream release by a few months.&lt;/p&gt;

&lt;p&gt;See a few here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/release-notes"&gt;Google Kubernetes Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#aks-kubernetes-release-calendar"&gt;Azure Kubernetes Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html"&gt;Elastic Kubernetes Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is most important is noting when your provider will auto-upgrade your cluster to a new version of Kubernetes though. Most Kubernetes releases are relatively smooth to upgrade between, but occasionally there are &lt;em&gt;more significant&lt;/em&gt; Kubernetes releases that are always tricky to navigate as they usually come with a raft of deprecations. These are usually communicated well in advance, but can still cause issues, especially in a code base with as many moving parts as Lagoon.&lt;/p&gt;

&lt;p&gt;Thankfully, the Kubernetes API is extremely well documented, and the team publishes a &lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/"&gt;Deprecated API Migration Guide&lt;/a&gt; for us to follow. When an API is deprecated, it is usually because the version of that API has incremented, either to a beta, or stable release. Occasionally, though, an API that we were using may be removed from Kubernetes.&lt;/p&gt;

&lt;p&gt;For every API that we use, we have to assess whether the deprecation impacts us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is it a simple name change? (i.e. &lt;code&gt;coordination.k8s.io/v1beta1&lt;/code&gt; renames to &lt;code&gt;coordination.k8s.io/v1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;is it a name change with some spec changes? (i.e. in &lt;code&gt;authorization.k8s.io/v1&lt;/code&gt; API version, spec.group was renamed to spec.groups&lt;/li&gt;
&lt;li&gt;has that API (or part of it) been removed from Kubernetes? (i.e. PodSecurityPolicy in Kubernetes 1.25)&lt;/li&gt;
&lt;li&gt;is it a larger change that requires a rewrite (i.e. most of the deprecated APIs that Lagoon uses 🤦)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've gone through all the various components of Lagoon with a fine-toothed comb (and the aid of the built-in deprecation warnings) to make sure that all references to these deprecated APIs have been updated for the replacements. This includes all the Helm charts used to deploy Lagoon, Lagoon projects running on Lagoon, and the third-party services that Lagoon utilizes. It also includes some code rewrites in the controllers and operators that Lagoon deploys.&lt;/p&gt;

&lt;p&gt;As of lagoon-core &lt;a href="https://github.com/uselagoon/lagoon-charts/releases/tag/lagoon-core-1.0.0"&gt;release 1.0.0&lt;/a&gt;, this work has been completed! All the latest releases of the Lagoon Helm charts are fully Kubernetes 1.22 (and also 1.23!) compatible. We have taken some additional steps to ensure future compatibility, such as matrix testing versions 1.21,1.22,1.23 and 1.24 for releases, and running a range of test clusters prior to releases, and marking the Lagoon components as not supporting Kubernetes &amp;lt;1.19 - as that is when a number of the replacement APIs that we have migrated to were first introduced.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To anybody running a pre-1.0.0 version of Lagoon on their &amp;lt;1.21 cluster, we would encourage you to upgrade to 1.22 ahead of time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kubernetes has introduced a number of webhooks that will automatically update any resources to be compatible with Kubernetes 1.22, and the cluster will upgrade safely to 1.22. However, subsequent Helm chart upgrades may fail, as they are operating on the pre-updated state of those resources, which are no longer valid Kubernetes objects (confusing, huh?).&lt;/p&gt;

&lt;p&gt;There is a fix to this, thankfully, if you've already upgraded, or been upgraded and see this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Error: UPGRADE FAILED: current release manifest contains removed kubernetes api(s) for this kubernetes version and it is therefore unable to build the kubernetes objects for performing the diff. error from kubernetes: unable to recognize "": no matches for kind "PriorityClass" in version "scheduling.k8s.io/v1beta1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Helm plugin &lt;a href="https://github.com/helm/helm-mapkubeapis"&gt;https://github.com/helm/helm-mapkubeapis&lt;/a&gt; was designed to resolve exactly this issue, and comes preloaded with the necessary resource mappings to update for any version of Kubernetes! We can testify that it works perfectly :cough:&lt;/p&gt;

&lt;p&gt;As always, feel free to reach out to the Lagoon team if you've got any questions - you can even find us in our shiny new &lt;a href="https://discord.gg/te5hHe95JE"&gt;Discord Server&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>November release update</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 30 Nov 2021 22:50:44 +0000</pubDate>
      <link>https://dev.to/uselagoon/november-release-update-300o</link>
      <guid>https://dev.to/uselagoon/november-release-update-300o</guid>
      <description>&lt;h2&gt;
  
  
  &lt;a href="https://github.com/uselagoon/lagoon/releases"&gt;Lagoon-core&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In the last month, we released a series of updates to Lagoon &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.2.0"&gt;2.2.0&lt;/a&gt; (&lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.2.1"&gt;2.2.1&lt;/a&gt;, &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.2.2"&gt;2.2.2&lt;/a&gt;, &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.2.3"&gt;2.2.3&lt;/a&gt; and &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.2.4"&gt;2.2.4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These were all to address unforeseen issues with the new features introduced in 2.2.0 - namely Kubernetes Network Policy support, Rootless workloads and Ingress annotation linting.&lt;/p&gt;

&lt;p&gt;See the full 2.2 &lt;a href="https://github.com/uselagoon/lagoon/compare/v2.1.0...v2.2.4"&gt;changelog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/uselagoon/lagoon-cli/releases"&gt;Lagoon-cli&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;November saw the first release of lagoon-cli under the uselagoon namespace &lt;a href="https://github.com/uselagoon/lagoon-cli/releases/tag/v0.12.0"&gt;0.12.0&lt;/a&gt; - complete with updated homebrew taps, docker images and M1-compatible binaries&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://github.com/uselagoon/lagoon-cli/compare/v0.11.6...v0.12.0"&gt;changelog&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/uselagoon/lagoon-images/releases"&gt;Lagoon-images&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;November saw the first time we've used a patch release for the Lagoon images.  The &lt;a href="https://github.com/uselagoon/lagoon-images/releases/tag/21.11.0"&gt;21.11.0&lt;/a&gt; release saw updates to a number of packages that had been held back in October.&lt;/p&gt;

&lt;p&gt;We used the &lt;a href="https://github.com/uselagoon/lagoon-images/releases/tag/21.11.1"&gt;21.11.1&lt;/a&gt; release to update the Alpine versions in use for all the images to address a couple of vulnerabilities&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://github.com/uselagoon/lagoon-images/compare/21.10.0...21.11.1"&gt;changelog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/uselagoon/lagoon-sync/releases"&gt;Lagoon-sync&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As Lagoon-sync is still in active development, there was a couple of small hotfix-releases in November.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/uselagoon/lagoon-examples"&gt;Lagoon-examples&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;There were the usual updates across the Lagoon examples, reflecting the Drupal core update cycles.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's up next month?
&lt;/h2&gt;

&lt;p&gt;In December, we will be debuting a couple of new things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a reorganisation of our Lagoon example repositories (one repo per example, instead of the multi-branch Drupal example)&lt;/li&gt;
&lt;li&gt;The ability to publish and consume "experimental" images from Lagoon-images ahead of their general release&lt;/li&gt;
&lt;li&gt;A new documentation site, built using Github Pages&lt;/li&gt;
&lt;li&gt;A new Lagoon website - be still my beating heart! &lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Lagoon 2.0.0 released</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Wed, 06 Oct 2021 23:04:40 +0000</pubDate>
      <link>https://dev.to/uselagoon/lagoon-2-0-0-released-hil</link>
      <guid>https://dev.to/uselagoon/lagoon-2-0-0-released-hil</guid>
      <description>&lt;p&gt;After what seems like an eternity, Lagoon has finally had its 2.0.0 &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.0.0"&gt;stable release&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When we first put the &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.0.0-alpha.1"&gt;2.0.0-alpha.1&lt;/a&gt; tag into the world, we'd already made over 350 updates to the Lagoon 1.x codebase, and since that release, we've made almost 800 more updates across 150 pull requests to get to this point.&lt;/p&gt;

&lt;p&gt;This 2.0.0 release is a significant moment for us - even though we foreshadowed it slightly in our &lt;a href="https://dev.to/uselagoon/lagoon-2-release-candidate-available-1f3l"&gt;late June post&lt;/a&gt;.  Most importantly, the legacy &lt;a href="https://github.com/uselagoon/lagoon-one"&gt;Lagoon codebase&lt;/a&gt; (that runs only on OpenShift) is no longer supported, and that repository has now been archived.&lt;/p&gt;

&lt;p&gt;From now on we'll follow a usual major/minor/patch scheme for Lagoon, So up next is Lagoon 2.1 - which we're already working on, as well as a vision for what Lagoon 3 could look like!&lt;/p&gt;

&lt;p&gt;We took the opportunity in this release to trial a new security advisory process, using the built-in GitHub tooling (it's pretty neat!).&lt;/p&gt;

&lt;p&gt;Of note is that the &lt;a href="https://github.com/uselagoon/lagoon-charts"&gt;lagoon-charts&lt;/a&gt; are still in the 0.x major version range - this is because there is a significant breaking change on the horizon to make them compatible with Kubernetes.  The release for that will be the first 1.x release of the charts.&lt;/p&gt;

&lt;p&gt;We've also done a heap of work in the other Lagoon components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;a href="https://github.com/uselagoon/lagoon-examples"&gt;examples&lt;/a&gt; are starting to develop nicely - and with more &lt;a href="https://dev.to/uselagoon/improving-image-specific-testing-with-actual-examples-2p8p"&gt;tests&lt;/a&gt; than ever!&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://github.com/uselagoon/lagoon-images"&gt;images&lt;/a&gt; now have a settled monthly release cadence, with automated &lt;a href="https://dev.to/tobybellwood/series/10605"&gt;updates and tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;the other tools &lt;a href="https://github.com/uselagoon/lagoon-cli"&gt;lagoon-cli&lt;/a&gt; and &lt;a href="https://github.com/amazeeio/lagoon-sync"&gt;lagoon-sync&lt;/a&gt; are also being updated and developed, expect to hear more from us soon on them too!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to all the team that have brought this together, and to all our users for their patience, support and willingness to help us test and build together!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Improving image-specific testing with actual examples</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Thu, 23 Sep 2021 23:41:22 +0000</pubDate>
      <link>https://dev.to/uselagoon/improving-image-specific-testing-with-actual-examples-2p8p</link>
      <guid>https://dev.to/uselagoon/improving-image-specific-testing-with-actual-examples-2p8p</guid>
      <description>&lt;p&gt;In Lagoon 1.x, Lagoon ran a full battery of tests for every pull request submitted to the GitHub repository. Not only was this inefficient, but unrelated errors also added false negatives to the testing process. In addition, running these tests required a full local instance of Lagoon to be created, which presented a significant technical and resource hurdle for contributions. With the addition of Kubernetes, this hurdle was reduced, but still significant.&lt;/p&gt;

&lt;p&gt;At the same time as completing the work on Lagoon 2, we have been working hard on a set of example projects for Lagoon – covering a wider range of frameworks, content management systems, and situations than previously. We have gathered these examples over at &lt;a href="https://github.com/uselagoon/lagoon-examples"&gt;https://github.com/uselagoon/lagoon-examples&lt;/a&gt; as Git submodules to the source repositories and branches.&lt;/p&gt;

&lt;p&gt;We will be taking advantage of these example projects to test our images. We have built a CI process that will build our images, clone, build, and test the relevant example projects using the images being modified. With the introduction of automated dependency resolution triggering CI builds, we have automated a large portion of the image production process. &lt;/p&gt;

&lt;p&gt;The tests we will be using for the process have been written in Markdown, and are parsed into Mocha tests by the excellent &lt;a href="https://github.com/lando/leia"&gt;Leia&lt;/a&gt; parser from the Lando team.  These tests are human-readable and easy to contribute to.  You can see an example at &lt;a href="https://github.com/amazeeio/drupal-example-simple/blob/9.x-advanced/TESTING_dockercompose.md"&gt;https://github.com/amazeeio/drupal-example-simple/blob/9.x-advanced/TESTING_dockercompose.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Likewise, we will be running the same set of tests inside these example projects to ensure the projects work with the latest and edge releases of the images prior to any changes being merged.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>github</category>
      <category>ci</category>
      <category>mocha</category>
    </item>
    <item>
      <title>Releasing more versions of more images more often</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Tue, 03 Aug 2021 00:12:48 +0000</pubDate>
      <link>https://dev.to/uselagoon/releasing-more-versions-of-more-images-more-often-12h</link>
      <guid>https://dev.to/uselagoon/releasing-more-versions-of-more-images-more-often-12h</guid>
      <description>&lt;p&gt;Whilst we have traditionally offered multiple versions of some of our images (PHP, Node.js, Solr, and Python), we have started to encounter situations where broadening the range of versions (and the images available with versioning) would be beneficial to our users.&lt;/p&gt;

&lt;p&gt;The most notable examples here are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL (we’ve expanded our images available to include v12 alongside v11)&lt;/li&gt;
&lt;li&gt;Python (adding new Python 3.x releases)&lt;/li&gt;
&lt;li&gt;Redis (adding v6 alongside v5)&lt;/li&gt;
&lt;li&gt;Varnish (adding v6 alongside v5)&lt;/li&gt;
&lt;li&gt;MariaDB (adding 10.5 alongside 10.4)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As with our other images, we will follow the upstream EOL policies closely.&lt;/p&gt;

&lt;p&gt;When we select whether to name images after a major version  (i.e. Node.js 14) versus a minor version (i.e. PHP 7.4), we will look at the release frequency, semantic version policies, and the possibility for breaking changes.&lt;/p&gt;

&lt;p&gt;We will also be able to generate pre-release images more easily – whilst they’re still in alpha/beta/RC status.  Obviously, these images shouldn’t be used in production, but making them available for testing should be of benefit to us, our users, and the wider community.&lt;/p&gt;

&lt;p&gt;This will allow our users to take advantage of the functionality available in the newer releases of these images. In order to configure this, the dockerfiles in your projects may need modification to point to the correct image for your purpose.&lt;/p&gt;

&lt;p&gt;We have already written functionality into the release process to ensure that these new images are also published back to the existing images, under the same versions (i.e &lt;code&gt;uselagoon/postgres-11:21.5.0&lt;/code&gt; is the same image as &lt;code&gt;uselagoon/postgres:21.5.0&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A complete list of these mappings is in the (makefile)[&lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/Makefile#L188"&gt;https://github.com/uselagoon/lagoon-images/blob/main/Makefile#L188&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>docker</category>
      <category>images</category>
      <category>versioning</category>
      <category>releases</category>
    </item>
    <item>
      <title>Automating Lagoon Image updates from Upstream Source images</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Wed, 14 Jul 2021 23:58:04 +0000</pubDate>
      <link>https://dev.to/uselagoon/automating-updates-from-upstream-source-images-20ee</link>
      <guid>https://dev.to/uselagoon/automating-updates-from-upstream-source-images-20ee</guid>
      <description>&lt;p&gt;As Lagoon images ordinarily extend “Docker Official” images with tooling and configuration necessary for Lagoon, we have a dependency on these upstream images. To date, we haven’t been able to exert much control over which versions of these images we use to build our versions. As we were refactoring the release process anyway, it made sense to look more closely at which exact versions of upstream images we consume, and how we could avoid additional burden in tracking them.&lt;/p&gt;

&lt;p&gt;We identified that to specify exact versions in our Dockerfiles, and then to have an automated dependency resolution system watch these, and submit pull requests to us for any updates would be the most automated solution to this. We selected &lt;a href="https://www.whitesourcesoftware.com/free-developer-tools/renovate/"&gt;Whitesource Renovate&lt;/a&gt; for this purpose – the level of control over how these updates are selected was by far the most customizable for our needs. We didn’t want a situation where a Node.js 14 update was submitted for a Node.js 12 image, or where the PHP base version for two different images wasn’t simultaneously updated. We also wanted to be able to control whether a particular image got updates based on patch or minor releases.&lt;/p&gt;

&lt;p&gt;We are always actively working on the &lt;a href="https://github.com/uselagoon/lagoon-images/blob/main/renovate.json"&gt;configuration&lt;/a&gt; for Renovate and will continue to fine-tune it. Having pull requests created for every upstream version change will also optimise the generation of automated changelogs (using the excellent &lt;a href="https://github.com/marketplace/actions/release-drafter"&gt;Release Drafter&lt;/a&gt; GitHub Action we were already using on Lagoon).&lt;/p&gt;

&lt;p&gt;In early 2020, we made the first steps in aligning all our base images on Alpine 3.11, and because of this work, it has been much easier to upgrade to Alpine 3.12 and 3.13 along the way.  Now that Alpine 3.14 has been &lt;a href="https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0"&gt;released&lt;/a&gt; we will continue to monitor our upstreams, and once the balance of our images is available, we will commence the testing process.&lt;/p&gt;

&lt;p&gt;We've also integrated vulnerability scanning into the CI process - using Aqua Security's &lt;a href="https://github.com/aquasecurity/trivy"&gt;Trivy&lt;/a&gt; scanner to scan each image as it's created and saving the results in the CI run.  We'll cover securities and vulnerabilities in a later post!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dockerimages</category>
      <category>images</category>
      <category>updates</category>
    </item>
    <item>
      <title>Lagoon 2 release candidate available</title>
      <dc:creator>Toby Bellwood</dc:creator>
      <pubDate>Mon, 28 Jun 2021 23:31:18 +0000</pubDate>
      <link>https://dev.to/uselagoon/lagoon-2-release-candidate-available-1f3l</link>
      <guid>https://dev.to/uselagoon/lagoon-2-release-candidate-available-1f3l</guid>
      <description>&lt;p&gt;Last week, the Lagoon team released their first &lt;a href="https://github.com/uselagoon/lagoon/releases/tag/v2.0.0-rc.1"&gt;release candidate for Lagoon 2&lt;/a&gt;.  In this post we'll cover a few of the headline features that make it slightly different to Lagoon 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updated architecture
&lt;/h2&gt;

&lt;p&gt;In Lagoon 1.x, Lagoon could support a local and (under certain conditions) remote Openshift 3 clusters. In Lagoon 1.4, we added additional support for remote Kubernetes clusters.&lt;/p&gt;

&lt;p&gt;Having reviewed this architecture, it became clear to the team that supporting remote workloads should be the norm, giving a logical separation to the services needed to power Lagoon and the client workloads running on it. In addition, Lagoon required a high level of administrative access to the remote clusters, which could have presented an issue with higher-security installations. Ben has developed a great controller-based solution that effectively delegates the job of deploying projects and environments, running tasks, and monitoring builds to these target remote clusters, and only connecting to the main Lagoon to update status, or collect new builds or tasks.&lt;/p&gt;

&lt;p&gt;Going forward, we will be referring to the main Lagoon install (where the API, authentication, notification and other operational services live) as “Lagoon Core”. The Lagoon component that is used to run client projects (where the environments, database services, etc, run) is now referred to as “Lagoon Remote.” This allows Remote to just be an application installed into a cluster managed by a different team.  Of course, for smaller installs, Lagoon Core and Remote can be colocated.&lt;/p&gt;

&lt;p&gt;To fully support the Kubernetes ecosystem, both Lagoon Core and Lagoon Remote (as well as the other allied Lagoon tools) can all be deployed using Helm charts.&lt;/p&gt;

&lt;p&gt;Find more about the architecture in our &lt;a href="https://github.com/uselagoon/lagoon#lagoon-architecture"&gt;Git Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Node 16, Alpine 3.13 and the updated MariaDB connector
&lt;/h2&gt;

&lt;p&gt;Lagoon was built on Node.js 10, and has been pinned there for the last few years, because of a complicated web of npm dependencies. In preparation for Lagoon 2, Brandon untangled this web as part of upgrading our MariaDB/MySQL connector to the latest version of the official npm package (&lt;a href="https://www.npmjs.com/package/mariadb"&gt;https://www.npmjs.com/package/mariadb&lt;/a&gt;). This gives us some of the newly-available performance benefits, as well as unblocking the Node.js 16 upgrade for the rest of the application. We’ve also updated all the system images to the latest version available of Alpine 3.13. The one exception is the MariaDB-based api-db and keycloak-db images are still on MariaDB 10.4 (while we work out the upgrade path to 10.5).&lt;/p&gt;

&lt;h2&gt;
  
  
  New logs2webhook service
&lt;/h2&gt;

&lt;p&gt;More and more of our users are tying their Lagoon deployments into other systems. They are used to retrieve backups or database dumps, check post-deploy UI consistency, and perform other tasks. In order to integrate these systems more closely together, Blaize has added a logs2webhooks service that will allow users to create another notification endpoint (to join the existing Slack, email, Microsoft Teams and RocketChat versions). We’ve got a broader overhaul of the notification system in our sights, but this will help our users now, so we’ve added it.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Audit logging
&lt;/h2&gt;

&lt;p&gt;One of the most important aspects of running systems that are placed into highly secure environments is the presence of audit logging for privileged users. While Lagoon already had very verbose logs, pinpointing some API-driven requests could be fairly taxing. Tim has added a logging service into the API that collects the requests, and generates a searchable log entry for it. This will return the user, source, command and other necessary information. It makes it much easier to find out who actioned what, and where it came from. Again, it’ll be refined over time, but we thought it important enough to release now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lagoon 2 supports per-cluster Harbor 2 installations
&lt;/h2&gt;

&lt;p&gt;Lagoon’s traditional architecture has closely coupled the installation of Harbor (the image registry) with the Lagoon component. Now that we have moved to a Lagoon Core and Lagoon Remote architecture, it makes sense to locate the registry as physically close to the destination projects as possible, to minimize transfer times, cost, and latency, as well as tightening the security perimeter. Administrators have the option of defining which image registry is in use for a particular cluster. This allows for multi-cluster installations to share a common image registry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Gitea support to Lagoon
&lt;/h2&gt;

&lt;p&gt;Lagoon has long supported all versions of GitHub, GitLab and Bitbucket as source code management options. As part of the local development workflow we undertook for Lagoon 2, we were looking for a full-featured local Git server to enable more rapid testing and prototyping. Gitea is a lightweight self-hosted Git service, available as a Helm chart and deployable anywhere. We have added the necessary webhook handlers into Lagoon to support it (they differ ever so slightly from GitHub). For anyone looking for a completely in-cluster (either in-cloud or local) workflow, Gitea now works with Lagoon!&lt;/p&gt;

&lt;h2&gt;
  
  
  Develop locally on Kubernetes with an expanded suite of tests
&lt;/h2&gt;

&lt;p&gt;Lagoon had a lot of tests – covering core operations (variables, promotions, active/standby), integrations (Gitlab, GitHub and BitBucket, DBaaS) and project types (Drupal, Python, Node.js etc). These test processes always ran sequentially, and could not be easily selected. Scott has done a fantastic job in rebuilding Lagoon to run locally via Helm charts, but also in configuring Helm’s chart-testing facility to control test runs. Toby has done a lot of work to refactor these tests to be more self-sufficient – meaning that they can provision and remove their own test projects, and also to overhaul the entire suite – adding new tests (mongoDB, Elasticsearch), upgrading old ones, and adding new versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  And there will be more coming!
&lt;/h2&gt;

&lt;p&gt;As we write this, the next collection of new features to Lagoon 2 are nearing completion.  Now that the team can solely focus on Lagoon 2 development, expect to see some great stuff!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
