<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>BlueBuild Blog</title><description>This is where the BlueBuild team publishes announcements and writeups. Enjoy!</description><link>https://blue-build.org/</link><language>en-us</language><item><title>default-flatpaks v2</title><link>https://blue-build.org/blog/default-flatpaks-v2/</link><guid isPermaLink="true">https://blue-build.org/blog/default-flatpaks-v2/</guid><description>The module for adding Flatpaks has been rewritten with breaking changes. Learn why and how.</description><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;/reference/modules/default-flatpaks/&quot;&gt;&lt;code&gt;default-flatpaks&lt;/code&gt;&lt;/a&gt; module is one of the earliest BlueBuild modules. As such, the module contained a few issues that made it imperfect and prevented it from being useful for some use cases. Additionally, the module was pretty complicated, and the bash shell code was quite hard to read and maintain. As such, the module has been rewritten using Nushell and a new configuration format.&lt;/p&gt;
&lt;h2&gt;Changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It is now possible to enable multiple Flatpak repositories.
&lt;ul&gt;
&lt;li&gt;Previously setting the system or user repository in the module overrode the last one set.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The ability to do local modifications to the Flatpak install list was removed.
&lt;ul&gt;
&lt;li&gt;This niche feature made the module more complex and mixed up the purpose of modules, which is to set up the image&apos;s default configuration and not to provide configuration to end-users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The ability to configure automatic removal of Flatpaks was removed.
&lt;ul&gt;
&lt;li&gt;This is considered an anti-feature, as setting up automatic removal of a Flatpak that an end-user relies on would cause unexpected nuisance to the user. There is no way to automatically differentiate between Flatpaks that were manually installed by the user and are part of their workflow, and Flatpaks that were installed by the maintainer of the image that are now unneeded.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A new CLI tool called &lt;code&gt;bluebuild-flatpak-manager&lt;/code&gt; has been added to let end-users easily turn off and on the automatic Flatpak setup and to manually execute Flatpak setup.&lt;/li&gt;
&lt;li&gt;The new configuration format is based on a list of &lt;code&gt;configurations:&lt;/code&gt; which are appended to &lt;code&gt;/usr/share/bluebuild/default-flatpaks/configuration.yaml&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;This means that all Flatpak configuration done in the base image of the image and in previous module calls are retained, and each module call can do their own configuration without being affected by others.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;Most users will probably only need one Flatpak setup configuration. The most common use case is to install Flatpaks from the Flathub repository. To do this, you can adapt from the following configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type: default-flatpaks
configurations:
  - install:
      - org.mozilla.firefox
      - com.github.tchx84.Flatseal
      - io.github.flattool.Warehouse
      - io.missioncenter.MissionCenter
      - com.github.rafostar.Clapper
      - org.gnome.Loupe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By default, these will be user Flatpaks, and the installer will notify the user on each boot. You can change this by setting the configuration options as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type: default-flatpaks
configurations:
  - notify: false
    scope: system
    install:
      - org.mozilla.firefox
      - com.github.tchx84.Flatseal
      - io.github.flattool.Warehouse
      - io.missioncenter.MissionCenter
      - com.github.rafostar.Clapper
      - org.gnome.Loupe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To specify custom repo details, use the &lt;code&gt;repo:&lt;/code&gt; key in the configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type: default-flatpaks
configurations:
  - notify: false
    scope: system
    repo:
      url: https://flathub.org/beta-repo/flathub-beta.flatpakrepo
      name: flathub-beta
      title: Flathub Beta
    install:
      - org.mozilla.firefox
      - com.github.tchx84.Flatseal
      - io.github.flattool.Warehouse
      - io.missioncenter.MissionCenter
      - com.github.rafostar.Clapper
      - org.gnome.Loupe
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How to Migrate&lt;/h2&gt;
&lt;p&gt;To migrate to the new configuration format, simply create the top-level &lt;code&gt;configurations:&lt;/code&gt; key and copy the configurations from under &lt;code&gt;user:&lt;/code&gt; and &lt;code&gt;system:&lt;/code&gt; to be under it under it. Remove the &lt;code&gt;user:&lt;/code&gt; and &lt;code&gt;system:&lt;/code&gt; keys, and set the &lt;code&gt;scope:&lt;/code&gt; key to &lt;code&gt;user&lt;/code&gt; or &lt;code&gt;system&lt;/code&gt; as appropriate. Then, if you have configured repositories, move the &lt;code&gt;repo-&lt;/code&gt; keys under the &lt;code&gt;repo:&lt;/code&gt; section and remove the &lt;code&gt;repo-&lt;/code&gt; prefix from them.&lt;/p&gt;
&lt;h2&gt;How to &lt;em&gt;not&lt;/em&gt; Migrate&lt;/h2&gt;
&lt;p&gt;Your current configuration is likely set to use the latest version of the module with &lt;code&gt;type: default-flatpaks&lt;/code&gt;. To switch to the now-deprecated older version of the module, set &lt;code&gt;type: default-flatpaks@v1&lt;/code&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Introducing: the dnf module</title><link>https://blue-build.org/blog/dnf-module/</link><guid isPermaLink="true">https://blue-build.org/blog/dnf-module/</guid><description>Finally, modern package management!</description><pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When BlueBuild was created, Fedora Atomic only used &lt;a href=&quot;https://coreos.github.io/rpm-ostree/&quot;&gt;&lt;code&gt;rpm-ostree&lt;/code&gt;&lt;/a&gt; to build images, install packages, and manage installed systems. &lt;code&gt;rpm-ostree&lt;/code&gt; is basically a mash-up of &lt;a href=&quot;https://ostreedev.github.io/ostree/&quot;&gt;&lt;code&gt;libostree&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/rpm-software-management/libdnf&quot;&gt;&lt;code&gt;libdnf&lt;/code&gt;&lt;/a&gt;, which was made to handle composing OSTree images and managing OSTree-based systems, while existing in the RPM ecosystem.&lt;/p&gt;
&lt;p&gt;However, focus slowly &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/OstreeNativeContainer&quot;&gt;shifted to enabling bootable native container images&lt;/a&gt; based on the &lt;a href=&quot;https://github.com/opencontainers/image-spec&quot;&gt;OCI standard&lt;/a&gt;, allowing the usage of standard tools such as &lt;code&gt;docker&lt;/code&gt; or &lt;code&gt;buildah&lt;/code&gt; to build images. This lessened the need for &lt;code&gt;rpm-ostree&lt;/code&gt; as a separate build tool for the images, since it was now just called from the OCI container build process, just like any other package manager. Additionally, the lackluster UX and potentially confusing architecture were starting to show, and for example, dependency resolution had issues not present in &lt;code&gt;dnf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This made the Fedora project &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/DNFAndBootcInImageModeFedora&quot;&gt;shift towards replacing&lt;/a&gt; &lt;code&gt;rpm-ostree&lt;/code&gt; with &lt;a href=&quot;https://github.com/rpm-software-management/dnf5&quot;&gt;&lt;code&gt;dnf5&lt;/code&gt;&lt;/a&gt;, which would be updated to handle package management on OSTree-based systems, and &lt;a href=&quot;https://github.com/bootc-dev/bootc&quot;&gt;&lt;code&gt;bootc&lt;/code&gt;&lt;/a&gt;, which would handle deploying the bootable container images alongside system administration tasks such as updating and switching base images. Since F41, &lt;code&gt;bootc&lt;/code&gt; and &lt;code&gt;dnf5&lt;/code&gt; have been included in all official images and are now &lt;a href=&quot;https://docs.fedoraproject.org/en-US/bootc/rpm-ostree/&quot;&gt;the main way to build and manage Atomic systems&lt;/a&gt;, replacing &lt;code&gt;rpm-ostree&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;The &lt;a href=&quot;/reference/modules/dnf&quot;&gt;&lt;code&gt;dnf&lt;/code&gt;&lt;/a&gt; module&lt;/h2&gt;
&lt;p&gt;For the past few months, the BlueBuild team has been working on a new module called &lt;code&gt;dnf&lt;/code&gt; that works as a repository and package management wrapper for &lt;code&gt;dnf5&lt;/code&gt; (and &lt;code&gt;dnf4&lt;/code&gt; if &lt;code&gt;dnf5&lt;/code&gt; isn&apos;t available). The configuration structure for the module has been designed from the ground up to be intuitive and featureful. New features compared to the &lt;code&gt;rpm-ostree&lt;/code&gt; module are, for example, package group installation, installing packages from specific repositories, and managing COPR repositories.&lt;/p&gt;
&lt;p&gt;The module is a part of our new batch of modules that are written in &lt;a href=&quot;https://www.nushell.sh/&quot;&gt;Nushell&lt;/a&gt;, a modern shell that is built on top of the &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;Rust programming language&lt;/a&gt;. This approach makes the modules more maintainable and the source code more readable. You can read more about this change and decision process in the &lt;a href=&quot;https://github.com/blue-build/modules/issues/212&quot;&gt;GitHub Issue&lt;/a&gt; and possibly a future blog post.&lt;/p&gt;
&lt;p&gt;And yes, it can install Steam (this was a headache with &lt;code&gt;rpm-ostree&lt;/code&gt; because of dependency resolution issues).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type: dnf
repos:
  files:
    - https://negativo17.org/repos/fedora-steam.repo
