cowpoke - Build a Debian source package in a remote cowbuilder instance
cowpoke [options] packagename.dsc
Uploads a Debian source package to a cowbuilder host and builds it,
optionally also signing and uploading the result to an incoming queue.
The following options are available:
Specify the Debian architecture(s) to build for. A space
separated list of architectures may be used to build for all of
them in a single pass. Valid arch names are those returned by
dpkg-architecture(1) for DEB_BUILD_ARCH.
Specify the Debian distribution(s) to build for. A space
separated list of distributions may be used to build for all of
them in a single pass. Either codenames (such as sid, or lenny)
or distribution names (such as unstable, or experimental) may be
used, but you should usually stick to using one or the other
consistently as this name may be used in file paths and to
locate old packages for comparison reporting.
Specify the remote host to build on.
Specify the remote user to build as.
Create the remote cowbuilder root if it does not already exist.
If this option is not passed it is an error for the specified
--dist or --arch to not have an existing cowbuilder root in the
--dpkg-opts='opt1 opt2 ...'
Specify additional options to be passed to dpkg-buildpackage(1).
Multiple options are delimited with spaces. This will override
any options specified in DEBBUILDOPTS in the build host's
--help Display a brief summary of the available options and current
Display the current version information.
When cowpoke is run the following configuration options are read from
global, per-user, and per-project configuration files if present. File
paths may be absolute or relative, the latter being relative to the
BUILDD_USER's home directory. Since the paths are typically quoted
when used, tilde expansion will not be performed on them.
These apply to every arch and dist in a single cowpoke invocation.
The network address or fqdn of the build machine where
cowbuilder is configured. This may be overridden by the
--buildd command line option.
The unprivileged user name for operations on the build machine.
This defaults to the local name of the user executing cowpoke
(or to a username that is specified in your ssh config for
BUILDD_HOST), and may be overridden by the --buildd-user command
The Debian architecture(s) to build for. This must match the
DEB_BUILD_ARCH of the build chroot being used. It defaults to
the local machine architecture where cowpoke is executed, and
may be overridden by the --arch command line option. A (quoted)
space separated list of architectures may be used here to build
for all of them in a single pass.
The Debian distribution(s) to build for. A (quoted) space
separated list of distributions may be used to build for all of
them in a single pass. This may be overridden by the --dist
command line option.
The directory path on the build machine where the source package
will initially be placed. This must be writable by the
The filesystem root for all pbuilder COW and result files. Arch
and dist specific subdirectories will normally be created under
this. The apt cache and temporary build directory will also be
located under this path.
If this option is set, it is expected to contain the gpg key id
to pass to debsign(1) if the packages are to be remotely signed.
You will be prompted to confirm whether you wish to sign the
packages after all builds are complete. If this option is unset
or an empty string, no attempt to sign packages will be made.
If this option is set, it is expected to contain a 'host'
specification for dput(1) which will be used to upload them
after they are signed. You will be prompted to confirm whether
you wish to upload the packages after they are signed. If this
option is unset or an empty string, no attempt to upload
packages will be made. If SIGN_KEYID is not set, this option
will be ignored entirely.
The command to use to gain root privileges on the remote build
machine. If unset the default is sudo(8). This is only
required to invoke cowbuilder and allow it to enter its chroot,
so you may restrict this user to only being able to run that
command with escalated privileges. Something like this in
sudoers will enable invoking cowbuilder without an additional
password entry required:
youruser ALL = NOPASSWD: /usr/sbin/cowbuilder
Alternatively you could use ssh with a forwarded key, or
whatever other mechanism suits your local access policy. su -c
isn't really suitable here due to its quoting requirements being
different from all the rest.
The utility to use when creating a new build root. Alternatives
are debootstrap or cdebootstrap.
Arch and dist specific options
These are variables of the form: $arch_$dist_VAR which apply only for a
particular target arch/dist build.
The directory path on the build machine where the resulting
packages (source and binary) will be found, and where older
versions of the package that were built previously may be found.
If any such older packages exist, debdiff will be used to
compare the new package with the previous version after the
build is complete, and the result will be included in the build
log. Files in it must be readable by the BUILDD_USER for sanity
checking with lintian(1) and debdiff(1), and for upload with
dput(1). If this option is not specified for some arch and dist
combination then it will default to
The directory where the COW master files are to be found (or
created if the --create command line option was passed). If
this option is not specified for some arch or dist then it will
default to $PBUILDER_BASE/$arch/$dist/base.cow
Global configuration options. Will override hardcoded defaults.
Per-user configuration options. Will override any global
Per-project configuration options. Will override any per-user
or global configuration if cowpoke is called from the directory
where they exist.
If the environment variable COWPOKE_CONF is set, it specifies an
addtional configuration file which will override all of those
above. Options specified explicitly on the command line
override all configuration files.
There is nothing particularly special required to configure a
cowbuilder instance for use with cowpoke. Simply create them in the
flavour you require with `cowbuilder --create` according to the
cowbuilder documentation, then configure cowpoke with the user, arch,
and path information required to access it, on the machines you wish to
invoke it from (or alternatively configure cowpoke with the path, arch
and distribution information and pass the --create option to it on the
first invocation). The build host running cowbuilder does not require
cowpoke installed locally.
The build machine should have the lintian and devscripts packages
installed for post-build sanity checking. Upon completion, the build
log and the results of automated checks will be recorded in the
INCOMING_DIR. If you wish to upload signed packages the build machine
will also need dput(1) installed and configured to use the 'host' alias
specified by UPLOAD_QUEUE.
The user executing cowpoke must have ssh access to the build machine as
the BUILDD_USER. That user must be able to invoke cowbuilder as root
by using the BUILDD_ROOTCMD. Signing keys are not required to be
installed on the build machine (and will be ignored there if they are).
If the package is signed, keys will be expected on the machine that
When cowpoke is invoked, it will first attempt to update the cowbuilder
image if that has not already been done on the same day. This is
checked by the presence or absence of a cowbuilder-$arch-$dist-update-
log-$date file in the INCOMING_DIR. You may move, remove, or touch
this file if you wish the image to be updated more or less often than
that. Its contents log the output of cowbuilder during the update (or
creation) of the build root.
Since cowbuilder creates a chroot, and to do that you need root,
cowpoke also requires some degree of root access. So all the horrible
things that can go wrong with that may well one day rain down upon you.
cowbuilder has been known to accidentally wipe out bind-mounted
filesystems outside the chroot, and worse than that can easily happen.
So be careful, keep good backups of things you don't want to lose on
your build machine, and use cowpoke to keep all that on a machine that
isn't your bleeding edge dev box with your last few hours of
cowbuilder(1), pbuilder(1), ssh-agent(1), sudoers(5).
cowpoke was written by Ron <firstname.lastname@example.org>.
April 28, 2008