There are several options for packaging NodeJS applications like debian packages, docker images, standalone executables like nexe, and many others.
If our NodeJS application will run only on Linux-based operation systems for example Debian, Fedora, Ubuntu, etc. we can also package our NodeJS application as snap and publish it to the snapstore.
For the repository: Github
Photo by Gabriel Heinzer on Unsplash
Snapcraft is a packaging and deployment system that is developed by canonical for the systems which use Linux kernel and systemd init system.
Table of Contents
Open Table of Contents
1. Creating the Project and the Git Repository
git init
npm init -y
Create the Entrypoint main.js
#!/usr/bin/env node
function helloSnap() {
console.log("This is my first NodeJS snap application.");
}
helloSnap();
Update the package.json
...
"bin": {
"hello-snap": "main.js"
},
"main": "main.js",
...
2. Creating the Snap Definition File
Snaps are defined in the snap/snapcraft.yaml
file which is relative to the project root directory.
---
name: hello-snap
version: git
summary: My first package to snapstore.
description: |
Run with:-
$ hello-snap
confinement: strict
base: core20
apps:
hello-snap:
command: bin/hello-snap
parts:
hello-snap:
plugin: npm
npm-node-version: 14.16.1
source: .
Explanation of the Definition
metadata
defines the meta-information about the package for the snapstore.
name: hello-snap # Must be unique in snap store lower-case alphanumeric characters and hyphens
version: git # Current git commit can be used as version string
summary: My first package to snapstore. # maximum 79 characters
description: |
Run with:-
$ hello-snap
base
specifies the base snap for the use which is Ubuntu 20.04 in our example.
base: core20
See also: Base snaps
confinement
specifies the confinement level of application:
confinement: strict
Snaps are containerized for better security. confinement
defines the authorities of the application:
- strict — No access to the application excluding plug interfaces. The application cannot access the system resources like network, storage, and processes if explicitly not requested using interfaces.
- classic — The application can use system resources like any other application in the system.
- devmode — No restriction. If the devmode is specified the application cannot be released to the stable channel.
See also: Snap confinement
apps
keyword defines commands and services that our application exposes. command
is the full path to our binary. command
path is relative to the snap content:
apps:
hello-snap:
command: bin/hello-snap
parts
specifies sources that are required to assemble our application:
parts:
hello-snap:
plugin: npm
npm-node-version: 14.16.1
source: .
With the npm
plugin the dependencies of our application are automatically installed. npm-node-version
selects the NodeJS version to bundle with our application.
See also: Snapcraft NPM Plugin
3. Building the Snap
git add .
git commit -am "initial commit"
snapcraft
Note: Since we are using git
as the version in the metadata, the project
should be a git repository, and at least one commit is required to
create a version.
There should be ahello-snap_*.snap
file after the build in the root directory if the build succeeds.
Installing the Snap
sudo snap install hello-snap_*.snap --dangerous
We are defining the --dangerous
parameter because our snap is not signed from the snapstore.
Removing the Snap
sudo snap remove hello-snap
Clearing the Build Environment
snapcraft clean
Publishing our Application to the Snapstore
Login to the Snapstore
snapcraft login
Reserve name from the Snapstore
snapcraft register hello-snap
Upload our Snap
snapcraft upload --release=edge hello-snap_*.snap
We are selecting the edge
channel for the release. We can also select the
stable
channel with --release=stable
. For more information about releases:
Release Management
Thanks for reading…
For the repository: Github