testing, issue #1766: Upgrade tooling for Docker nightly release

This commit is contained in:
Daniel Mizyrycki 2013-09-19 16:09:12 -07:00 committed by Daniel Mizyrycki
parent 1dcdc3deb7
commit fac190959f
8 changed files with 73 additions and 80 deletions

View File

@ -52,18 +52,5 @@ nighthly release
================ ================
The nightly release process is done by buildbot, running a DinD container that downloads The nightly release process is done by buildbot, running a DinD container that downloads
the docker repository and builds the release container. The resulting the docker repository and builds the release container. The resulting docker
docker binary is then tested, and if everything is fine the release is done. binary is then tested, and if everything is fine, the release is done.
Building the release DinD Container
-----------------------------------
# Log into docker-ci
ssh ubuntu@docker-ci.dotcloud.com
cd /data/docker/testing/nightlyrelease
# Add release_credentials.json as specified in ./Dockerfile
cat > release_credentials.json << EOF
EOF
sudo docker build -t dockerbuilder .
# Now that the container is built release_credentials.json is not needed anymore
git checkout release_credentials.json

28
testing/Vagrantfile vendored
View File

@ -4,7 +4,7 @@
BOX_NAME = "docker-ci" BOX_NAME = "docker-ci"
BOX_URI = "http://files.vagrantup.com/precise64.box" BOX_URI = "http://files.vagrantup.com/precise64.box"
AWS_AMI = "ami-d0f89fb9" AWS_AMI = "ami-d0f89fb9"
DOCKER_PATH = "/data/docker" DOCKER_PATH = "/go/src/github.com/dotcloud/docker"
CFG_PATH = "#{DOCKER_PATH}/testing/buildbot" CFG_PATH = "#{DOCKER_PATH}/testing/buildbot"
on_vbox = File.file?("#{File.dirname(__FILE__)}/.vagrant/machines/default/virtualbox/id") | \ on_vbox = File.file?("#{File.dirname(__FILE__)}/.vagrant/machines/default/virtualbox/id") | \
Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty? & \ Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty? & \
@ -18,9 +18,9 @@ Vagrant::Config.run do |config|
config.vm.forward_port 8010, 8010 config.vm.forward_port 8010, 8010
config.vm.share_folder "v-data", DOCKER_PATH, "#{File.dirname(__FILE__)}/.." config.vm.share_folder "v-data", DOCKER_PATH, "#{File.dirname(__FILE__)}/.."
# Deploy buildbot and its dependencies if it was not done # Deploy buildbot and its dependencies if it was not done
if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty? if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty?
# Add memory limitation capabilities # Add memory limitation capabilities
pkg_cmd = 'sed -Ei \'s/^(GRUB_CMDLINE_LINUX_DEFAULT)=.+/\\1="cgroup_enable=memory swapaccount=1 quiet"/\' /etc/default/grub; ' pkg_cmd = 'sed -Ei \'s/^(GRUB_CMDLINE_LINUX_DEFAULT)=.+/\\1="cgroup_enable=memory swapaccount=1 quiet"/\' /etc/default/grub; '
# Install new kernel # Install new kernel
@ -31,36 +31,33 @@ Vagrant::Config.run do |config|
"dpkg-reconfigure --frontend noninteractive tzdata; " \ "dpkg-reconfigure --frontend noninteractive tzdata; " \
"apt-get install -q -y python-dev python-pip supervisor; " \ "apt-get install -q -y python-dev python-pip supervisor; " \
"pip install -r #{CFG_PATH}/requirements.txt; " \ "pip install -r #{CFG_PATH}/requirements.txt; " \
"chown #{USER}.#{USER} /data; cd /data; " \ "mkdir /data; chown #{USER}.#{USER} /data; cd /data; " \
"#{CFG_PATH}/setup.sh #{USER} #{CFG_PATH} #{ENV['BUILDBOT_PWD']} " \ "#{CFG_PATH}/setup.sh #{USER} #{CFG_PATH} #{ENV['BUILDBOT_PWD']} " \
"#{ENV['IRC_PWD']} #{ENV['IRC_CHANNEL']} #{ENV['SMTP_USER']} " \ "#{ENV['IRC_PWD']} #{ENV['IRC_CHANNEL']} #{ENV['SMTP_USER']} " \
"#{ENV['SMTP_PWD']} #{ENV['EMAIL_RCP']}; " \ "#{ENV['SMTP_PWD']} #{ENV['EMAIL_RCP']}; " \
"#{CFG_PATH}/setup_credentials.sh #{USER} " \ "#{CFG_PATH}/setup_credentials.sh #{USER} " \
"#{ENV['REGISTRY_USER']} #{ENV['REGISTRY_PWD']}; " "#{ENV['REGISTRY_USER']} #{ENV['REGISTRY_PWD']}; "
# Install docker # Install docker
pkg_cmd << "mkdir /mnt/docker; ln -s /mnt/docker /var/lib/docker; " \ pkg_cmd << "mkdir /mnt/docker; ln -s /mnt/docker /var/lib/docker; " \
"wget -q -O - https://get.docker.io/gpg | apt-key add -; " \ "wget -q -O - https://get.docker.io/gpg | apt-key add -; " \
"echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list; " \ "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list; " \
"apt-get update -qq; apt-get install -yq lxc-docker; " "apt-get update -qq; apt-get install -yq lxc-docker; "
# Enable docker host to run docker daemon in containers (dind)
pkg_cmd << "/sbin/stop docker; "
pkg_cmd << "DIND_CMD=\" umount /sys/fs/cgroup/*; umount /sys/fs/cgroup\\n" \
" mount -t tmpfs none /sys/fs/cgroup; cd /sys/fs/cgroup\\n" \
" for C in \x5C\x24(awk '{print \x5C\x241}' < /proc/cgroups | grep -v subsys | grep -v memory);\\n" \
" do mkdir \x5C\x24C; mount -t cgroup none -o \x5C\x24C \x5C\x24C; done;\\n" \
" /usr/bin/docker -d\"; "
pkg_cmd << "sed -Ei 's~start on filesystem.+~start on filesystem and started lxc-net~' /etc/init/docker.conf; "
pkg_cmd << "sed -Ei 's~ /usr/bin/docker -d~'\"$DIND_CMD\"'~' /etc/init/docker.conf; "
# Install testing dependencies # Install testing dependencies
pkg_cmd << "curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | " \ pkg_cmd << "wget -O go.tgz http://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz; " \
" tar -v -C /usr/local -xz; ln -s /usr/local/go/bin/go /usr/bin/go; " \ " tar -C /usr/local -vxzf go.tgz; ln -s /usr/local/go/bin/go /usr/bin/go; " \
"curl -s https://phantomjs.googlecode.com/files/phantomjs-1.9.1-linux-x86_64.tar.bz2 | " \ "curl -s https://phantomjs.googlecode.com/files/phantomjs-1.9.1-linux-x86_64.tar.bz2 | " \
" tar jx -C /usr/bin --strip-components=2 phantomjs-1.9.1-linux-x86_64/bin/phantomjs; " \ " tar jx -C /usr/bin --strip-components=2 phantomjs-1.9.1-linux-x86_64/bin/phantomjs; " \
"DEBIAN_FRONTEND=noninteractive apt-get install -qy lxc git mercurial aufs-tools " \ "DEBIAN_FRONTEND=noninteractive apt-get install -qy lxc git mercurial aufs-tools " \
" make libfontconfig libevent-dev; " \ " make libfontconfig libevent-dev; " \
"export GOPATH=/data/docker-dependencies; go get -d github.com/dotcloud/docker; " \ "export GOPATH=/data/docker-dependencies; go get -d github.com/dotcloud/docker; " \
"rm -rf ${GOPATH}/src/github.com/dotcloud/docker; " "rm -rf ${GOPATH}/src/github.com/dotcloud/docker; "
# Activate new kernel options
# After reboot, build containers and prepare docker to run on dind
pkg_cmd << "cp #{DOCKER_PATH}/testing/buildbot/dockerci_local.sh /etc/rc.local; " \
# Activate new kernel
pkg_cmd << "shutdown -r +1; " pkg_cmd << "shutdown -r +1; "
config.vm.provision :shell, :inline => pkg_cmd config.vm.provision :shell, :inline => pkg_cmd
end end
@ -68,6 +65,7 @@ end
# Providers were added on Vagrant >= 1.1.0 # Providers were added on Vagrant >= 1.1.0
Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config| Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
config.vm.box = "dummy"
config.vm.provider :aws do |aws, override| config.vm.provider :aws do |aws, override|
aws.tags = { 'Name' => 'docker-ci' } aws.tags = { 'Name' => 'docker-ci' }
aws.access_key_id = ENV["AWS_ACCESS_KEY_ID"] aws.access_key_id = ENV["AWS_ACCESS_KEY_ID"]

