Fuze Overview

What is Fuze?

Fuze is an enterprise level tool for automating build, release, and configuration management of embedded software builds and all related digital assets, including (but not limited to):

  • Software/Firmware/Tools (source and object code)

  • Digital Files (ie, documentation, schematics, PCB files, RTL, etc)

  • Test Results

_images/fuze-overview.png

Fuze is a Painkiller and Lubricator

Fuze is a painkiller and lubricator that solves three big embedded software challenges:

_images/fuze-problems.png

Solving Build Inconsisitencies and Toolchain Configuration Management

An age-old problem for embedded software developers is maintenance of the cross-compile toolchain. Windows or linux? Local build versus production server? My build versus your build? How do we make this work at 11pm on Friday night?

Fuze solves this problem with the Common Build Enviornment, which guarantees that all local and cloud builders use the exact same build machine.

_images/fuze-worksforme.png

Solving The “Who Gets What?” and “Who Has What?” problem

Embedded software occupies an unique space in the paradigm of software versioning and delivery. You have multiple versions of your code spread out across multiple product lines and customers, usually in multiple stages of development.

You need a way to track who has what, who gets what, and what version you sent. Fuze solves that problem by fully automating the configuration mangement of your code, starting with the build and continuing through delivery.

_images/fuze-whohaswhat.png

Solving The “I need to recreate the release from 4 months ago” Problem

Once you’ve launched a version into the wild, you naturally move on. Your code base moves on, your feature-set moves on, and your toolchain might move on.

But then the customer comes back and says they need a point-release to address a specific bug in a specific module. No, they cannot take your latest HEAD because that will reset the test and certification process. Just fix this bug on this line of code, please.

Fuze solves that problem through automated configuration management of the entire build and package process, including the toolchain and all build dependencies. Tell Fuze to recreate the workspace from that build, and you’ll have it within a few seconds. You can now create a binary-identical build.

_images/fuze-recreate.png

Questions Answered by Fuze

Fuze answers the following questions:

  • What did we send to Customer A?

  • How do I build version X?

  • It builds for me locally, why doesn’t it build for you?

  • How can I recreate and debug version Y?

  • How do I release the code I’ve tested?

  • How do I promote our release through various stages of testing?

  • How do we release particular version Z to Customer A?

  • What is the current status of build X?

  • What were the test results for build X?

One ID to Rule Them All

Fuze is built around the concept of automated universal configuration management, which is realized via a unique FuzeID. Fuze automatically generates and assigns a FuzeID for all builds, and some other operations, that occur within a Fuze workspace.

_images/fuze-fuzeid.png

Knowing this unique FuzeID allows a user to:

  • Fully recreate the environment for that FuzeID on his/her local system, including the source code, package repo, and common build environment commitID’s that were used to generate that FuzeID

  • Easily obtain all packages that are associated with that FuzeID

  • Trace a deliverable

  • Promote a build to another level of testing or to a release

  • Uniquely version and identify any digital asset

Who Should Use Fuze?

Fuze should be used by the following:

  • software developers

  • documentation developers

  • any engineer or developer creating digital assets

  • release managers

  • QA

  • AE

  • FAE

  • Sales engineers

What Does Fuze Do For Me?

We’ve loosely defined 4 user groups for Fuze.

Developer

_images/fuze-developer.png
  • Build with production env locally (no local tools necessary)​

  • All local and cloud builds can be release candidates​

  • Recreate source tree for a particular build

  • Dependency download without build​

  • Share and integrate easily​

  • Recreate prior release or build​

  • Easily get other builds​

  • Customize package contents​

  • Customize build workflow​

  • Search for previous builds/releases

Verification, Validation, and Quality Assurance

_images/fuze-vandv.png
  • Search for release/builds ​

  • Easily get release packages​

  • Easily get test builds​

  • Fully automated release testing

Product Manager

_images/fuze-pm.png
  • Automated release with full configuration management​

  • Define and automate release packages​

  • Deliver to customer or vendor

  • Search for releases/deliveries​

  • Deploy to manufacturing​

  • Security

Customer Interface

_images/fuze-ci.png
  • Share/Deliver to customer automatically​

  • Prototype or demo with full config managements​

  • Recreate delivery in < 60 seconds​

  • Search for previous deliveries

  • Security

How Do I Use Fuze?

Fuze has 3 UI’s:

  1. Command line (Windows, Linux, MacOS)

  2. FuzeUI (Web-based UI)

  3. SlackUI (Slack command line application)

Command line

All Fuze functionality except Delivery is available from the command line. The command line UI is required for:

  • Building and packaging

  • Creating and getting workspaces

  • Adding packages to existing FuzeID

FuzeUI

The following functions are available in the FuzeUI:

  • Searching

  • Getting packages

  • Determining and getting dependencies

  • Seeing all metadata associated with a FuzeID

  • Adding files to existing FuzeID

  • Creating and promoting releases (including kicking off release automations)

  • Delivering releases

  • Downloading the “Containerized Fuze” command script to work locally

  • Execute a wizard to generate a workspace.ini file.

