Run scripts during snapcraft builds with “scriptlets”

David Callé

David Callé

on 2 February 2017

If you have snapped an application, or tried to snap an application, you know that Snapcraft heavily depends on built-in plugins for specific build systems and that it provides a large array of choices to do so. You can snap ROS apps, Python 2 and 3 apps, Go apps, Rust apps, Java apps, Linux kernels and many more, by simply declaring the right plugin name.

What if your app depends on multiple build systems? Or uses a custom build script, or maybe you want to run make test as part of a snapcraft build? Until recently, you had to write a custom plugin and ship it along your snapcraft.yaml, which was working fine but took time to achieve and made you ship an extra directory just for it. With Snapcraft “scriptlets”, this is over and the path to snapping is now much faster.


Scriptlets are shell scripts, sourced directly from your snapcraft.yaml, that change the behaviour of a plugin. They can be triggered before the “build” step to run commands on your source code before building it, instead of it, to completely override the building behaviour and after: to move build artefacts around, change a config file or anything that you would need to happen after the build.

How to use them

Scriptlets are declared using specific keywords in your snapcraft part:

  • prepare: for commands that need to happen before the build step of a plugin
  • build: to override a plugin’s build step
  • install: for commands that need to happen after the build step

Have a look at the documentation for more details, or see the following examples to get started: a demo of the prepare scriptlet and a real world use case with the MySQL snap.

Demo: add a snap build timestamp with the prepare scriptlet

This asciinema recording shows you how to use the prepare scriptlet to write to a new file and include it in the snap at build time.

Real world use case: MySQL

Let’s see how the MySQL snap uses the prepare: keyword to pull deb packages from their server, unpack and load them into the project directory during a snapcraft build.


If we look at the parts: section of the snapcraft.yaml we can see a mysql-server part, that dumps a pre-built MySQL into the snap.

    prepare: ./
    build-packages: [libaio-dev, libmecab-dev, libnuma-dev, libncurses5-dev, zlib1g-dev]
    plugin: dump
    source: ./
      staging-files/usr: usr/
      - usr/lib/mysql/plugin/
      - usr/lib/mysql/plugin/
      - usr/lib/mysql/plugin/
      - usr/bin/my_print_defaults
      - usr/bin/mysqldump
      - usr/bin/mysql_tzinfo_to_sql
      - usr/bin/mysql_upgrade
      - usr/share/mysql/*

The script called at the prepare stage is

SNAPTMP=$(mktemp -d)
tar -xvf "${FILENAME}" 
ar x mysql-community-client_${MYSQL_VERSION_FULL}_amd64.deb
tar -xvf data.tar.xz
rm data.tar.xz
ar x mysql-community-server_${MYSQL_VERSION_FULL}_amd64.deb
tar -xvf data.tar.xz
mkdir staging-files
mv usr staging-files/
rm -rf ${SNAPDIR}/staging-files
mv staging-files ${SNAPDIR}

It uses wget to download mysql debian packages, unpack them and copy their content into the current directory.

Once this prepare script is run, the dump plugin proceeds as usual: taking content from the source and including it in the final snap.

Without this scriptlet, there would have been a need for a custom plugin or several other parts that would have increased the complexity of the snapcraft.yaml.

More examples

You will find usage snippets on the scriptlets page at and in the snapcraft test suite:

Ubuntu desktop

Learn how the Ubuntu desktop operating system powers millions of PCs and laptops around the world.

Sign up for email updates

Choose the topics you're interested in


Related posts

Ora as a snap: ensuring users are benefiting from the latest version

Ora is a user-friendly task management service with integrated time-tracking, reports, list view, git integrations and many other features. Often referred to by users as ‘the sweet spot between Trello and Jira’, Ora provides almost a…

Eclipse 2018 survey: The IoT landscape, what it empirically looks like

Every year the Eclipse Foundation along with other sponsors conduct an online survey of the IoT market looking at what technologies are being used and how. The 2018 edition of that survey has just been made available and I thought it would…

The Nextcloud Box: a review of building an IoT device with snaps

In 2016, Canonical, Nextcloud and WDLabs introduced the Nextcloud Box, the first IoT style device running with snaps out of the box. Besides sales of nearly 2K boxes before Western Digital shut down their research division WDLabs late last…