View File

@ -0,0 +1,15 @@
#!/bin/sh -e
# This is a one time script to prepare docker-ci
# Build docker nightly release container
cd /go/src/github.com/dotcloud/docker/testing/nightlyrelease; docker build -t dockerbuilder .
# Relaunch docker for dind to work (disabling apparmor)
/sbin/stop docker
DIND_CMD=" /etc/init.d/apparmor stop; /etc/init.d/apparmor teardown; /usr/bin/docker -dns=8.8.8.8 -d"
sed -Ei "s~ /usr/bin/docker -d~$DIND_CMD~" /etc/init/docker.conf
/sbin/start docker
# Self removing
echo -e '#!/bin/sh -e\nexit 0\n' > /etc/rc.local
exit 0

View File

@ -20,7 +20,7 @@ TEST_PWD = 'docker' # Credential to authenticate build triggers
BUILDER_NAME = 'docker' BUILDER_NAME = 'docker'
GITHUB_DOCKER = 'github.com/dotcloud/docker' GITHUB_DOCKER = 'github.com/dotcloud/docker'
BUILDBOT_PATH = '/data/buildbot' BUILDBOT_PATH = '/data/buildbot'
DOCKER_PATH = '/data/docker' DOCKER_PATH = '/go/src/github.com/dotcloud/docker'
BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME) BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME)
PULL_REQUEST_PATH = '/data/buildbot/slave/pullrequest/build' PULL_REQUEST_PATH = '/data/buildbot/slave/pullrequest/build'
@ -52,8 +52,8 @@ c['schedulers'] += [SingleBranchScheduler(name="all",
c['schedulers'] += [SingleBranchScheduler(name='pullrequest', c['schedulers'] += [SingleBranchScheduler(name='pullrequest',
change_filter=filter.ChangeFilter(category='github_pullrequest'), treeStableTimer=None, change_filter=filter.ChangeFilter(category='github_pullrequest'), treeStableTimer=None,
builderNames=['pullrequest'])] builderNames=['pullrequest'])]
c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['coverage','nightlyrelease'], c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['nightlyrelease'],
hour=0, minute=30)] hour=7, minute=00)]
c['schedulers'] += [Nightly(name='every4hrs', branch=None, builderNames=['registry','index'], c['schedulers'] += [Nightly(name='every4hrs', branch=None, builderNames=['registry','index'],
hour=range(0,24,4), minute=15)] hour=range(0,24,4), minute=15)]
@ -110,8 +110,8 @@ c['builders'] += [BuilderConfig(name='index',slavenames=['buildworker'],
factory=factory)] factory=factory)]
# Docker nightly release # Docker nightly release
nightlyrelease_cmd = ('docker run -i -t -privileged -lxc-conf="lxc.aa_profile = unconfined"' nightlyrelease_cmd = ('docker run -i -t -privileged -lxc-conf=lxc.aa_profile=unconfined'
' -e AWS_S3_BUCKET="test.docker.io" dockerbuilder') ' -e AWS_S3_BUCKET=test.docker.io dockerbuilder')
factory = BuildFactory() factory = BuildFactory()
factory.addStep(ShellCommand(description='NightlyRelease',logEnviron=False,usePTY=True, factory.addStep(ShellCommand(description='NightlyRelease',logEnviron=False,usePTY=True,
command=nightlyrelease_cmd)) command=nightlyrelease_cmd))