install:
  packages:
    - install-weak-deps: false
      packages:
        - steam
        - kernel-modules-extra
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Switching from &lt;code&gt;rpm-ostree&lt;/code&gt; to &lt;code&gt;dnf&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;To switch to the &lt;code&gt;dnf&lt;/code&gt; module, switch the module type from &lt;code&gt;rpm-ostree&lt;/code&gt; to &lt;code&gt;dnf&lt;/code&gt;. Make sure to check out the &lt;a href=&quot;/reference/modules/dnf&quot;&gt;module reference page&lt;/a&gt; to see how to use the new module. Below is a short list of the main differences between the two modules.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changes to the &lt;code&gt;repos:&lt;/code&gt; section
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;rpm-ostree&lt;/code&gt; module used to have a &lt;code&gt;repos:&lt;/code&gt; section that was a list of repo files.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;dnf&lt;/code&gt; module&apos;s &lt;code&gt;repos:&lt;/code&gt; section supports adding repositories from files and COPR directly, adding repository keys, and choosing a nonfree repository (rpmfusion or negativo17).&lt;/li&gt;
&lt;li&gt;The section &lt;code&gt;repos: files:&lt;/code&gt; in the &lt;code&gt;dnf&lt;/code&gt; module is equivalent to the &lt;code&gt;repos:&lt;/code&gt; section in the &lt;code&gt;rpm-ostree&lt;/code&gt; module.&lt;/li&gt;
&lt;li&gt;The proper way to add COPR repositories is to use the &lt;code&gt;repos: copr:&lt;/code&gt; section in the &lt;code&gt;dnf&lt;/code&gt; module.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Changes to the &lt;code&gt;install:&lt;/code&gt; and &lt;code&gt;remove:&lt;/code&gt; sections
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;rpm-ostree&lt;/code&gt; module used to have &lt;code&gt;install:&lt;/code&gt; and &lt;code&gt;remove:&lt;/code&gt; sections that were lists of packages to install/remove.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;dnf&lt;/code&gt; module&apos;s &lt;code&gt;install:&lt;/code&gt; and &lt;code&gt;remove:&lt;/code&gt; sections support setting flags for the package manager.&lt;/li&gt;
&lt;li&gt;The section &lt;code&gt;install: packages:&lt;/code&gt; in the &lt;code&gt;dnf&lt;/code&gt; module is equivalent to the &lt;code&gt;install:&lt;/code&gt; section in the &lt;code&gt;rpm-ostree&lt;/code&gt; module.&lt;/li&gt;
&lt;li&gt;The list of packages also supports including sublists of packages to install from a specific repository or with specific flags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Changes to the &lt;code&gt;replace:&lt;/code&gt; section
&lt;ul&gt;
&lt;li&gt;While the syntax remains the same, the &lt;code&gt;replace:&lt;/code&gt; section in the &lt;code&gt;dnf&lt;/code&gt; module supports setting flags for the package manager.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;from-repo:&lt;/code&gt; parameter now takes the name of the repository to replace from, and the repository has to be added earlier in the &lt;code&gt;repos:&lt;/code&gt; section.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;New sections
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;group-install:&lt;/code&gt; and &lt;code&gt;group-remove:&lt;/code&gt; sections are new to the &lt;code&gt;dnf&lt;/code&gt; module.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>New CLI Features &amp; Breaking Changes — v0.9.0</title><link>https://blue-build.org/blog/v090-features-changes/</link><guid isPermaLink="true">https://blue-build.org/blog/v090-features-changes/</guid><description>Stay up-to-date on new CLI features and breaking changes related to custom modules.</description><pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::caution[TLDR]
The BlueBuild CLI &lt;code&gt;v0.9.0&lt;/code&gt; update introduces &lt;strong&gt;breaking changes&lt;/strong&gt;. &lt;a href=&quot;#breaking-changes&quot;&gt;Show me what you broke!&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;The BlueBuild CLI is the tool that builds all BlueBuild custom images. It is also installed on every image built with BlueBuild and can be used to build and tinker with images locally. Lately we &lt;em&gt;(gmpinder)&lt;/em&gt; have been hard at work on a new CLI version to automate many administrative tasks you have to do as a custom image creator. But enough of the fluff, let&apos;s get right to it!&lt;/p&gt;
&lt;h2&gt;How do I update?&lt;/h2&gt;
&lt;p&gt;:::tip[Wait a moment...]
It&apos;s recommended that you read the rest of the article before updating, but if you&apos;re busy, here&apos;s the instructions.
:::&lt;/p&gt;
&lt;p&gt;Updates to the BlueBuild GitHub Action automatically update the CLI version as well. Your repository should also get an update PR for the new Action version thanks to Dependabot. If the Dependabot PR hasn&apos;t landed yet, though, you can manually delve into &lt;code&gt;build.yml&lt;/code&gt; and make the following update.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jobs:
  bluebuild:
    steps:
      - name: Build Custom Image
-       uses: blue-build/github-action@v1.7
+       uses: blue-build/github-action@v1.8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voilà! That was easy.&lt;/p&gt;
&lt;p&gt;And if you&apos;re not using GitHub, just update wherever you might be specifying the CLI version to the latest one. With local builds, a simple rebuild should be enough to get the latest CLI version baked into your image at &lt;code&gt;/usr/bin/bluebuild&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;h3&gt;Generate ISOs for a fresh install&lt;/h3&gt;
&lt;p&gt;You can now generate offline ISO installation images as shown in the &lt;a href=&quot;/how-to/generate-iso/&quot;&gt;how-to guide&lt;/a&gt;. Under the hood this is a wrapper of &lt;a href=&quot;https://github.com/JasonN3/build-container-installer&quot;&gt;JasonN3&apos;s build-container-installer&lt;/a&gt;. Feel free to report issues to the CLI repository first, and to the upstream project only if the issue is deemed to be caused by them.&lt;/p&gt;
&lt;h3&gt;Quickstart a new BlueBuild project from the command line&lt;/h3&gt;
&lt;p&gt;You can now use the &lt;code&gt;bluebuild new&lt;/code&gt; and &lt;code&gt;bluebuild init&lt;/code&gt; commands to start a new BlueBuild project from the command line. This will set up a new local git repository for you based on the &lt;a href=&quot;https://github.com/blue-build/template/&quot;&gt;template&lt;/a&gt; and some short configuration questions. (&lt;code&gt;new&lt;/code&gt; creates a project in a new directory, &lt;code&gt;init&lt;/code&gt; in the current empty one)&lt;/p&gt;
&lt;p&gt;Here&apos;s a sneak peek:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❯ bluebuild new ./weird-os
✔ What would you like to name your image? · weird-os
✔ What is the registry for the image? (e.g. ghcr.io or registry.gitlab.com) · ghcr.io
✔ What is the name of your org/username? · octocat
✔ Write a short description of your image: · this is my weird custom OS :3
✔ Are you building on Github or Gitlab? · Github
Private key written to cosign.key
Public key written to cosign.pub
[main (root-commit) 994d18c] chore: Initial Commit
 11 files changed, 355 insertions(+)
 create mode 100644 .github/dependabot.yml
 create mode 100644 .github/workflows/build.yml
 create mode 100644 .gitignore
 create mode 100644 LICENSE
 create mode 100644 README.md
 create mode 100644 cosign.pub
 create mode 100644 files/scripts/example.sh
 create mode 100644 files/system/etc/.gitkeep
 create mode 100644 files/system/usr/.gitkeep
 create mode 100644 modules/.gitkeep
 create mode 100644 recipes/recipe.yml
