Snapcraft offline mode – Build snaps while saving data
by Igor Ljubuncic on 12 November 2021
As part of the snap creation cycle, the Snapcraft tool creates isolated build instances inside which all of the necessary work – download of sources, compilation, packaging, etc. – is done in a safe manner, without touching the host system. While there are many advantages to the use of the virtual machines (via Multipass) or containers (via LXD) for these tasks, the downside is a fairly liberal use of the network bandwidth to setup and configure the Snapcraft work environment.
In some scenarios, you may be constrained in your available network throughput or data. To help with that, the latest build of Snapcraft comes with a new, experimental offline mode, designed to minimize the reliance on online sources, and allow you to continue working and building snaps even if you have no access to the network.
To run Snapcraft in the offline mode, simply pass the –offline flag to the Snapcraft command-line tool. However, there are a few important things to take into consideration first.
- Snapcraft cannot magically spawn the necessary data out of nothing. It needs the initial pull of the relevant sources, including the build images (say Ubuntu 18.04 or Ubuntu 20.04 container images), the sources for your software, any additional build or stage packages that will be used, and other assets that your application relies on.
- To get the necessary data for subsequent offline runs, run snapcraft pull. This will download the assets once and cache them for later use.
Now, with or without the network connection, you can run Snapcraft in the offline mode. It will rely on the downloaded data for the build, and will not try to contact the online archives and grab any new packages. The final objective is to allow users to be able to iterate on their builds without consuming additional data.
On the other hand, if you discover you rely on new components that do not exist in your cache, you may have to re-run Snapcraft in its standard (online) mode again at some point. You will also not receive any updates or patches to libraries (depending on how long you stay in the offline mode).
I tried to build a snap that uses the core20 base. The initial download weighed 143 MB. After that, Snapcraft did not use or download any new sources. I was then able to make modifications to the snapcraft.yaml file and build the snap. Of course, these changes did not rely on additional data from the Internet.
Launching a VM.
2021-11-10T12:30:13Z INFO Waiting for automatic snapd restart…
snapd 2.52.1 from Canonical✓ installed
core20 20210928 from Canonical✓ installed
"core20" switched to the "latest/stable" channel
snapcraft 6.0 from Canonical✓ installed
"snapcraft" switched to the "latest/edge" channel
snapd is not logged in, snap install commands will use sudo
snap "core20" has no updates available
+ snapcraftctl pull
snapcraft --use-lxd --offline
*EXPERIMENTAL* --offline enabled.
Launching a container.
Waiting for container to be ready
*EXPERIMENTAL* --offline enabled.
Offline mode, not installing build packages.
You can also always try to use the –offline mode while connected to the network. In the current experimental implementation, Snapcraft may make some assumptions for you, and may perform an initial download & cache of relevant data on first run even if you do not manually specify the pull command.
The offline mode is a handy addition to the arsenal of capabilities available in Snapcraft, and it should help with scenarios where data usage should be as low as possible. The functionality is still in experimental mode, so if you’d like to test it, or have any ideas or suggestions, or if you find any bugs, please tell us in the forum. For instance, you might want to know if cached data can be reused across systems, how to perform partial updates of online sources, or similar. We welcome feedback, and we’re interested in learning more about how we can further simplify and enhance the developer experience with Snapcraft.