Building packages on Jenkins with pbuilder

pbuilder is the Debian build system for production packages. It uses a chroot environment to compile binary packages from source packages on a fresh Debian system.

pbuilder is installed on the x86 and x86-64 Linux Jenkin slaves. To use it you must have a Debian source package mypackage.dsc and upstream's tarball, then you would for example use this command to compile for Debian Stretch amd64:

DIST=stretch ARCH=amd64 sudo pbuilder build --buildresult $PWD *.dsc

This will put the resulting binary packages in the current working directory. If your package depends on other packages not present in the Debian archive, you must copy them to /opt/pbuilder-local-repo/repo before the build.

You can see example source package setups for qtox/libtoxcore here https://github.com/tux3/tox-pkgs

You can also see example source package setups for toxic, along with some helper scripts for mass setup of builds and tar commands here https://github.com/optimumtact/tox-pkgs

The source packages are ingested into pbuilder and it spits out nicely linked binary packages for shipping to the package server, this means you can do per distro versioning and other useful crud

Making Debian source packages

How to make a cheap ass poor man's home-rolled package

Use this skeleton script for your deb package.

#!/bin/bash -e
 
## Needful things
 
# Compute Installed-Size.
# It sums up the byte size of the directory tree given, then returns
# kilos.
# ex:
#     $ size_of_tree package/
size_of_tree() {
    python3 - "$1" <<EOF
import os, sys
gs = lambda p: os.stat(p).st_size
ctr, i = 0, 1
try:
    for d, dn, fn in os.walk(sys.argv[1]):
        if i:
            i = 0
            dn.remove("DEBIAN")
        for f in fn:
            ctr += gs(os.path.join(d, f))
    print(ctr // 1000)
except:
    print("???")
EOF
}
 
# Compute a md5sums control file.
# It uses recursion to walk the paths given to it in argv.
# ex:
#     $ md5_walk_dir package/usr package/etc
md5_walk_dir() {
    while (( "$#" )); do
        for file in $1/*; do
            if [[ $(basename $file) == "DEBIAN" ]]; then
                true
            elif [[ -d $file ]]; then
                md5_walk_dir "$file"
            elif [[ -f $file ]]; then
                echo "$(md5sum $file | cut -d " " -f 1)  $file"
            fi
        done
 
        shift
    done
}
 
## clean up from last time
rm *.deb || true
rm -rf package || true
rm -rf src || true
 
# PACKAGE_INFO? see https://wiki.tox.chat/developers/jenkins/packaging/about#package_info_file
set -a
source PACKAGE_INFO
set +a
 
mkdir -p package/DEBIAN
 
## Set up your package's files here.
## "package/" acts as the filesystem root.
 
INSTALLED_SIZE=$(size_of_tree package)
PACKAGE_VERS="$VERSION-$(echo $GIT_REF | cut -c 1-7)"
PACKAGE_NAME="$PROGRAM_NAME-$ARCH-$PACKAGE_VERS.deb"
 
## Change these to your liking. Be aware that shell expansion will happen here.
## For a literal $, use \$.
> package/DEBIAN/control cat <<EOF
Package: $PROGRAM_NAME
Version: $PACKAGE_VERS
License: GPLv3+
Vendor: The Tox Project
Architecture: $ARCH
Maintainer: My Name <my_email@mydomain.tld>
Installed-Size: $INSTALLED_SIZE
Depends: < Dependencies go here, if you have any. >
Conflicts: < Packages that you conflict with, if any. >
Section: default
Priority: extra
Homepage: https://tox.chat
Description: The best Tox client.
EOF
 
md5_walk_dir package/* >> package/DEBIAN/md5sums
fakeroot dpkg-deb -b package && mv package.deb "$PACKAGE_NAME"
echo "$PACKAGE_NAME ready."
Print/export