Categories
SysOps

How to build package using directory structure and custom metadata

The simplest possible way to create a Debian package is to use defined package metadata and prepared target directory structure.

Create a package directory.

$ mkdir /tmp/personal-script_0.1_all

Create package metadata.

$ mkdir -p /tmp/personal-script_0.1_all/DEBIAN
$ cat << EOF | tee /tmp/personal-script_0.1_all/DEBIAN/control
Package: personal-script
Architecture: all
Depends: debconf, bash
Version: 0.1
Maintainer: Milosz <milosz@example.org>
Homepage: https://example.org
Priority: optional
Description: personal shell script
 personal shell script with configuration
EOF
$ cat << EOF | tee /tmp/personal-script_0.1_all/DEBIAN/conffiles
/usr/local/etc/personal-script.cfg
EOF

Create a target directory structure and files.

$ mkdir -p /tmp/personal-script_0.1_all/usr/local/bin/
$ mkdir -p /tmp/personal-script_0.1_all/usr/local/etc
$ cat << EOF | tee /tmp/personal-script_0.1_all/usr/local/etc/personal-script.cfg
# configuration file
message="my message"
EOF

$ cat << EOF | tee /tmp/personal-script_0.1_all/usr/local/bin/personal-script.sh
#!/bin/bash
# shell script
source /usr/local/etc/personal-script.cfg
echo "My message is \${message}"
EOF

Set the target owner and permissions.

$ sudo chown -R root:root /tmp/personal-script_0.1_all
$ sudo chmod 755 /tmp/personal-script_0.1_all/usr/local/bin/personal-script.sh
$ sudo chmod 644 /tmp/personal-script_0.1_all/usr/local/etc/personal-script.cfg

Build package.

$ dpkg-deb --build /tmp/personal-script_0.1_all /tmp

Verify package contents and metadata.

$ dpkg --contents  /tmp/personal-script_0.1_all.deb
drwxrwxr-x root/root         0 2017-11-27 23:25 ./
drwxrwxr-x root/root         0 2017-11-27 23:25 ./usr/
drwxrwxr-x root/root         0 2017-11-27 23:25 ./usr/local/
drwxrwxr-x root/root         0 2017-11-27 23:26 ./usr/local/etc/
-rw-r--r-- root/root        42 2017-11-27 23:26 ./usr/local/etc/personal-script.cfg
drwxrwxr-x root/root         0 2017-11-27 23:26 ./usr/local/bin/
-rwxr-xr-x root/root       101 2017-11-27 23:26 ./usr/local/bin/personal-script.sh
$ dpkg --info /tmp/personal-script_0.1_all.deb
 new debian package, version 2.0.
 size 892 bytes: control archive=344 bytes.
      35 bytes,     1 lines      conffiles
     245 bytes,     9 lines      control
 Package: personal-script
 Architecture: all
 Depends: debconf, bash
 Version: 0.1
 Maintainer: Milosz <milosz@example.org>
 Homepage: https://example.org
 Priority: optional
 Description: personal shell script
  personal shell script with configuration

Install the package on the target system.

$ sudo dpkg --install /tmp/personal-script_0.1_all.deb
Selecting previously unselected package personal-script.
(Reading database ... 35902 files and directories currently installed.)
Preparing to unpack .../personal-script_0.1_all.deb ...
Unpacking personal-script (0.1) ...
Setting up personal-script (0.1) ...
$ personal-script.sh
My message is my message

Additional information

Debian New Maintainers’ Guide