enhanced build in docker

master
Marc Wäckerlin 9 years ago
parent 26f7fa543b
commit 4c467c73a2
  1. 45
      README
  2. 7
      scripts/bootstrap.sh
  3. 142
      scripts/build-in-docker.sh
  4. 4
      scripts/resolve-debbuilddeps.sh

@ -1,5 +1,27 @@
Simplify Your Project Build Environment
bootstrap-build-environment Automake and Autoconf based build environment that especially supports and preconfigures:
- C++ including:
- QT (without qmake, just using the AutoTools)
- LibTool
- Library dependencies
- CPP-Unit
- PKG-Config dependency file
- Doxygen for documentation
- Scripts
- HTML / Web projects
- Examples
- Tests
- Debian packaging
- RPM packaging
- Mac OSX App Bundle creation
- Subversion
- SQL to Doxygen schema documentation
- Build in Docker
- Resolve package dependencies
- ...
Makefiles and other files are generated automatically, necessary build and dependency rules are automatically added. There are no redundancies. This reduces extremely the size of your configuration. The whole build system becomes extremely simple, lean and smart.
Simply setup a new project: Simply setup a new project:
1. create a subversion basic tree 1. create a subversion basic tree
@ -14,27 +36,14 @@ Simply setup a new project:
10. your project is setup and compilable, test: ./bootstrap.sh -b 10. your project is setup and compilable, test: ./bootstrap.sh -b
Fore more details, see: For more details, see:
./bootstrap.sh -h
Supports and preconfigures: ./bootstrap.sh -h
- C++ including:
- Qt
- Library dependencies
- CPP-Unit
- PKG-Config dependency file
- Doxygen for documentation
- Scripts
- HTML / Web projects
- Examples
- Tests
- Debian packaging
- RPM packaging
- Mac OSX App Bundle creation
Example: Example:
There is a just created empty subversion repository: There is a just created empty subversion repository:
https://dev.marc.waeckerlin.org/svn/project-name https://dev.marc.waeckerlin.org/svn/project-name
Setup a basic project: Setup a basic project:
@ -46,7 +55,7 @@ Setup a basic project:
The file AUTHORS is already correct due to my gnupg setup: The file AUTHORS is already correct due to my gnupg setup:
Fistname Lastname (https://my.homepage.xyz) <me@mysite.xyz> Firstname Lastname (https://my.homepage.xyz) <me@mysite.xyz>
Edit the file README, I add the following lines: Edit the file README, I add the following lines:

@ -20,7 +20,7 @@ DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}
configure=0 configure=0
build=0 build=0
docker=0 docker=0
buildtarget="distcheck" buildtarget=""
overwrite=0 overwrite=0
rebuild=0 rebuild=0
rebuildfiles=() rebuildfiles=()
@ -28,8 +28,9 @@ while test $# -gt 0; do
case "$1" in case "$1" in
(--configure|-c) configure=1;; (--configure|-c) configure=1;;
(--docker|-d) docker=1;; (--docker|-d) docker=1;;
(--build|-b) configure=1; build=1;; (--build|-b) configure=1; build=1; buildtarget+=" distcheck";;
(--target|-t) shift; configure=1; build=1; buildtarget="$1";; (--target|-t) shift; configure=1; build=1; buildtarget+=" $1";;
(--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";;
(--overwrite|-o) overwrite=1;; (--overwrite|-o) overwrite=1;;
(--rebuild|-r) rebuild=1;; (--rebuild|-r) rebuild=1;;
(--rebuild-file|-f) shift; rebuildfiles+=("$1");; (--rebuild-file|-f) shift; rebuildfiles+=("$1");;

@ -1,20 +1,140 @@
#! /bin/bash -ex #! /bin/bash -e
# build and test everything in a fresh docker installation # build and test everything in a fresh docker installation
img="ubuntu:latest"
repos=()
keys=()
envs=()
dirs=("-v $(pwd):/workdir")
packages=()
targets="all check distcheck"
commands=()
if test -e ./build-in-docker.conf; then
# you can preconfigure the variables in file build-in-docker.conf
# if you do so, add the file to EXTRA_DIST in makefile.am
source ./build-in-docker.conf
fi
while test $# -gt 0; do
case "$1" in
(-h|--help)
echo "$0 [OPTIONS]"
echo
echo "OPTIONS:"
echo
echo " -h, --help show this help"
echo " -i, --image <image> use given docker image instead of ${img}"
echo " -t, --targets targets specify build targets, default: ${targets}"
echo " -r, --repo <url> add given apt repository"
echo " -k, --key <url> add public key from url"
echo " -e, --env <var>=<val> set environment variable in docker"
echo " -d, --dir <dir> access given directory read only"
echo " -p, --package <pkg> install extra debian packages"
echo " -c, --cmd <command> execute commands as root in docker"
echo
echo " The options -r -k -e -d -p -c can be repeated several times."
echo
echo " The options -r -p -c allow an if-then-else contruct"
echo " depending on the operating system:"
echo " <os>:::<A>:::<B>"
echo " <os>:::<A>"
echo " Read as: On linux type <os> use <A> else use <B>"
echo " That means: If the distributer ID or codename in lsb_release"
echo " matches <os>, then <A> is replaced, else <B> is replaced."
echo " The three colons are for splitting <os> from <A> and <B> part."
echo " E.g.: Install package curl on wheezy and npm on olter systems:"
echo " $0 -p wheezy:::curl:::npm"
echo
echo "EXAMPLE:"
echo
echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\"
echo " -t deb \\"
echo " -e ANDROID_HOME=/opt/local/android \\"
echo " -d /opt/local/android \\"
echo " -r universe \\"
echo " -r https://dev.marc.waeckerlin.org/repository \\"
echo " -k https://dev.marc.waeckerlin.org/repository/PublicKey \\"
echo " -p mrw-c++"
echo
exit 0
;;
(-i|--image) shift;
img="$1"
;;
(-t|--targets) shift;
targets="$1"
;;
(-r|--repo) shift;
repos+=("$1")
;;
(-k|--key) shift;
keys+=("$1")
;;
(-e|--env) shift;
envs+=("-e $1")
;;
(-d|--dirs) shift;
dirs+=("-v $1:$1:ro")
;;
(-p|--package) shift;
packages+=("$1")
;;
(-c|--cmd) shift;
commands+=("$1")
;;
(*)
echo "**** ERROR: unknown option '$1', try --help" 1>&2
exit 1
;;
esac
if test $# -eq 0; then
echo "**** ERROR: missing value, try --help" 2>61
exit 1
fi
shift
done
function ifthenelse() {
arg="$1"
shift
cmd="$*"
if test "${arg/:::/}" = "${arg}"; then
docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}"
else
os="${arg%%:::*}"
thenpart="${arg#*:::}"
if test "${thenpart/:::/}" = "${thenpart}"; then
docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if test "${os//$(lsb_release -is)/}${os//$(lsb_release -cs)/}" != "${os}${os}"; then '"${cmd//ARG/${thenpart}}"'; fi'
else
elsepart="${thenpart##*:::}"
thenpart="${thenpart%:::*}"
docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if test "${os//$(lsb_release -is)/}${os//$(lsb_release -cs)/}" != "${os}${os}"; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi'
fi
fi
}
set -x
DOCKER_ID=$(docker run -d -v $(pwd):/workdir -w /workdir ubuntu sleep infinity) DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity)
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT
docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev docker exec ${DOCKER_ID} apt-get update
docker exec ${DOCKER_ID} apt-add-repository universe docker exec ${DOCKER_ID} apt-get upgrade -y --force-yes
docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository if ! docker exec ${DOCKER_ID} apt-get install -y --force-yes python-software-properties apt-transport-https dpkg-dev lsb-release; then
wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \ docker exec ${DOCKER_ID} apt-get install -y --force-yes software-properties-common apt-transport-https dpkg-dev lsb-release
fi
for repo in "${repos[@]}"; do
ifthenelse "${repo}" "apt-add-repository ARG"
done
for key in "${keys[@]}"; do
wget -O- \
| docker exec -i ${DOCKER_ID} apt-key add - | docker exec -i ${DOCKER_ID} apt-key add -
if test -n "$*"; then
for p in $*; do
docker exec ${DOCKER_ID} apt-add-repository $p
done done
fi
docker exec ${DOCKER_ID} apt-get update docker exec ${DOCKER_ID} apt-get update
for package in "${packages[@]}"; do
ifthenelse "${package}" "apt-get install -y --force-yes ARG"
done
for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG"
done
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh
docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "all check distcheck" docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}"

@ -16,8 +16,12 @@ if test -n "${SCHROOTNAME}"; then
SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --"
else else
DO="" DO=""
if grep -q '/docker/' /proc/1/cgroup; then
SUDO=""
else
SUDO="sudo" SUDO="sudo"
fi fi
fi
function install() { function install() {
if ${SUDO} apt-get -y install $*; then if ${SUDO} apt-get -y install $*; then

Loading…
Cancel
Save