INFO  =&amp;gt; Created new BlueBuild project in ./weird-os
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Image rechunking for more efficient diffs and updates&lt;/h3&gt;
&lt;p&gt;You can now enable rechunking for all your ostree-based custom images to make your resulting images more efficient at the cost of some build time. Rechunking is done using &lt;a href=&quot;https://github.com/hhd-dev/rechunk&quot;&gt;github.com/hhd-dev/rechunk&lt;/a&gt;, thanks to all the contributors for this enhancement!&lt;/p&gt;
&lt;p&gt;To enable rechunk on GitHub, add &lt;code&gt;rechunk: true&lt;/code&gt; to the parameters given to the BlueBuild GitHub Action. Locally and elsewhere, it&apos;s just a &lt;code&gt;--rechunk&lt;/code&gt; flag for the &lt;code&gt;bluebuild build&lt;/code&gt; command. Read more on the &lt;a href=&quot;/reference/github-action/#rechunk-optional&quot;&gt;reference page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&apos;re regularly making changes to your image and waiting to see if the build is successful, enabling rechunking will make the wait time slower. Feel free to not enable rechunk if you&apos;d rather optimize build time than user bandwidth.&lt;/p&gt;
&lt;h3&gt;Build stages for compiling programs from source while keeping your image clean&lt;/h3&gt;
&lt;p&gt;You can define stages with a new top-level &lt;code&gt;stages:&lt;/code&gt; key in the recipe before the &lt;code&gt;modules:&lt;/code&gt;. Stages use the same module system as the rest of the build, but you&apos;ll probably find the &lt;a href=&quot;/reference/modules/script/&quot;&gt;&lt;code&gt;script&lt;/code&gt;&lt;/a&gt; module most useful.&lt;/p&gt;
&lt;p&gt;After building something in a stage, you can use the newly stable &lt;a href=&quot;/reference/modules/copy/&quot;&gt;&lt;code&gt;copy&lt;/code&gt;&lt;/a&gt; module to copy files from the stage. This maps directly to a &lt;code&gt;COPY&lt;/code&gt; statement in the &lt;code&gt;Containerfile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Read more on the &lt;a href=&quot;https://blue-build.org/reference/stages/&quot;&gt;dedicated Stages-page&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Miscellaneous&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;login&lt;/code&gt; command for logging into registries for all tools like &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;skopeo&lt;/code&gt;, &lt;code&gt;cosign&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;A new &lt;code&gt;validate&lt;/code&gt; command and check before building that will tell you where you have errors in your recipes&lt;/li&gt;
&lt;li&gt;A new &lt;code&gt;prune&lt;/code&gt; command to easily clean build space for the build drivers&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;sigstore&lt;/code&gt; driver can now handle signing if you don&apos;t have &lt;code&gt;cosign&lt;/code&gt; installed&lt;/li&gt;
&lt;li&gt;A new &lt;code&gt;switch&lt;/code&gt; command consolidates &lt;code&gt;upgrade&lt;/code&gt;/&lt;code&gt;rebase&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;The ability to build multiple recipes at the same time&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Breaking Changes&lt;/h2&gt;
&lt;h3&gt;Related to custom modules&lt;/h3&gt;
&lt;p&gt;Internal changes and refactors always might affect your custom modules, but we try to be transparent when making such changes and announce them, so that you aren&apos;t left with broken builds without any apparent reason.&lt;/p&gt;
&lt;h4&gt;Removal of &lt;a href=&quot;https://github.com/mikefarah/yq&quot;&gt;&lt;code&gt;yq&lt;/code&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;We no longer include &lt;code&gt;yq&lt;/code&gt; by default in images built with BlueBuild, and have refactored all modules to use &lt;code&gt;jq&lt;/code&gt; instead (as such, modules using &lt;code&gt;get_json_array&lt;/code&gt; are now also broken on older CLI versions). This comes in tandem with our experimentation &lt;a href=&quot;https://github.com/blue-build/modules/issues/212&quot;&gt;with using Nushell&lt;/a&gt; to build some new modules, and a concern of &lt;code&gt;yq&lt;/code&gt; being included unconditionally regardless of if it&apos;s actually needed in an image, increasing attack surface. Read more about this from the &lt;a href=&quot;https://github.com/blue-build/cli/issues/261&quot;&gt;related GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What this means for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reading module configuration with &lt;code&gt;yq&lt;/code&gt; and &lt;code&gt;get_yaml_array&lt;/code&gt; will break with the new update&lt;/li&gt;
&lt;li&gt;You now have to use &lt;code&gt;jq&lt;/code&gt; and &lt;code&gt;get_json_array&lt;/code&gt; instead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s how you should refactor your module code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

# read a single variable from the configuration
- VAR=$(echo &quot;$1&quot; | yq -I=0 &apos;.var&apos;)
+ VAR=$(echo &quot;$1&quot; | jq -r &apos;try .[&quot;var&quot;]&apos;)
echo &quot;$VAR&quot;

# read an array from the configuration
- get_yaml_array ARRAY &apos;.array[]&apos; &quot;$1&quot;
+ get_json_array ARRAY &apos;try .[&quot;array&quot;][]&apos; &quot;$1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read more on the &lt;a href=&quot;/how-to/making-modules/&quot;&gt;updated custom module how-to guide&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;New way to use a local modules&lt;/h4&gt;
&lt;p&gt;Local modules must now have the &lt;code&gt;source&lt;/code&gt; property set to &lt;code&gt;local&lt;/code&gt;. Local modules are those that live inside the same repository as your custom image, inside the &lt;code&gt;./modules/&lt;/code&gt; folder. This change allows us to validate recipes properly while not causing errors when custom modules are used.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;modules:
    # use the module `./modules/custom-module/`
    - type: custom-module
      source: local
      input:
          - value 1
          - value 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Phasing out official support for &lt;a href=&quot;blue-build/legacy-template&quot;&gt;blue-build/legacy-template&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the switch to &lt;code&gt;jq&lt;/code&gt; and &lt;code&gt;get_json_array&lt;/code&gt; as talked about above, the &apos;legacy template&apos;, aka the old &apos;startingpoint&apos;, is starting to become ever more broken. As such, we will no longer be updating the template to accommodate for new changes. The repository is now archived, and a message is left in the README.&lt;/p&gt;
&lt;p&gt;If you&apos;re &lt;em&gt;one of the few people who still&lt;/em&gt; run their image builds from a repository based on it, and you are still not considering &lt;a href=&quot;/blog/introducing-bluebuild/#how-to-migrate&quot;&gt;migration to the new system&lt;/a&gt;, &lt;em&gt;you shall be crowned the new absolute ruler of your repository, in charge of keeping the builds running without someone telling you what to do.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Some things that might help you on your quest are &lt;a href=&quot;/how-to/minimal-setup/&quot;&gt;our guide to running BlueBuild modules from a Containerfile directly&lt;/a&gt; and plain-old reading the source code of &lt;a href=&quot;https://github.com/blue-build/cli&quot;&gt;BlueBuild&apos;s CLI&lt;/a&gt;, especially the file containing the &lt;a href=&quot;https://github.com/blue-build/cli/blob/main/scripts/exports.sh&quot;&gt;bash exports for modules&lt;/a&gt; and the &lt;a href=&quot;https://github.com/blue-build/cli/blob/main/template/templates/Containerfile.j2&quot;&gt;Containerfile template used by BlueBuild images&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Recipe validation strictness&lt;/h3&gt;
&lt;p&gt;Recipe validation, which runs by default on every build, might break your build if you include the key of an object or array in your recipe, but do not populate it with anything. This is because the recipe parser fails to see the type of the parameter as an object or an array, and fails with an &lt;code&gt;incorrect type&lt;/code&gt; error. In this case, you either need to delete the whole configuration key, or alternatively declare the value to either be &lt;code&gt;{}&lt;/code&gt; (an empty object) or &lt;code&gt;[]&lt;/code&gt; (an empty array).&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;modules:
    # This will fail validation
    - type: default-flatpaks
      user:
          install:
              - org.mozilla.firefox
          remove:
      system:

    # This will validate
    # (no Flatpaks will be removed, but the system Flathub repo will be set up)
    - type: default-flatpaks
      user:
          install:
              - org.mozilla.firefox
          remove: []
      system: {}

    # But you can also just leave out the `remove:` intirely
    # without changing what the module does
    - type: default-flatpaks
      user:
          install:
              - org.mozilla.firefox
          remove:
      system: {}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Miscellaneous&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Minimum supported version of &lt;code&gt;buildah&lt;/code&gt; is now &lt;code&gt;1.29&lt;/code&gt;, up from &lt;code&gt;1.24&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final words&lt;/h2&gt;
