enhanced build in docker

This commit is contained in:
Marc Wäckerlin
2015-12-02 15:58:50 +00:00
parent 26f7fa543b
commit 4c467c73a2
4 changed files with 174 additions and 40 deletions

45
README
View File

@@ -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:

View File

@@ -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");;

View File

@@ -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"
DOCKER_ID=$(docker run -d -v $(pwd):/workdir -w /workdir ubuntu sleep infinity) repos=()
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT keys=()
docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev envs=()
docker exec ${DOCKER_ID} apt-add-repository universe dirs=("-v $(pwd):/workdir")
docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository packages=()
wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \ targets="all check distcheck"
| docker exec -i ${DOCKER_ID} apt-key add - commands=()
if test -n "$*"; then if test -e ./build-in-docker.conf; then
for p in $*; do # you can preconfigure the variables in file build-in-docker.conf
docker exec ${DOCKER_ID} apt-add-repository $p # if you do so, add the file to EXTRA_DIST in makefile.am
done source ./build-in-docker.conf
fi 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 ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity)
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT
docker exec ${DOCKER_ID} apt-get update docker exec ${DOCKER_ID} apt-get update
docker exec ${DOCKER_ID} apt-get upgrade -y --force-yes
if ! docker exec ${DOCKER_ID} apt-get install -y --force-yes python-software-properties apt-transport-https dpkg-dev lsb-release; then
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 -
done
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}"

View File

@@ -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