SlackUI

The SlackUI can be used for the following actions:

  • Searching

  • Getting packages

  • Notification and viewing of builds and releases - All Fuze builds and release events are posted to Slack channels (fuze-builds and fuze-releases)

Fuze as the Build and Packaging Tool

Although Fuze is a universal configuration management tool with many generic applications, its main purpose is to automate the configuration management of software. Software can refer to any digital asset that is created through a “build” process, such as:

  • Embedded and host-side software applications

  • Software source packages

  • Rendered documentation from a markup source language

  • Applications and executables from tools such as matlab

When you build with Fuze, the Fuze ecosystem creates and retains all interesting metadata associated with the source and the build itself.

The following sections describe Fuze’s place in both the cloud build and local development environments.

Fuze’s Place in the Cloud Build Ecosystem

Fuze is not a CI/CD tool. It is meant to sit between the Cloud CI/CD tool (such as Bamboo, Jenkins, etc) and the underlying build tools and scripts. It adds the configuration management layer that is missing from both the CI/CD and the Build layers.

The following shows where Fuze exists in the CI/CD build ecosystem:

_images/fuze-ci-tool.png

The CI/CD tools invokes the build with Fuze, and Fuze performs the underlying build by calling the low-level build system. Fuze also contains an interface in which it can call the CI/CD tool as well, which leads to further automation possibilities, such as automated testing and release workflows.

The line between Fuze and the Build Tools is slightly fuzzy, because Fuze presents a generic, low-level command interface for build commands. Therefore, Fuze could function as a “make” replacement and call the compiler and linker directly. Fuze could also be completely abstracted away from the low-level build commands and call a script or build framework that does everything related to build.

Guidance on how to design the interface between Fuze and the underlying build system is provided in the [build reference guide].

Fuze’s Place in the Developer’s Local Build Ecosystem

Speed and quality are our ultimate goals as an organization.

One pillar of helping a development organization go faster is to break down the barriers of formality in process. Another pillar is to reduce the number of places in a workflow where errors, and hence delays, can occur. Fuze helps both of these.

Traditionally, development and release process is put in place in order to ensure the quality of a given release. When used by the development team as part of their daily activity, Fuze helps break down the barriers of the formal release process by ensuring that ALL developer builds are potentially suitable for integration and release. Since Fuze guarantees the traceability and configuration management of all builds, and promotes the socialization.

The developer’s local environment is a sacred and highly customized space. Building locally with Fuze is not required nor meant to violate that space. But when Fuze is used to build locally during the development and debug cycle, then all of the benefits of socialization, traceability, reproducibility, and configuration management come naturally.

Typical Development Through Release Workflow

In a traditional development workflow, a developer builds on his/her host machine with some tool such as make, an IDE, or some set of build scripts or framework. The development cycle continues until he/she thinks the code base is ready for integration (if necessary) or formal testing.

For either integration or formal testing, a new build must be produced in the respective environment (ie, another developer’s local environment, or cloud production environment, etc). Each point in the process that requires a new build is a place for potential failure , required debugging , and the slowing down of the process .

_images/dev-workflow-nofuze.png

The developer or product manager creates a release package just before or just after formal testing. This package must be placed under configuration management in order to ensure it’s traceability and availability. Even with rock solid configuration management, there is still the very real risk that a particular release cannot be reproduced locally if a future need arises.

Development Through Release Workflow With Developers Building Locally With Fuze

If Fuze is used as part of the normal workflow of the developers, the yellow boxes in the above typical workflow diagram can be eliminated. Building with Fuze ensures the build is production ready, and puts all packages under configuration management at all times (when directed).

Fuze allows the developers and the organization to be “always ready” to release any given build.

_images/dev-workflow-fuze.png

All Fuze builds takes place in the production environment, which eliminates the scenario whereby a product builds locally for a particular developer, but won’t build on another developer’s system or the production environment. It also guarantees that any build (even local builds) can be 100% reproduced in the future.

Fuze Technologies and Concepts

Fuze utilizes the following technologies and concepts:

  • Fuze is written in Python (v3) and build maps are JSON format for cross platform portability.

  • FuzeUI is written in Javascript

  • All build commands (from the build map) are performed in a Common Build Environment (CBE). CBE’s are docker containers, which ensure a fully managed, reproducible, and cross-platform build environment for all Fuze builds.

  • Source repositories (git), object/package repositories, and CBE repositories (docker hub) are utilized to ensure versioning and traceability.

  • Unique FuzeID’s are generated with a combination of fields to satisfy both human readable and uniqueness aspects.

  • Fuze can be used without internet connectivity, with a few pre-requisites.

  • Packages can be deployed to customer portals or via email.

The following provides a high level view of the Fuze technology ecosystem:

_images/fuze-functions.png