&lt;p&gt;Happy holidays, everyone! Have fun with the new features, and enjoy your free time whenever you have the chance.
&lt;em&gt;Stay tuned for the eventual &lt;code&gt;v1.0.0&lt;/code&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Discuss this post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/orgs/blue-build/discussions/44&quot;&gt;On GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fosstodon.org/@bluebuild/113606361086381862&quot;&gt;On the Fediverse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Place your system configuration files in /etc/</title><link>https://blue-build.org/blog/preferring-system-etc/</link><guid isPermaLink="true">https://blue-build.org/blog/preferring-system-etc/</guid><description>Why we&apos;re no longer recommending writing to /usr/etc/ in custom images of atomic Fedora</description><pubDate>Sun, 11 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello BlueBuilders!&lt;/p&gt;
&lt;p&gt;In this blog post, I will explain why the usage of &lt;code&gt;/etc/&lt;/code&gt; is now recommended over &lt;code&gt;/usr/etc/&lt;/code&gt; when building custom images of atomic Fedora.&lt;/p&gt;
&lt;p&gt;We, and many others in the community have recommended previously that the system configuration files in custom images should be placed in &lt;code&gt;/usr/etc/&lt;/code&gt;, while files in &lt;code&gt;/etc/&lt;/code&gt; are reserved for local-users. While it is true that in run-time the &lt;code&gt;/usr/etc/&lt;/code&gt; directory contains the original configuration of the image, this is technically undefined behavior build-time.&lt;/p&gt;
&lt;p&gt;Technically, files written to &lt;code&gt;/etc/&lt;/code&gt; in the custom image are what populates &lt;code&gt;/usr/etc/&lt;/code&gt; on a system rebased to that image.&lt;/p&gt;
&lt;p&gt;It is thanks to a recent discovery by the &lt;a href=&quot;https://github.com/ublue-os&quot;&gt;Universal Blue folks&lt;/a&gt; &amp;amp; the &lt;a href=&quot;https://github.com/hhd-dev/rechunk&quot;&gt;Rechunk&lt;/a&gt; developer &lt;a href=&quot;https://github.com/antheas&quot;&gt;Antheas&lt;/a&gt; that &lt;code&gt;ostree&lt;/code&gt; has different behavior regarding &lt;code&gt;/usr/etc/&lt;/code&gt; &amp;amp; &lt;code&gt;/etc/&lt;/code&gt; in build-time vs in run-time.&lt;br /&gt;
Thanks to the &lt;a href=&quot;https://github.com/cgwalters&quot;&gt;RedHat employee &amp;amp; &lt;code&gt;ostree&lt;/code&gt; maintainer Colin Walters&lt;/a&gt; who directly notified Universal Blue folks of this.&lt;/p&gt;
&lt;h2&gt;Why to transition&lt;/h2&gt;
&lt;p&gt;When files are placed to &lt;code&gt;/usr/etc/&lt;/code&gt; in build-time, currently there are no issues &amp;amp; everything works as expected &lt;em&gt;for now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;However, it is still not the ideal thing to do, since we are relying on undefined &lt;code&gt;rpm-ostree&lt;/code&gt; behavior, which may stop working some time in the future.
Quoting Antheas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When OSTree commits get converted to OCI, /usr/etc/ becomes /etc/. Then during deployment, new /etc/ files are silently moved to /usr/etc/.&lt;/p&gt;
&lt;p&gt;Relying on /usr/etc/ to place modified files in customized packages is a hack and relies on undefined behavior in the rpm-ostree source code that performs the path rewriting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(Take a note that we are utilizing an OCI image, so this part can be ignored: &lt;code&gt;When OSTree commits get converted to OCI, /usr/etc/ becomes /etc/.&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;As can be seen from the 1st paragraph of the note above, this is how &lt;code&gt;ostree&lt;/code&gt; functions &amp;amp; this is why it&apos;s desired to transition to &lt;code&gt;/etc/&lt;/code&gt;.
&lt;code&gt;/etc/&lt;/code&gt; files in the image are copied to &lt;code&gt;/usr/etc/&lt;/code&gt; during deployment, so local-users will experience no changes.&lt;/p&gt;
&lt;h2&gt;How to transition&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;It is highly recommended that you follow &amp;amp; complete &lt;a href=&quot;https://blue-build.org/blog/caching-update/&quot;&gt;The Caching Update&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://blue-build.org/blog/config-files/&quot;&gt;Updating the directory structure&lt;/a&gt; blog post updates&lt;/li&gt;
&lt;li&gt;If you&apos;re working with a &lt;em&gt;1-to-1 filetree mapping&lt;/em&gt; structure, where you copy files &amp;amp; folders to the root (&lt;code&gt;/&lt;/code&gt;) folder, then do the following (source-folder is the folder defined in &lt;code&gt;source&lt;/code&gt; key inside files module recipe entry):&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Move files from &lt;code&gt;files/system/usr/etc/&lt;/code&gt; to &lt;code&gt;files/system/etc/&lt;/code&gt; (or replace &lt;code&gt;system&lt;/code&gt; with the name of the specific directory)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;If you copy files to the image in other ways, then any files that go to &lt;code&gt;/usr/etc/&lt;/code&gt; should be copied to go to &lt;code&gt;/etc/&lt;/code&gt; according, including files copied by custom scripts.&lt;/li&gt;
&lt;li&gt;You&apos;re good to go! Commit your changes and wait to see that your custom image builds correctly.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Updating the directory structure</title><link>https://blue-build.org/blog/config-files/</link><guid isPermaLink="true">https://blue-build.org/blog/config-files/</guid><description>Why we&apos;re moving away from the config/ directory and migration instructions.</description><pubDate>Sun, 21 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A &lt;a href=&quot;/blog/caching-update&quot;&gt;previous update&lt;/a&gt; split the original &lt;code&gt;config/&lt;/code&gt; directory into two parts, &lt;code&gt;config/&lt;/code&gt; and the newly created &lt;code&gt;recipes/&lt;/code&gt;, because we realized that it did not make sense to include files that will be copied into the image and configuration files used for generating the Containerfile (the lower-level build-instructions) in the same directory anymore.&lt;/p&gt;
&lt;p&gt;This update left us at a weird state, though, because the directory that no longer contained image configuration, just files to be copied into the image, was called &lt;code&gt;config/&lt;/code&gt;. We didn&apos;t want to just rename &lt;code&gt;config/&lt;/code&gt; to &lt;code&gt;files/&lt;/code&gt;, though, because that would have created the weirdly named directory &lt;code&gt;files/files/&lt;/code&gt; used by the &lt;code&gt;files&lt;/code&gt; module (very confusing).&lt;/p&gt;
&lt;p&gt;What we opted to in addition to renaming &lt;code&gt;config/&lt;/code&gt; to &lt;code&gt;files/&lt;/code&gt; is giving the &lt;code&gt;files&lt;/code&gt; module access to the entire &lt;code&gt;files/&lt;/code&gt; directory. This keeps the convention of each module reading files from a folder named after itself, while unlocking better ways to organize files when using the &lt;code&gt;files&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;This is a small and non-critical change, and &lt;strong&gt;existing configurations will continue to be supported for the time being&lt;/strong&gt;. Our small team of volunteers is constantly working on improving the UX of BlueBuild and slowly integrating new features. We still have multiple similar refactors planned to increase the general cohesion of the whole system, so stay tuned to see us evolve.&lt;/p&gt;
&lt;p&gt;And now the part you&apos;re here for...&lt;/p&gt;
&lt;h2&gt;Migration&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you&apos;ve done the &lt;a href=&quot;/blog/caching-update#migration&quot;&gt;caching update migration&lt;/a&gt; that introduced the &lt;code&gt;recipes/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Rename your &lt;code&gt;config/&lt;/code&gt; directory to &lt;code&gt;files/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you&apos;re already working with a &lt;em&gt;1-to-1 filetree mapping&lt;/em&gt; structure, where you have root folders with names such as &lt;code&gt;usr&lt;/code&gt; or &lt;code&gt;etc&lt;/code&gt; that are copied into the image (as is the default), do the following:
&lt;ol&gt;
&lt;li&gt;Move all such folders into the directory &lt;code&gt;files/system/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change your files module configuration (or just the part that copied those folders) to below:&lt;pre&gt;&lt;code&gt;type: files
files:
    - source: system
      destination: /
&lt;/code&gt;&lt;/pre&gt;
(notice that this is also using the new explicit source/destination syntax added in the same update)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;If you&apos;re using the &lt;code&gt;files&lt;/code&gt; module to copy other kinds of folders outside of the &lt;em&gt;1-to-1 filetree mapping&lt;/em&gt; for example using a copying a folder called &lt;code&gt;wallpapers&lt;/code&gt; into the directory containing the default wallpapers in your environment, you may add those folders directly inside the &lt;code&gt;files/&lt;/code&gt; directory and copy them to the correct place similarly to the snippet above.&lt;/li&gt;
&lt;li&gt;You&apos;re good to go! Commit your changes and wait to see that your custom image builds correctly.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>The Caching Update</title><link>https://blue-build.org/blog/caching-update/</link><guid isPermaLink="true">https://blue-build.org/blog/caching-update/</guid><description>A recent BlueBuild CLI update makes builds and updates much faster. Learn how to take advantage of the improvements.</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::tip[TLDR]
A recent BlueBuild CLI update makes builds and updates much faster. &lt;a href=&quot;#migration&quot;&gt;What do I need to do to take advantage?&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;Hello! I&apos;m Jerry and I&apos;m the creator and maintainer of the Rust-based &lt;code&gt;bluebuild&lt;/code&gt; CLI tool. I started creating this tool as a way to extend the work that &lt;a href=&quot;https://github.com/xynydev&quot;&gt;XYNY&lt;/a&gt; did with the recipe standard, but make it so that I didn&apos;t have to manage the &lt;code&gt;Containerfile&lt;/code&gt; directly. The tool is an integral part of the project that handles Containerfile generation from the recipe, the building of container images, and pushing them to the registry.&lt;/p&gt;
&lt;p&gt;For the past month or so, we&apos;ve been working on trying to make the building experience better for our users. One of the biggest concerns brought up was the size of updates when using &lt;code&gt;rpm-ostree upgrade&lt;/code&gt; to pull your new changes. The size of the updates would end up being bigger than the original single &lt;code&gt;RUN build.sh&lt;/code&gt; instruction that was used. While this was really great for the time, more advanced uses of the legacy &lt;code&gt;startingpoint&lt;/code&gt; repo required users to know how to manage a &lt;code&gt;Containerfile&lt;/code&gt;. This can be really intimidating to less-technical users. One of the &lt;code&gt;bluebuild&lt;/code&gt; CLI&apos;s goals is to perform most of the optimizations for the user so they don&apos;t have to worry about setting that up.&lt;/p&gt;
&lt;h2&gt;Migration&lt;/h2&gt;
&lt;p&gt;I&apos;m happy to announce that we have now released &lt;code&gt;v0.8.4&lt;/code&gt; of &lt;code&gt;bluebuild&lt;/code&gt; CLI (and the accompanying v1.4.0 of the GitHub Action) which completes the last set of changes needed to allow users to quickly iterate on changes to their build to try new changes without having to wait for long build times or large downloads. The change requires:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Moving all of your recipe files into the &lt;code&gt;./recipes/&lt;/code&gt; directory in the root of your repo instead of &lt;code&gt;./config/&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;This does not include all the other files/directories in your &lt;code&gt;./config/&lt;/code&gt; like &lt;code&gt;./config/scripts/&lt;/code&gt; or &lt;code&gt;./config/files/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Any &lt;code&gt;.yml&lt;/code&gt;/&lt;code&gt;.yaml&lt;/code&gt; file that contains information for the modules to build your image are your recipe files.&lt;/li&gt;
&lt;li&gt;Be sure to update any use of &lt;code&gt;from-file:&lt;/code&gt; to account for any changes in your directory structure
&lt;ul&gt;
&lt;li&gt;For example if the recipes were in &lt;code&gt;./config/recipes/&lt;/code&gt; and extended recipe files in &lt;code&gt;./config/recipes/image_configs/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;One of the recipes calls &lt;code&gt;from-file: recipes/image_configs/common.yml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;config
└─recipes
  ├── image_configs
  │   ├── common.yml
  │   ├── gnome.yml
  │   └── kde.yml
  ├── recipe-gnome-nvidia.yml
  ├── recipe-gnome.yml
  ├── recipe-kde-nvidia.yml
  └── recipe-kde.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;You could move &lt;code&gt;recipes&lt;/code&gt; up a level to be:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;config
recipes
├── image_configs
│   ├── common.yml
│   ├── gnome.yml
│   └── kde.yml
├── recipe-gnome-nvidia.yml
├── recipe-gnome.yml
├── recipe-kde-nvidia.yml
└── recipe-kde.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Then &lt;code&gt;from-file:&lt;/code&gt; can have the path set to &lt;code&gt;image_configs/common.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Be sure to update your workflow file too
&lt;ul&gt;
&lt;li&gt;If your &lt;code&gt;recipe.yml&lt;/code&gt; was located in &lt;code&gt;./config/&lt;/code&gt; and you moved it to &lt;code&gt;./recipes/&lt;/code&gt;, the GHA will already take that into account&lt;/li&gt;
&lt;li&gt;The thing to look out for is the recipe&apos;s relative location to the &quot;root&quot; of recipe locations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It&apos;s also suggested to move the &lt;code&gt;./config/containerfiles/&lt;/code&gt; directory into the root of your repo too.
&lt;ul&gt;
&lt;li&gt;You can see the docs for the &lt;code&gt;containerfile&lt;/code&gt; module &lt;a href=&quot;https://blue-build.org/reference/modules/containerfile/&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Update your GHA to be at least &lt;code&gt;v1.4&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Wait, what&apos;s wrong with how it is now?&lt;/h2&gt;
&lt;p&gt;When you build an image with &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;buildah&lt;/code&gt;, or &lt;code&gt;podman&lt;/code&gt; the layers in your &lt;code&gt;Containerfile&lt;/code&gt; are kept on your system to be re-used by other images or when you rebuild the image so that you don&apos;t have to rebuild layers that did not change. BlueBuild interfaces with these tools to build your images. BlueBuild takes in your recipe file and translates that into &lt;code&gt;Containerfile&lt;/code&gt; instructions. The instructions are created in the order you define in your recipe. Assuming your base image hasn&apos;t pushed an update, when you make a change to an instruction in your &lt;code&gt;Containerfile&lt;/code&gt;, the image will only be built from the changed instruction forward. If you&apos;re using &lt;code&gt;COPY&lt;/code&gt; to copy files into your image, any changes to those &lt;code&gt;COPY&lt;/code&gt;&apos;d files in your repo will cause the build to start re-building from that point.&lt;/p&gt;
&lt;p&gt;The problem was that the recipe files were being stored in &lt;code&gt;./config/&lt;/code&gt; which also happened to contain all of your other build files which may or may not have changed. This means that when you made a change to your recipe file, it would end up marking &lt;code&gt;./config/&lt;/code&gt; (which is copied into a stage and &lt;a href=&quot;https://docs.docker.com/reference/dockerfile/#run---mounttypebind&quot;&gt;mounted on each &lt;code&gt;RUN&lt;/code&gt; instruction&lt;/a&gt;) as changed as well as updating the corresponding &lt;code&gt;RUN&lt;/code&gt; instructions in the &lt;code&gt;Containerfile&lt;/code&gt;. The mount indicates to the builder that it is dependant on the new changes found in &lt;code&gt;./config/&lt;/code&gt; and so every single instruction is run again on that change.&lt;/p&gt;
&lt;h2&gt;How does this update solve the cache problem?&lt;/h2&gt;
&lt;p&gt;The recipe file should only be seen as a way to define how to create the &lt;code&gt;Containerfile&lt;/code&gt; and the parameters that are passed into the module. It shouldn&apos;t be &lt;code&gt;COPY&lt;/code&gt;&apos;d into the build. By moving the recipe files into &lt;code&gt;./recipes/&lt;/code&gt; it removes the build&apos;s dependency on file changes in &lt;code&gt;./config/&lt;/code&gt; from recipe updates and will now only change the &lt;code&gt;Containerfile&lt;/code&gt; itself allowing the builder to only run the instructions that changed.&lt;/p&gt;
&lt;h2&gt;How does this cache persist in a GitHub Action runner?&lt;/h2&gt;
&lt;p&gt;Docker has an &lt;a href=&quot;https://docs.docker.com/build/cache/backends/gha/&quot;&gt;experimental feature&lt;/a&gt; that allows builds to interface directly with the GitHub Action cache system. We&apos;ve setup our &lt;code&gt;docker&lt;/code&gt; driver in BlueBuild and our GHA to make use of this feature. This means that BlueBuild will handle this for you.&lt;/p&gt;
&lt;h2&gt;This sounds great, but I need to see numbers&lt;/h2&gt;
&lt;p&gt;During my testing and work on this feature in the CLI, I attempted testing this out by making a change on the second to last module I defined in my recipe. Theoretically, this would mean the only layers that would need to be built would be those last ones.&lt;/p&gt;
&lt;p&gt;Here&apos;s a snippet of my recipe before the change.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: jp-laptop
description: The image of Wunker OS for JP&apos;s Laptop.
base_image: ghcr.io/ublue-os/bazzite
image_version: &quot;39&quot;
modules:
    # ...
    - type: script
      scripts:
          - setup-selinux-dockersock.sh
    - type: script
      scripts:
          - setup-kubectl.sh
    - type: rpm-ostree
      repos:
          - https://pkg.earthly.dev/earthly.repo
          - https://cli.github.com/packages/rpm/gh-cli.repo
      install:
          - earthly
          - neovim
          - helix
          - alacritty
          - gh
    - type: script
      scripts:
          - install-mkcert.sh
          - install-codelldb.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here&apos;s the change. I&apos;m removing &lt;code&gt;neovim&lt;/code&gt; cause I&apos;m a filthy &lt;code&gt;helix&lt;/code&gt; user.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: jp-laptop
description: The image of Wunker OS for JP&apos;s Laptop.
base_image: ghcr.io/ublue-os/bazzite
image_version: &quot;39&quot;
modules:
    # ...
    - type: script
      scripts:
          - setup-selinux-dockersock.sh
    - type: script
      scripts:
          - setup-kubectl.sh
    - type: rpm-ostree
      repos:
          - https://pkg.earthly.dev/earthly.repo
          - https://cli.github.com/packages/rpm/gh-cli.repo
      install:
          - earthly
          - helix
          - alacritty
          - gh
    - type: script
      scripts:
          - install-mkcert.sh
          - install-codelldb.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So we re-run the build.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; =&amp;gt; CACHED [stage-config 1/1] COPY ./config /config                                                                                                       0.0s
 =&amp;gt; CACHED [stage-modules 1/2] COPY --from=ghcr.io/blue-build/modules:latest /modules /modules                                                            0.0s
 =&amp;gt; CACHED [stage-modules 2/2] COPY ./modules /modules                                                                                                    0.0s
 =&amp;gt; CACHED [stage-keys 1/1] COPY cosign.pub /keys/jp-desktop-gaming.pub                                                                                   0.0s
 =&amp;gt; CACHED [stage-4  2/16] RUN --mount=type=bind,from=stage-keys,src=/keys,dst=/tmp/keys   mkdir -p /usr/etc/pki/containers/   &amp;amp;&amp;amp; cp /tmp/keys/* /usr/et  0.0s
 =&amp;gt; CACHED [stage-bins 1/3] COPY --from=ghcr.io/sigstore/cosign/cosign /ko-app/cosign /bins/cosign                                                         0.0s
 =&amp;gt; CACHED [stage-bins 3/3] COPY --from=ghcr.io/blue-build/cli:main-installer /out/bluebuild /bins/bluebuild                                              0.0s
 =&amp;gt; CACHED [stage-4  3/16] RUN --mount=type=bind,from=stage-bins,src=/bins,dst=/tmp/bins   mkdir -p /usr/bin/   &amp;amp;&amp;amp; cp /tmp/bins/* /usr/bin/   &amp;amp;&amp;amp; ostree   0.0s
 =&amp;gt; CACHED [stage-4  4/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4  5/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4  6/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4  7/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4  8/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4  9/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4 10/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4 11/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4 12/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4 13/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; CACHED [stage-4 14/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind  0.0s
 =&amp;gt; [stage-4 15/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind,from=  33.4s
 =&amp;gt; [stage-4 16/16] RUN   --mount=type=tmpfs,target=/var   --mount=type=bind,from=stage-config,src=/config,dst=/tmp/config,rw   --mount=type=bind,from=s  0.7s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see above, all preceding layers are cached and the last 2 layers are re-built. Performing an upgrade for this ends up only pulling these last layers.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$&amp;gt; rpm-ostree upgrade
Pulling manifest: ostree-image-signed:docker://registry.gitlab.com/wunker-bunker/wunker-os/jp-laptop
Importing: ostree-image-signed:docker://registry.gitlab.com/wunker-bunker/wunker-os/jp-laptop (digest: sha256:01073d98adf4041f3b91840af1135b15aee97db90de6bc3a3846d67c07345e6a)
ostree chunk layers already present: 65
custom layers already present: 16
custom layers needed: 2 (255.0 MB)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;So all I need to do is move my recipe files?&lt;/h2&gt;
&lt;p&gt;Yes. The vast majority of the work to get these benefits are done on our end. All you need to do is move those files.&lt;/p&gt;
&lt;h2&gt;Do I HAVE to make this change right now?&lt;/h2&gt;
&lt;p&gt;No you don&apos;t. We will continue to support the legacy method for the time being.&lt;/p&gt;
&lt;h2&gt;Final words&lt;/h2&gt;
&lt;p&gt;Hopefully I was able to explain how these changes will help you in your building ventures. We&apos;ll be working more on creating useful features as well as optimizing your building experience.&lt;/p&gt;
&lt;p&gt;Happy building!&lt;/p&gt;
</content:encoded></item><item><title>Introducing BlueBuild</title><link>https://blue-build.org/blog/introducing-bluebuild/</link><guid isPermaLink="true">https://blue-build.org/blog/introducing-bluebuild/</guid><description>Per a mutual decision, Universal Blue&apos;s old custom image tooling has now been transferred to the BlueBuild org. Here&apos;s what you should know.</description><pubDate>Sun, 25 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
If you&apos;re not totally sure what this is about, check out the &lt;a href=&quot;/&quot;&gt;front page&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Per a mutual decision, &lt;a href=&quot;https://universal-blue.org/&quot;&gt;Universal Blue&lt;/a&gt;&apos;s old custom image tooling has now been transferred to the BlueBuild org and development will be continuing under the BlueBuild project with basically the same team of maintainers and developers as before. The issue was discussed extensively in &lt;a href=&quot;https://github.com/ublue-os/startingpoint/issues/223&quot;&gt;ublue-os/startingpoint#223&lt;/a&gt; and eventually voted for in &lt;a href=&quot;https://github.com/ublue-os/main/issues/476&quot;&gt;ublue-os/main#476&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&apos;ve been working on BlueBuild for a month now to provide you a smooth &lt;a href=&quot;#how-to-migrate&quot;&gt;migration&lt;/a&gt; and exciting &lt;a href=&quot;#whats-new&quot;&gt;new features&lt;/a&gt;, so don&apos;t worry, &lt;em&gt;this change is positive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To briefly summarize, this desire to split stemmed from a difference in philosophy and scope between the main Universal Blue maintainers and the developers of &apos;startingpoint&apos;. Since most of the Universal Blue project&apos;s build systems use classic cloud methodologies like Containerfiles and GitHub Actions directly to build their images, the abstraction introduced with &lt;a href=&quot;/reference/recipe/&quot;&gt;recipes&lt;/a&gt; in &apos;startingpoint&apos; might have seemed unnecessary. Additionally, I felt that as a subproject of Universal Blue, this project couldn&apos;t really achieve its full potential.&lt;/p&gt;
&lt;p&gt;The repositories affected by this transition are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ublue-os/startingpoint&quot;&gt;ublue-os/startingpoint&lt;/a&gt; (transferred to &lt;a href=&quot;https://github.com/blue-build/legacy-template&quot;&gt;blue-build/legacy-template&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ublue-os/bling&quot;&gt;ublue-os/bling&lt;/a&gt; (transferred to &lt;a href=&quot;https://github.com/blue-build/modules&quot;&gt;blue-build/modules&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ublue-os/images-website&quot;&gt;ublue-os/images-website&lt;/a&gt; (transferred to &lt;a href=&quot;https://github.com/blue-build/images-website&quot;&gt;blue-build/images-website&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::note
BlueBuild is based on the idea of &lt;a href=&quot;/reference/recipe/&quot;&gt;recipes&lt;/a&gt; as abstractions for the image build. Universal Blue might in the future provide official documentation for custom image creation using Containerfiles directly.
See the &lt;a href=&quot;https://blue-build.org/#faq&quot;&gt;FAQ&lt;/a&gt; to learn more about the difference.
:::&lt;/p&gt;
&lt;h2&gt;History lesson...&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This section gives a bigger picture of the developments in the history of this project from &lt;a href=&quot;https://github.com/xynydev&quot;&gt;my&lt;/a&gt; perspective. Jump to the &lt;a href=&quot;#whats-new&quot;&gt;What&apos;s new?&lt;/a&gt; section to jump straight to the important stuff.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When the &lt;a href=&quot;https://universal-blue.org/&quot;&gt;Universal Blue&lt;/a&gt; organization was starting out, the base was just a single repository: &lt;a href=&quot;https://github.com/ublue-os/base/tree/785b8f0d8adb8513bbe94b8918bfc0033ee0ca45&quot;&gt;ublue-os/base&lt;/a&gt;. This repository never built more than a single Silverblue image, and was easily forked into a new image by a tinkerer wishing to use a different base image or set of packages. The repository also had a script for installing Flatpaks after the first boot, and in &lt;a href=&quot;https://github.com/ublue-os/base/pull/79&quot;&gt;my first PR&lt;/a&gt; I added in a &lt;code&gt;recipe.yml&lt;/code&gt; file for easier customization of the Flatpaks and RPM-packages by people tinkering the images. This was in February 2023, so a few months before the &lt;a href=&quot;https://github.com/Vanilla-OS/Vib/commit/8041d630cbe5fa51dc4d19080a3bbc958ab9e214&quot;&gt;first commit&lt;/a&gt; to &lt;a href=&quot;https://vib.vanillaos.org/&quot;&gt;VanillaOS&apos; Vib&lt;/a&gt;, which is a similar project that uses a slightly different &lt;code&gt;recipe.yml&lt;/code&gt; format.&lt;/p&gt;
&lt;p&gt;A while after, &lt;a href=&quot;https://github.com/ublue-os/base/tree/785b8f0d8adb8513bbe94b8918bfc0033ee0ca45&quot;&gt;ublue-os/base&lt;/a&gt; was deprecated in favor of &lt;a href=&quot;https://github.com/ublue-os/main&quot;&gt;ublue-os/main&lt;/a&gt;. I got to keep working on the &lt;code&gt;recipe.yml&lt;/code&gt;-based repository as &lt;a href=&quot;https://github.com/ublue-os/startingpoint&quot;&gt;ublue-os/startingpoint&lt;/a&gt;, which would now only serve the part of a template. Eventually it became possible to build a full image only by editing the recipe, with no need to delve into Containerfiles or GitHub Actions.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;recipe.yml&lt;/code&gt; format was still quite different than today, but after the &lt;a href=&quot;https://github.com/ublue-os/startingpoint/pull/135&quot;&gt;rewrite&lt;/a&gt; in September 2023, the current modular system was established, and we started utilizing the &lt;a href=&quot;https://github.com/ublue-os/bling&quot;&gt;ublue-os/bling&lt;/a&gt; repository as a source of modules instead of including them all in the template. This change made the project way more maintainable and extensible, and more abstracted.&lt;/p&gt;
&lt;p&gt;The BlueBuild project is a direct continuation of this lineage, aiming to be an accessible way of building custom images of Linux distributions.&lt;/p&gt;
&lt;h2&gt;What&apos;s new?&lt;/h2&gt;
&lt;p&gt;The shiny new brand and website is probably what you&apos;ll notice first, but that isn&apos;t the only new thing to be excited about!&lt;/p&gt;
&lt;h3&gt;Recipe compiler&lt;/h3&gt;
&lt;p&gt;The recipe compiler turns your recipe into a Containerfile, freeing us from the restrictions that having the entire build system being based on a shell script ran during the image build caused. For example, it will now be possible to include Containerfile snippets from the recipe directly. The compiler lives as part of the &lt;a href=&quot;https://github.com/blue-build/cli&quot;&gt;blue-build/cli&lt;/a&gt; program, which is written in Rust, and also offers other features including building images and rebasing to them locally.&lt;/p&gt;
&lt;p&gt;Our new re-usable &lt;a href=&quot;https://github.com/blue-build/github-action&quot;&gt;GitHub Action&lt;/a&gt; and &lt;a href=&quot;https://github.com/blue-build/template&quot;&gt;template repository&lt;/a&gt; use the compiler by default, so new users will get the benefits instantly. The new template requires less maintenance, as important parts of the build system have been moved to other repositories.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://docs.sigstore.dev/signing/overview/&quot;&gt;Keyless signing with OIDC and Sigstore&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;:::note
This feature has currently been delayed due to lacking verification support in upstream projects. See &lt;a href=&quot;https://github.com/blue-build/cli/issues/84&quot;&gt;blue-build/cli#84&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;The keyless signing support with OIDC will make new repository setup easier and more straightforward by making the generation of a cosign / sigstore keypair optional. When signing without keys, the verification will be based on ephemeral keys bound to an OIDC identity from GitHub, making it possible to verify that the image you are using came from the specific GitHub Action, &lt;em&gt;without specifying a public key&lt;/em&gt;. This will also shorten the first-time rebase process to one command, going directly onto the signed image, and eliminating the need to trust the registry on the first rebase.&lt;/p&gt;
&lt;p&gt;New users and existing users alike should be able to take advantage of this soon. Once this feature is fully ready, a guide will be provided.&lt;/p&gt;
&lt;h2&gt;How to migrate?&lt;/h2&gt;
&lt;p&gt;With the important repositories having been moved, it is unfortunately required to do &lt;a href=&quot;#do-nothing&quot;&gt;&lt;em&gt;at least some&lt;/em&gt;&lt;/a&gt; migration. It is also possible to migrate to your old custom image to be built using the new recipe compiler, allowing you to make use of new and upcoming features. From the list below, choose your preferred migration path.&lt;/p&gt;
&lt;h3&gt;Upgrade your current repository (recommended)&lt;/h3&gt;
&lt;h4&gt;Pros/cons&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;+&lt;/code&gt; Keep git history and repository&lt;br /&gt;
&lt;code&gt;+&lt;/code&gt; Keep your existing configuration&lt;br /&gt;
&lt;code&gt;-&lt;/code&gt; Requires some copy-pasting of workflow files&lt;/p&gt;
&lt;h4&gt;Instructions&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Temporarily &lt;a href=&quot;https://git-scm.com/docs/git-clone&quot;&gt;clone&lt;/a&gt; the &lt;a href=&quot;https://github.com/blue-build/template&quot;&gt;new template repository&lt;/a&gt; to your computer.&lt;/li&gt;
&lt;li&gt;Overwrite your old &lt;code&gt;.github/&lt;/code&gt; folder with the &lt;code&gt;.github/&lt;/code&gt; folder from the new template.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;re building multiple images,&lt;/strong&gt; remember to copy your matrix of recipes from the old &lt;code&gt;build.yml&lt;/code&gt; to the new &lt;code&gt;build.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;ve made changes to &lt;code&gt;build.yml&lt;/code&gt;&lt;/strong&gt;, those have to be ported manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove irrelevant files from your repository.
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Containerfile&lt;/code&gt; and &lt;code&gt;build.sh&lt;/code&gt; are not used by the recipe compiler -based build system. If you&apos;ve made any changes to those files, they have to be manually ported over.&lt;/li&gt;
&lt;li&gt;You might also want to add &quot;&lt;code&gt;/Containerfile&lt;/code&gt;&quot; to the &lt;code&gt;.gitignore&lt;/code&gt; file, because the recipe compiler generates a Containerfile when run locally.&lt;/li&gt;
&lt;li&gt;It is also recommended to clean out files that are related to Universal Blue community management (&lt;code&gt;CODE_OF_CONDUCT.md&lt;/code&gt; and &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;), if you haven&apos;t changed them to contain information relevant to your custom image project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clean up your configuration.
&lt;ul&gt;
&lt;li&gt;Some changes to the template defaults have been made in preparation for the migration, which make the template more minimal, and should be adopted by both old and new users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove the old &lt;code&gt;signing.sh&lt;/code&gt; in favor of the &lt;a href=&quot;/reference/modules/signing/&quot;&gt;&lt;code&gt;signing&lt;/code&gt; module&lt;/a&gt;,&lt;/strong&gt; which is essentially the same, but requires less maintenance from custom image creators. &lt;code&gt;signing.sh&lt;/code&gt; is deprecated, and won&apos;t be supported any longer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you use just,&lt;/strong&gt; remove &lt;code&gt;100-bling.just&lt;/code&gt; and the import for it from &lt;code&gt;60-custom.just&lt;/code&gt;. The bling justfiles have been removed due to lack of maintenance, and all their features being covered by the justfiles included by default with Universal Blue images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you don&apos;t use just,&lt;/strong&gt; you can remove the whole &lt;code&gt;config/files/usr/share/ublue-os/just/&lt;/code&gt; folder from your repository. This is unneeded and no longer included in the templates by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Detach your custom image repository, which is most likely a fork of the upstream template.
&lt;ul&gt;
&lt;li&gt;While this step isn&apos;t strictly required, it should still be done because your repository is no longer related to its old upstream template, and it now functions as though it was generated from the new template.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This can be done through the &lt;a href=&quot;https://support.github.com/contact?tags=rr-forks&amp;amp;subject=Detach%20Fork&amp;amp;flow=detach_fork&quot;&gt;GitHub Virtual Support Assistant&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clean up the git branch structure by removing the &lt;code&gt;template&lt;/code&gt; branch and renaming &lt;code&gt;live&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;This step is optional, but recommended. The existing branch structure will continue to work as expected, but migration will make it more straightforward and syncing with the upstream template easier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Move your recipe files into &lt;code&gt;./recipes/&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Doing so will allow your builds to cache layers with the new system.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;./recipes/&lt;/code&gt; directory will never be copied into the build context which allows changes to your recipe to only be reflected in the changed &lt;code&gt;Containerfile&lt;/code&gt;. This way docker will only build starting at the layer that changed.&lt;/li&gt;
&lt;li&gt;Cached builds will only work if your base image hasn&apos;t updated yet, otherwise it will have to rebuild from the start.&lt;/li&gt;
&lt;li&gt;This is great for making tweaks to your recipe and testing it as your computer will only have to download the new layers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You should be all set now! Try starting your builds if you haven&apos;t already.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Create a new repository (not recommended)&lt;/h3&gt;
&lt;h4&gt;Pros/cons&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;+&lt;/code&gt; Accidental breakage unlikely&lt;br /&gt;
&lt;code&gt;+&lt;/code&gt; Keep your existing configuration&lt;br /&gt;
&lt;code&gt;-&lt;/code&gt; Lose git history&lt;br /&gt;
&lt;code&gt;-&lt;/code&gt; Will change cosign keys&lt;br /&gt;
&lt;code&gt;-&lt;/code&gt; You&apos;ll have two repositories&lt;/p&gt;
&lt;h4&gt;Instructions&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Set up a new repository using the &lt;a href=&quot;/how-to/setup/&quot;&gt;guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make sure both your old and new repositories are &lt;a href=&quot;https://git-scm.com/docs/git-clone&quot;&gt;cloned&lt;/a&gt; locally.&lt;/li&gt;
&lt;li&gt;Copy relevant parts from your old repository to the new one.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Everyone should copy at least the &lt;code&gt;config/&lt;/code&gt; and &lt;code&gt;recipes/&lt;/code&gt; directories,&lt;/strong&gt; but you can also copy &lt;code&gt;README.md&lt;/code&gt; and &lt;code&gt;modules/&lt;/code&gt;, if you&apos;ve made any changes to those.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;re building multiple images,&lt;/strong&gt; remember to copy your matrix of recipes from the old &lt;code&gt;build.yml&lt;/code&gt; to the new &lt;code&gt;build.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;ve made changes to &lt;code&gt;build.sh&lt;/code&gt;, &lt;code&gt;build.yml&lt;/code&gt;, or the &lt;code&gt;Containerfile&lt;/code&gt;&lt;/strong&gt;, those have to be ported manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clean up your configuration in the new repository.
&lt;ul&gt;
&lt;li&gt;During the last month some changes to the template defaults have been made in preparation for the migration, which make the template more minimal, and should be adopted by both old and new users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove the old &lt;code&gt;signing.sh&lt;/code&gt; in favor of the &lt;a href=&quot;/reference/modules/signing/&quot;&gt;&lt;code&gt;signing&lt;/code&gt; module&lt;/a&gt;,&lt;/strong&gt; which is essentially the same, but requires less maintenance from custom image creators. &lt;code&gt;signing.sh&lt;/code&gt; is deprecated, and won&apos;t be supported any longer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you use just,&lt;/strong&gt; remove &lt;code&gt;100-bling.just&lt;/code&gt; and the import for it from &lt;code&gt;60-custom.just&lt;/code&gt;. The bling justfiles have been removed due to lack of maintenance, and all their features being covered by the justfiles included by default with Universal Blue images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you don&apos;t use just,&lt;/strong&gt; you can remove the whole &lt;code&gt;config/files/usr/share/ublue-os/just/&lt;/code&gt; folder from your repository. This is unneeded and no longer included in the templates by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add a message to the README of your old repository pointing to the new one, disable the workflows (either in the GitHub UI or by removing &lt;code&gt;build.yml&lt;/code&gt;), and archive it.&lt;/li&gt;
&lt;li&gt;Fix &lt;code&gt;ghcr.io: denied: permission_denied: write_package&lt;/code&gt; errors in your new repo.
&lt;ul&gt;
&lt;li&gt;See the &lt;a href=&quot;/learn/troubleshooting#ghcr.io:-denied:-permission_denied:-write_package&quot;&gt;troubleshooting&lt;/a&gt; page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You should be all set now! Try starting your builds if you haven&apos;t already.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Do nothing&lt;/h3&gt;
&lt;p&gt;It is also possible to keep building a custom image based on the legacy template / build system as it will be supported for the foreseeable future. A quick migration process is still needed to prevent your custom image builds from breaking after 90 days (from 2024-02-25), when GitHub cleans up the old module repository image from the &lt;code&gt;ublue-os&lt;/code&gt; GitHub organization.&lt;/p&gt;
&lt;h4&gt;Pros/cons&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;+&lt;/code&gt; Keep your existing configuration and whatever customizations you might have made to the build system&lt;br /&gt;
&lt;code&gt;+&lt;/code&gt; Only a quick migration process needed to keep receiving updates to modules&lt;br /&gt;
&lt;code&gt;-&lt;/code&gt; You won&apos;t get new features that depend on the recipe compiler&lt;/p&gt;
&lt;h4&gt;Instructions&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Either sync up with the upstream template or manually change the occurrences of &lt;code&gt;ublue-os/bling&lt;/code&gt; in the Containerfile to &lt;code&gt;blue-build/modules&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;On the latest version of the template, there should be just one on line 31.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clean up your configuration (optional, recommended).
&lt;ul&gt;
&lt;li&gt;During the last month some changes to the template defaults have been made in preparation for the migration, which make the template more minimal, and should be adopted by both old and new users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove the old &lt;code&gt;signing.sh&lt;/code&gt; in favor of the &lt;a href=&quot;/reference/modules/signing/&quot;&gt;&lt;code&gt;signing&lt;/code&gt; module&lt;/a&gt;,&lt;/strong&gt; which is essentially the same, but requires less maintenance from custom image creators. &lt;code&gt;signing.sh&lt;/code&gt; is deprecated, and won&apos;t be supported any longer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you use just,&lt;/strong&gt; remove &lt;code&gt;100-bling.just&lt;/code&gt; and the import for it from &lt;code&gt;60-custom.just&lt;/code&gt;. The bling justfiles have been removed due to lack of maintenance, and all their features being covered by the justfiles included by default with Universal Blue images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you don&apos;t use just,&lt;/strong&gt; you can remove the whole &lt;code&gt;config/files/usr/share/ublue-os/just/&lt;/code&gt; folder from your repository. This is unneeded and no longer included in the templates by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Migration complete! You can now resume chilling.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;This post can be discussed on GitHub Discussions: https://github.com/orgs/blue-build/discussions/10&lt;/p&gt;
&lt;p&gt;This change was also announced over on the Universal Blue forums: https://universal-blue.discourse.group/t/universal-blues-old-custom-image-tooling-has-been-migrated-to-bluebuild/669&lt;/p&gt;
&lt;p&gt;Be sure to join our community spaces and interact in a healthy way with others: https://blue-build.org/community/&lt;/p&gt;
</content:encoded></item></channel></rss>