View File

@ -13,7 +13,6 @@ SMTP_USER=$6
SMTP_PWD=$7 SMTP_PWD=$7
EMAIL_RCP=$8 EMAIL_RCP=$8
BUILDBOT_PATH="/data/buildbot" BUILDBOT_PATH="/data/buildbot"
DOCKER_PATH="/data/docker"
SLAVE_NAME="buildworker" SLAVE_NAME="buildworker"
SLAVE_SOCKET="localhost:9989" SLAVE_SOCKET="localhost:9989"
export PATH="/bin:sbin:/usr/bin:/usr/sbin:/usr/local/bin" export PATH="/bin:sbin:/usr/bin:/usr/sbin:/usr/local/bin"

View File

@ -8,7 +8,7 @@ REGISTRY_USER=$2
REGISTRY_PWD=$3 REGISTRY_PWD=$3
BUILDBOT_PATH="/data/buildbot" BUILDBOT_PATH="/data/buildbot"
DOCKER_PATH="/data/docker" DOCKER_PATH="/go/src/github.com/dotcloud/docker"
function run { su $USER -c "$1"; } function run { su $USER -c "$1"; }

View File

@ -1,5 +1,5 @@
# VERSION: 1.0 # VERSION: 1.1
# DOCKER-VERSION 0.6.1 # DOCKER-VERSION 0.6.2
# AUTHOR: Daniel Mizyrycki <daniel@dotcloud.com> # AUTHOR: Daniel Mizyrycki <daniel@dotcloud.com>
# DESCRIPTION: Build docker nightly release using Docker in Docker. # DESCRIPTION: Build docker nightly release using Docker in Docker.
# REFERENCES: This code reuses the excellent implementation of docker in docker # REFERENCES: This code reuses the excellent implementation of docker in docker
@ -10,26 +10,18 @@
# "AWS_SECRET_KEY='Test_docker_AWS_S3_bucket_key' # "AWS_SECRET_KEY='Test_docker_AWS_S3_bucket_key'
# "GPG_PASSPHRASE='Test_docker_GPG_passphrase_signature' # "GPG_PASSPHRASE='Test_docker_GPG_passphrase_signature'
# "INDEX_AUTH='Encripted_index_authentication' } # "INDEX_AUTH='Encripted_index_authentication' }
# When releasing: Docker in Docker requires cgroups mounted the same way in
# the host and containers:
# stop docker
# umount /sys/fs/cgroup/*; umount /sys/fs/cgroup; mount -t tmpfs none /sys/fs/cgroup
# cd /sys/fs/cgroup; for C in $(awk '{print $1}' < /proc/cgroups | grep -v subsys | grep -v memory) ; do mkdir $C ; mount -t cgroup none -o $C $C ; done
# docker -d &
# TO_BUILD: docker build -t dockerbuilder . # TO_BUILD: docker build -t dockerbuilder .
# TO_RELEASE: docker run -i -t -privileged -lxc-conf="lxc.aa_profile = unconfined" -e AWS_S3_BUCKET="test.docker.io" dockerbuilder # TO_RELEASE: docker run -i -t -privileged -lxc-conf="lxc.aa_profile = unconfined" -e AWS_S3_BUCKET="test.docker.io" dockerbuilder
from ubuntu:12.04 from ubuntu:12.04
maintainer Daniel Mizyrycki <daniel@dotcloud.com> maintainer Daniel Mizyrycki <daniel@dotcloud.com>
# Add docker dependencies # Add docker dependencies and downloading packages
run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list
run apt-get update; apt-get install -y -q iptables ca-certificates bzip2 python lxc curl git mercurial run apt-get update; apt-get install -y -q lxc bzip2 iptables ca-certificates git wget python2.7
run curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | tar -v -C /usr/local -xz
run ln -s /usr/local/go/bin/go /usr/bin
# Add production docker binary # Add production docker binary
run curl http://get.docker.io/builds/Linux/x86_64/docker-latest >/usr/bin/docker; chmod +x /usr/bin/docker run wget -O /usr/bin/docker http://get.docker.io/builds/Linux/x86_64/docker-latest; chmod +x /usr/bin/docker
# Add proto docker builder # Add proto docker builder
add ./dockerbuild /usr/bin/dockerbuild add ./dockerbuild /usr/bin/dockerbuild
@ -38,9 +30,8 @@ run chmod +x /usr/bin/dockerbuild
# Add release credentials # Add release credentials
add ./release_credentials.json /root/release_credentials.json add ./release_credentials.json /root/release_credentials.json
# Make /tmp and /var/lib/docker inside the container addressable by other containers. # Make /var/lib/docker inside the container addressable by other containers.
# This is done to ensure /tmp and /var/lib/docker has AUFS support needed by the inner docker server # This is done to ensure /var/lib/docker has AUFS support needed by the inner docker server
volume /tmp
volume /var/lib/docker volume /var/lib/docker
# Launch build process in a container # Launch build process in a container

