Conf42 DevOps 2025 - Online

- premiere 5PM GMT

Refining the Release Strategy of a Custom Linux Distro

Video size:

Abstract

In today’s fast-paced development environment, a robust and efficient release process is critical for delivering reliable software on time. Let’s explore how continuously improving the release flow enables more frequent and agile updates even for complex products, such as custom Linux distros.

Summary

Transcript

This transcript was autogenerated. To make changes, submit a PR.
Hello, everyone, and thank you for joining me today at Conf42 DevOps. My name is Andrea Andriushan. I'm a DevOps engineer at Analog Devices, and I'm excited to talk about how we've optimized the release process for Analog Devices custom Linux distribution. Named KyperLinux. The software development life cycle is all about improvement. Iteration by iteration. Every stage, including the release process, benefits from refinement. When done effectively, this ensures that products reach customers faster, with higher reliability. Today, I will show you how we applied this principle to KyperLinux and the substantial results it brought. Now, you may ask, what's our custom Linux distribution? Well, Let's answer this question and tell you about ADI KyperLinux. Kyper is the primary distribution for product evaluation boards, including reference designs, device drivers, and a variety of development utilities. Now, let's see how we improved the release process on this complex component. By the end of this talk, we'll gain insights into what was the old release process for Hyperlinux in order to have a better understanding of the changes that were made. and how they impacted the product and which are some of the major improvements that we needed to integrate and why. And also the current state of our custom Linux distribution. The traditional process was slow, rigid, and prone to delays due to lack of modularity and the high interdependence between components. All the software components were built during image creation, which meant a longer build time. Another reason for the long release cycles was the fact that software components were released through Kyper Linux image. With no modularity, a bug found in one of the components delayed all of them. After we identified the big problems of the previous flow, we came up with a few ideas that we then implemented. These key modifications were creating a stabilization branch from release of each core software component, breaking down the monolith structure for a better management of the Linux drivers, libraries, UA application, and user space tools. And creating Debian packaging for components that were previously mentioned. Modular configuration for custom images. And based on the other changes mentioned, we can configure easier the image before build time. expand component level testing with custom docker images created from a Kyper Linux build image. Improvements were also made on the CI side by moving the automatic build on GitHub Actions and introducing PR templates and co donors for a better overview of the new changes. To kick off the improvements, we introduce a dedicated stabilization branch for every new release. This branch is created from the main branch and serves as a space where the release is refined, tested, and stabilized without interference from ongoing development. This approach allows us to focus on preparing the release while the main branch continues to accommodate new features and updates. The result? Faster issue resolution, more focused testing, and a stable release pipeline. Based on the diagram below, you can see that the master branch serves as the main development branch for new features and fixes. Our next stable branch is created by branching off from master. This branch is dedicated to stabilization. Ensuring that the code is closely tested and prepared for release. Fixes and updates are often pushed to both master and nexttable simultaneously to maintain consistency. Once the nexttable branch is considered ready for release, a release branch or tag is created from it. In most cases, new bugs are found during release testing. That's why a release patch will be created after the fix is added on the branch. After a release is finished, the next stable branch is overwritten with the latest changes from master to sync and prepare for the next stabilization cycle. Next, we moved away from a monolithic release process and separated the entire release into smaller independent components. In the past, everything was bundled together and a bug in one area could delay the entire release. Now, components like software tools, libraries, and boot files are managed independently. By breaking down the release this way, we've eliminated unnecessary interdependencies. Each component can be developed, tested, and released on its own schedule, leading to faster iteration and reduced risk. For each software component, Debian packages are created as a release artifact. After that, they're uploaded to our Linux package repository. By using standard Debian tools, we've simplified distribution and made it easier for users to install or roll back software packages. But one of the most significant steps we've taken to increase flexibility is the introduction of a modular configuration file. This file allows users to build custom images by selecting the specific tools they need. And even specifying the version of those components. For instance, If you're working on a project that requires a specific library version, you can specify that in the configuration file before build. Additionally, we've made it easy to introduce new components or additional dependencies. With the help of an extra script, users can add other compatible tools. This approach not only makes the release process more modular, but also gives users the freedom to craft their ideas. images with their exact requirements, ensuring that no unnecessary components are included. Now, to improve reliability and compatibility, we've implemented our robust testing process that works at two levels. First, each component is tested individually to ensure its stand alone functionality. This allows us to quickly catch and address issues specific to that component. Second, the components are tested as part of the full Kuiper image, but with a twist. We've introduced lighter Docker images that are built with the specific dependencies required for each component. These Docker images replicate the Kuiper environment during the development process. By testing within this controlled environment, We can, we can ensure early compatibility with the final system. This approach allows us to catch integration issues during development, rather than later stages, which saves significant time and effort. And if you want to know more about our testing process, my colleagues have two presentations about it at this year's edition of Conf42. Thank you. Bianca is presenting a secure integration of private testing infrastructure with public GitHub repositories. And Stefan's topic is Advanced Test Harness Infrastructure for Validating ARM and FPGA based systems. To optimize our CI pipeline and make the development process more accessible and efficient, we transitioned from Jenkins to GitHub Actions. This move brought several benefits. First, BuildLogs are now openly accessible to all users. increasing transparency. Additionally, fresh build images are automatically generated and made available on GitHub as soon as the commit is merged into the Kuiper repository. This eliminates the need for users to wait for an official release or manually build the image themselves. We've also expanded the build configurations. Previously, we only built a 32 bit full image. Now, we've added support for 64 bit architectures and introduced both basic and full configurations for each architecture. This flexibility ensures that users can choose the image that best suits their needs. To further improve collaboration and code quality, we introduced a pull request template. This provides a consistent structure for a contributor to describe their changes. Additionally, we've implemented the co donors feature in GitHub. This ensures that relevant team members are automatically assigned to review and approve pull requests, speeding up the review process, and maintaining high standards for the code base. These changes make the build process faster, more flexible, and more user friendly. while also encouraging better collaboration among developers. Now, let's take a closer look to the current state of our release process. By using a configuration file, users can now create custom images mapped to their specific requirements. They can select only the components they need, ensuring lightweight and efficient builds. We've also shifted to build each component independently and releasing it as a Debian package. These packages are uploaded to analog devices Linux package repository, which allows for faster and more flexible builds. This change also simplifies updates for users, making, making it easier to install or rollback components as needed. By dividing the release cycles. of individual components, we've ensured that bugs in one component don't block their list for others. This approach simplifies the overall process, minimizes bottlenecks, and increases development efficiency. Now, in the end, thank you all for listening, and if you have any questions regarding the presentation, or if you need more details about it, feel Do not hesitate to contact me on email or LinkedIn. And thank you.
...

Andreea Andrisan

DevOps Engineer @ Analog Devices

Andreea Andrisan's LinkedIn account



Join the community!

Learn for free, join the best tech learning community for a price of a pumpkin latte.

Annual
Monthly
Newsletter
$ 0 /mo

Event notifications, weekly newsletter

Delayed access to all content

Immediate access to Keynotes & Panels

Community
$ 8.34 /mo

Immediate access to all content

Courses, quizes & certificates

Community chats

Join the community (7 day free trial)