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:
- --arch=architecture
- 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.
- --dist=distribution
- 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 squeeze) 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.
It is now also possible to use locally defined names with this
option, when used in conjunction with the BASE_DIST option in a
configuration file. This permits the maintenance and use of specially
configured build chroots, which can source package dependencies from the
backports archives or a local repository, or have other unusual
configuration options set, without polluting the chroots you use for
clean package builds intended for upload to the main repositories. See
the description of BASE_DIST below.
- --buildd=host
- Specify the remote host to build on.
- --buildd-user=name
- Specify the remote user to build as.
- --create
- 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
expected location.
The --buildd-user must have permission to create the
RESULT_DIR on the build host, or an admin with the necessary
permission must first create it and give that user (or some group they
are in) write access to it, for this option to succeed.
- --return=[path]
- Copy results of the build to path. If path is not specified,
then return them to the current directory. The given path must
exist, it will not be created.
- --no-return
- Do not copy results of the build to RETURN_DIR (overriding a path
set for it in the configuration files).
- --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 pbuilderrc.
- --create-opts='cowbuilder option'
- Specify additional arguments to be passed verbatim to cowbuilder
when a chroot is first created (using the --create option above).
If multiple arguments need to be passed, this option should be specified
separately for each of them.
E.g., --create-opts "--othermirror" --create-opts
"deb http:// ..."
This option will override any CREATE_OPTS specified for
a chroot in the cowpoke configuration files.
- --update-opts='cowbuilder
option'
- Specify additional arguments to be passed verbatim to cowbuilder if
the base of the chroot is updated. If multiple arguments need to be
passed, this option should be specified separately for each of them.
This option will override any UPDATE_OPTS specified for
a chroot in the cowpoke configuration files.
- --build-opts='cowbuilder
option'
- Specify additional arguments to be passed verbatim to cowbuilder
when a package build is performed. If multiple arguments need to be
passed, this option should be specified separately for each of them.
This option will override any BUILD_OPTS specified for
a chroot in the cowpoke configuration files.
- --sign=keyid
- Specify the key to sign packages with. This will override any
SIGN_KEYID specified for a chroot in the cowpoke configuration
files.
- --upload=queue
- Specify the dput queue to upload signed packages to. This will override
any UPLOAD_QUEUE specified for a chroot in the cowpoke
configuration files.
- --help
- Display a brief summary of the available options and current
configuration.
- --version
- 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.
- BUILDD_HOST
- The network address or fqdn of the build machine where cowbuilder
is configured. This may be overridden by the --buildd command line
option.
- BUILDD_USER
- 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 configuration for
BUILDD_HOST), and may be overridden by the --buildd-user
command line option.
- BUILDD_ARCH
- 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.
- BUILDD_DIST
- 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.
- INCOMING_DIR
- The directory path on the build machine where the source package will
initially be placed. This must be writable by the BUILDD_USER.
- PBUILDER_BASE
- 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.
- SIGN_KEYID
- 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. It may be overridden on an arch and
dist specific basis using the
arch_dist_SIGN_KEYID option described below,
or per-invocation with the --sign command line option.
- UPLOAD_QUEUE
- 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. It may be overridden on
an arch and dist specific basis using the
arch_dist_UPLOAD_QUEUE option described below,
or per-invocation with the --upload command line option.
- BUILDD_ROOTCMD
- 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. Using su -c isn't really
suitable here due to its quoting requirements being somewhat different to
the rest.
- DEBOOTSTRAP
- The utility to use when creating a new build root. Alternatives are
debootstrap or cdebootstrap.
- RETURN_DIR
- If set, package files resulting from the build will be copied to the path
(local or remote) that this is set to, after the build completes. The path
must exist, it will not be created. This option is unset by default and
can be overridden with --return or --no-return.
These are variables of the form: $arch_$dist_VAR which
apply only for a particular target arch/dist build.
- arch_dist_RESULT_DIR
- 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
$PBUILDER_BASE/$arch/$dist/result
- arch_dist_BASE_PATH
- 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
- arch_dist_BASE_DIST
- The code name to pass as the --distribution option for cowbuilder
instead of dist. This is necessary when dist is a locally
significant name assigned to some specially configured build chroot, such
as 'wheezy_backports', and not the formal suite name of a distro release
known to debootstrap. This option cannot be overridden on the command
line, since it would rarely, if ever, make any sense to change it for
individual invocations of cowpoke. If this option is not specified
for an arch and dist combination then it will default to dist.
- arch_dist_CREATE_OPTS
- A bash array containing additional options to pass verbatim to
cowbuilder when this chroot is created for the first time (using
the --create option). This is useful when options like
--othermirror are wanted to create specialised chroot
configurations such as 'wheezy_backports'. By default this is unset. All
values set in it will be overridden if the --create-opts option is
passed on the command line.
Each element in this array corresponds to a single argument
(in the ARGV sense) that will be passed to cowbuilder. This ensures that
arguments which may contain whitespace or have strange quoting
requirements or other special characters will not be mangled before they
get to cowbuilder.
Bash arrays are initialised using the following form:
OPTS=( "arg1" "arg 2" "--option"
"value" "--opt=val" "etc. etc." )
- arch_dist_UPDATE_OPTS
- A bash array containing additional options to pass verbatim to
cowbuilder each time the base of this chroot is updated. It behaves
similarly to the CREATE_OPTS option above, except for acting when
the chroot is updated.
- arch_dist_BUILD_OPTS
- A bash array containing additional options to pass verbatim to
cowbuilder each time a package build is performed in this chroot.
This is useful when you want to use some option like --twice which
cowpoke does not directly need to care about. It otherwise behaves
similarly to UPDATE_OPTS above except that it acts during the build
phase of cowbuilder.
- arch_dist_SIGN_KEYID
- An optional arch and dist specific override for the global
SIGN_KEYID option.
- arch_dist_UPLOAD_QUEUE
- An optional arch and dist specific override for the global
UPLOAD_QUEUE option.
- /etc/cowpoke.conf
- Global configuration options. Will override hardcoded defaults.
- ~/.cowpoke
- Per-user configuration options. Will override any global
configuration.
- .cowpoke
- 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 additional 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. If
rsync(1) is available on both the local and build machine, then it
will be used to transfer the source package (this may save on some transfers
of the orig.tar.* when building subsequent Debian revisions).
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 executes cowpoke.
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 uncommitted work.
cowbuilder(1), pbuilder(1), ssh-agent(1),
sudoers(5)
cowpoke was written by Ron
<ron@debian.org>.