View File

@ -1,41 +1,34 @@
#!/bin/bash #!/bin/bash
# Variables AWS_ACCESS_KEY, AWS_SECRET_KEY, PG_PASSPHRASE and INDEX_AUTH # Variables AWS_ACCESS_KEY, AWS_SECRET_KEY, PG_PASSPHRASE and INDEX_AUTH
# are decoded from /root/release_credentials.json and passed to the environment # are decoded from /root/release_credentials.json
# Variable AWS_S3_BUCKET is passed to the environment from docker run -e # Variable AWS_S3_BUCKET is passed to the environment from docker run -e
# Enable debugging # Enable debugging
set -x set -x
# Prepare container environment to run docker in docker # Fetch docker master branch
# Mount cgroups git clone http://github.com/dotcloud/docker /go/src/github.com/dotcloud/docker
mount -t tmpfs none /tmp; mount -t tmpfs none /sys/fs/cgroup; cd /sys/fs/cgroup
for C in $(awk "{print \$1}" < /proc/cgroups | grep -v subsys | grep -v memory) ; do mkdir $C ; mount -t cgroup none -o $C $C ; done
pushd /proc/self/fd >/dev/null; for FD in *; do case "$FD" in [012]) ;; *) eval exec "$FD>&-" ;; esac done; popd >/dev/null
# Launch docker daemon inside the container
docker -d &
# fetch docker master branch
export GOPATH=/go
rm -rf $GOPATH; mkdir -p $GOPATH
go get -d github.com/dotcloud/docker
cd /go/src/github.com/dotcloud/docker cd /go/src/github.com/dotcloud/docker
# Launch docker daemon using dind inside the container
./hack/dind /usr/bin/docker -dns=8.8.8.8 -d &
sleep 5
# Add an uncommitted change to generate a timestamped release # Add an uncommitted change to generate a timestamped release
date > timestamp date > timestamp
# Build the docker package and extract docker binary # Build the docker package using /Dockerfile
docker build -t releasedocker . docker build -t docker .
docker run releasedocker sh -c 'cat /go/src/github.com/dotcloud/docker/bundles/*/binary/docker*' >/docker
chmod +x /docker
# Swap docker production daemon with new docker binary for testing # Run Docker unittests
kill $(pgrep '^docker$') docker run -privileged docker go test -v || exit 1
sleep 15
mv /docker /usr/bin # Create Docker binary and Ubuntu package
docker -d & docker run -privileged docker hack/make.sh binary ubuntu
sleep 15
# Freeze the container to upload the release
docker commit -run '{"Env": ["PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"], "WorkingDir": "/go/src/github.com/dotcloud/docker"}' $(docker ps -l -q) release
# Turn debug off to load credentials in the environment and # Turn debug off to load credentials in the environment and
# to authenticate to the index # to authenticate to the index
@ -47,7 +40,17 @@ exec("""for k in d: print "export {0}=\\"{1}\\"".format(k,d[k])""")')
echo '{"https://index.docker.io/v1/":{"auth":"'$INDEX_AUTH'","email":"engineering@dotcloud.com"}}' > /.dockercfg echo '{"https://index.docker.io/v1/":{"auth":"'$INDEX_AUTH'","email":"engineering@dotcloud.com"}}' > /.dockercfg
set -x set -x
# Test docker nightly # Extract docker binary
docker cp $(docker ps -l -q):/go/src/github.com/dotcloud/docker/bundles /tmp
# Swap docker production daemon with new docker binary for testing
kill $(pgrep '^docker$')
sleep 15
cp /tmp/bundles/*/binary/* /usr/bin/docker
./hack/dind /usr/bin/docker -dns=8.8.8.8 -d &
sleep 15
# Run Docker functional tests
# Generate unique image name # Generate unique image name
export DIMAGE=testimage`date +'%Y%m%d%H%M%S'` export DIMAGE=testimage`date +'%Y%m%d%H%M%S'`
@ -66,6 +69,6 @@ docker push test/$DIMAGE
docker search $DIMAGE | grep -q $DIMAGE || exit 1 docker search $DIMAGE | grep -q $DIMAGE || exit 1
# Push docker nightly # Push docker nightly
echo docker run -i -t -e AWS_S3_BUCKET="$AWS_S3_BUCKET" -e AWS_ACCESS_KEY="XXXXX" -e AWS_SECRET_KEY="XXXXX" -e GPG_PASSPHRASE="XXXXX" releasedocker echo docker run -i -t -privileged -e AWS_S3_BUCKET=$AWS_S3_BUCKET -e AWS_ACCESS_KEY=XXXXX -e AWS_SECRET_KEY=XXXXX -e GPG_PASSPHRASE=XXXXX release hack/release.sh
set +x set +x
docker run -i -t -e AWS_S3_BUCKET="$AWS_S3_BUCKET" -e AWS_ACCESS_KEY="$AWS_ACCESS_KEY" -e AWS_SECRET_KEY="$AWS_SECRET_KEY" -e GPG_PASSPHRASE="$GPG_PASSPHRASE" releasedocker docker run -i -t -privileged -e AWS_S3_BUCKET=$AWS_S3_BUCKET -e AWS_ACCESS_KEY=$AWS_ACCESS_KEY -e AWS_SECRET_KEY=$AWS_SECRET_KEY -e GPG_PASSPHRASE=$GPG_PASSPHRASE release hack/release.sh