Implementing snap hooks

Snaps can implement hooks for different events, for instance:

  • configure

  • install

  • pre-refresh

  • post-refresh

Hooks are executable files placed under $SNAP/snap/hooks/, and are executed without parameters.

snap-helpers provides some tooling to reduce boilerplate when writing hooks. It can automatically install hook scripts for the snap it’s being built in.

The snapped application can specify hook functions via entry-points in package metadata, under the snaphelpers.hook key.

For instance, in pyproject.toml:

[project.entry-points."snaphelpers.hooks"]
configure = "testapp:configure_hook"
install = "testapp:install_hook"

will allow registering functions for the configure and install hooks. These functions are called with a Snap instance as argument:

def install_hook(snap: snaphelpers.Snap) -> None:
    ...


def configure_hook(snap: snaphelpers.Snap) -> None:
    ...

Setting up hooks during snap build

The library provides a snap-helpers command which can be used during snap builds to generate the hook scripts.

All that’s needed is calling snap-helpers write-hooks as part of the application build process in the snap.

The tool looks up Python packages installed in the snap that define snaphelper.hooks, and creates hook scripts under $SNAP/snap/hooks for each one of them.

The application part just needs to override-build to call snap-helpers to set up hooks:

parts:
  my-app:
    plugin: python
    # .. other part configurations
    python-packages:
      - snap-helpers
      # ... other dependencies
    override-build: |
      craftctl default  # perform the regular build process
      snap-helpers write-hooks

For a complete example, see the snap-helpers-testapp part in the snap definition under the test-snap/ directory.