#!/bin/sh # This script builds various binary artifacts from a checkout of the docker # source code. # # Requirements: # - The current directory should be a checkout of the docker source code # (http://github.com/dotcloud/docker). Whatever version is checked out # will be built. # - The VERSION file, at the root of the repository, should exist, and # will be used as Docker binary version and package version. # - The hash of the git commit will also be included in the Docker binary, # with the suffix -dirty if the repository isn't clean. # - The script is intented to be run as part of a docker build, as defined # in the Dockerfile at the root of the source. In other words: # DO NOT CALL THIS SCRIPT DIRECTLY. # - The right way to call this script is to invoke "docker build ." from # your checkout of the Docker repository. # # FIXME: break down bundles into sub-scripts # FIXME: create all bundles in a single run for consistency. # If the bundles directory already exists, fail or erase it. set -e # We're a nice, sexy, little shell script, and people might try to run us; # but really, they shouldn't. We want to be in a container! RESOLVCONF=$(readlink --canonicalize /etc/resolv.conf) grep -q "$RESOLVCONF" /proc/mounts || { echo "# I will only run within a container." echo "# Try this instead:" echo "docker build ." exit 1 } VERSION=$(cat ./VERSION) PKGVERSION="$VERSION" GITCOMMIT=$(git rev-parse --short HEAD) if test -n "$(git status --porcelain)" then GITCOMMIT="$GITCOMMIT-dirty" PKGVERSION="$PKGVERSION-$(date +%Y%m%d%H%M%S)-$GITCOMMIT" fi # Use these flags when compiling the tests and final binary LDFLAGS="-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w" PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)" PACKAGE_URL="http://www.docker.io/" PACKAGE_MAINTAINER="docker@dotcloud.com" PACKAGE_DESCRIPTION="lxc-docker is a Linux container runtime Docker complements LXC with a high-level API which operates at the process level. It runs unix processes with strong guarantees of isolation and repeatability across servers. Docker is a great building block for automating distributed systems: large-scale web deployments, database clusters, continuous deployment systems, private PaaS, service-oriented architectures, etc." UPSTART_SCRIPT='description "Docker daemon" start on filesystem and started lxc-net stop on runlevel [!2345] respawn script /usr/bin/docker -d end script ' # Each "bundle" is a different type of build artefact: static binary, Ubuntu # package, etc. # Run Docker's test suite, including sub-packages, and store their output as a bundle bundle_test() { mkdir -p bundles/$VERSION/test { date for test_dir in $(find_test_dirs); do ( set -x cd $test_dir go test -v -ldflags "$LDFLAGS" ) done } 2>&1 | tee bundles/$VERSION/test/test.log } # This helper function walks the current directory looking for directories # holding Go test files, and prints their paths on standard output, one per # line. find_test_dirs() { find . -name '*_test.go' | grep -v '^./vendor' | { while read f; do dirname $f; done; } | sort -u } # Build Docker as a static binary file bundle_binary() { mkdir -p bundles/$VERSION/binary go build -o bundles/$VERSION/binary/docker-$VERSION \ -ldflags "$LDFLAGS" \ ./docker } # Build docker as an ubuntu package using FPM and REPREPRO (sue me). # bundle_binary must be called first. bundle_ubuntu() { mkdir -p bundles/$VERSION/ubuntu DIR=$(pwd)/bundles/$VERSION/ubuntu/build # Generate an upstart config file (ubuntu-specific) mkdir -p $DIR/etc/init echo "$UPSTART_SCRIPT" > $DIR/etc/init/docker.conf # Copy the binary mkdir -p $DIR/usr/bin cp bundles/$VERSION/binary/docker-$VERSION $DIR/usr/bin/docker # Generate postinstall/prerm scripts cat >/tmp/postinstall </tmp/prerm <