I actually wanted to move on with the node-red series of blog posts, but noticed that there is something more pressing to write down first …
People (on the snapcraft.io forum or IRC) often ask about “how would i build a package for Ubuntu Core” …
If your Ubuntu Core device is i.e. a Raspberry Pi you won’t easily be able to build for its armhf or arm64 target architecture on your PC which makes development harder.
You can use the snapcraft.io auto-build service that builds for all supported arches automatically or use fabrica but if you want to iterate fast over your code, waiting for the auto-builds is quite time consuming. Others i heard of simply have two SD cards in use, one running classic Ubuntu Server and the second one running Ubuntu Core so you can switch them around to test your code on Core after building on Server … Not really ideal either and if you do not have two Raspberry Pis this ends in a lot reboots, eating your development time.
There is help !
There is an easy way to do your development on Ubuntu Core by simply using an LXD container directly on the device … you can make code changes and quickly build inside the container, pull the created snap package out of your build container and install it on the Ubuntu Core host without any reboots or waiting for remote build services, just take a look at the following recipe of steps:
1) Grab an Ubuntu Core image from the stable channel, run through the setup wizard to set up user and network and ssh into the device:
$ grep Model /proc/cpuinfo Model : Raspberry Pi 3 Model B Plus Rev 1.3 $ grep PRETTY /etc/os-release PRETTY_NAME="Ubuntu Core 18" $
2) Install lxd on the device and set up a container targeting the release that your snapcraft.yaml defines in the
base: entry (i.e.
base: core -> 16.04,
base: core18 -> 18.04,
base: core20 -> 20.04):
$ snap install lxd $ sudo lxd init --auto $ sudo lxc launch ubuntu:18.04 bionic Creating bionic Starting bionic $
3) Enter the container with the
lxc shell command, install the snapcraft snap, clone your tree and edit/build your code:
$ sudo lxc shell bionic root@bionic:~# snap install snapcraft --classic ... root@bionic:~# git clone https://github.com/ogra1/htpdate-daemon-snap.git root@bionic:~# cd htpdate-daemon-snap/ ... make any edits you want here ... root@bionic:~/htpdate-daemon-snap# snapcraft --destructive-mode ... Snapped 'htpdate-daemon_1.2.2_armhf.snap' root@bionic:~/htpdate-daemon-snap#
4) Exit the container, pull the snap file you built and install it with the –dangerous flag
root@bionic:~/htpdate-daemon-snap# exit logout $ sudo lxc file pull bionic/root/htpdate-daemon-snap/htpdate-daemon_1.2.2_armhf.snap . $ snap install --dangerous htpdate-daemon_1.2.2_armhf.snap htpdate-daemon 1.2.2 installed $
This is it … for each new iteration you can just enter the container again, make your edits, build, pull and install the snap.
(One additional Note: if you want to avoid having to use
sudo with all the
lxc calls above, add your username to the end of the line reading
lxd:x:999: in the