182 lines
5.3 KiB
Bash
Executable file
182 lines
5.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# This script looks for bundles built by make.sh, and releases them on a
|
|
# public S3 bucket.
|
|
#
|
|
# Bundles should be available for the VERSION string passed as argument.
|
|
#
|
|
# The correct way to call this script is inside a container built by the
|
|
# official Dockerfile at the root of the Docker source code. The Dockerfile,
|
|
# make.sh and release.sh should all be from the same source code revision.
|
|
|
|
set -e
|
|
|
|
# Print a usage message and exit.
|
|
usage() {
|
|
cat <<EOF
|
|
To run, I need:
|
|
- to be in a container generated by the Dockerfile at the top of the Docker
|
|
repository;
|
|
- to be provided with the name of an S3 bucket, in environment variable
|
|
AWS_S3_BUCKET;
|
|
- to be provided with AWS credentials for this S3 bucket, in environment
|
|
variables AWS_ACCESS_KEY and AWS_SECRET_KEY;
|
|
- the passphrase to unlock the GPG key which will sign the deb packages
|
|
(passed as environment variable GPG_PASSPHRASE);
|
|
- a generous amount of good will and nice manners.
|
|
The canonical way to run me is to run the image produced by the Dockerfile: e.g.:"
|
|
|
|
docker run -e AWS_S3_BUCKET=get-staging.docker.io \\
|
|
AWS_ACCESS_KEY=AKI1234... \\
|
|
AWS_SECRET_KEY=sEs4mE... \\
|
|
GPG_PASSPHRASE=m0resEs4mE... \\
|
|
f0058411
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
[ "$AWS_S3_BUCKET" ] || usage
|
|
[ "$AWS_ACCESS_KEY" ] || usage
|
|
[ "$AWS_SECRET_KEY" ] || usage
|
|
[ "$GPG_PASSPHRASE" ] || usage
|
|
[ -d /go/src/github.com/dotcloud/docker/ ] || usage
|
|
cd /go/src/github.com/dotcloud/docker/
|
|
|
|
VERSION=$(cat VERSION)
|
|
BUCKET=$AWS_S3_BUCKET
|
|
|
|
setup_s3() {
|
|
# Try creating the bucket. Ignore errors (it might already exist).
|
|
s3cmd mb s3://$BUCKET 2>/dev/null || true
|
|
# Check access to the bucket.
|
|
# s3cmd has no useful exit status, so we cannot check that.
|
|
# Instead, we check if it outputs anything on standard output.
|
|
# (When there are problems, it uses standard error instead.)
|
|
s3cmd info s3://$BUCKET | grep -q .
|
|
# Make the bucket accessible through website endpoints.
|
|
s3cmd ws-create --ws-index index --ws-error error s3://$BUCKET
|
|
}
|
|
|
|
# write_to_s3 uploads the contents of standard input to the specified S3 url.
|
|
write_to_s3() {
|
|
DEST=$1
|
|
F=`mktemp`
|
|
cat > $F
|
|
s3cmd --acl-public put $F $DEST
|
|
rm -f $F
|
|
}
|
|
|
|
s3_url() {
|
|
echo "http://$BUCKET.s3.amazonaws.com"
|
|
}
|
|
|
|
# Upload the 'ubuntu' bundle to S3:
|
|
# 1. A full APT repository is published at $BUCKET/ubuntu/
|
|
# 2. Instructions for using the APT repository are uploaded at $BUCKET/ubuntu/info
|
|
release_ubuntu() {
|
|
# Make sure that we have our keys
|
|
mkdir -p /.gnupg/
|
|
s3cmd sync s3://$BUCKET/ubuntu/.gnupg/ /.gnupg/ || true
|
|
gpg --list-keys releasedocker >/dev/null || {
|
|
gpg --gen-key --batch <<EOF
|
|
Key-Type: RSA
|
|
Key-Length: 2048
|
|
Passphrase: $GPG_PASSPHRASE
|
|
Name-Real: Docker Release Tool
|
|
Name-Email: docker@dotcloud.com
|
|
Name-Comment: releasedocker
|
|
Expire-Date: 0
|
|
%commit
|
|
EOF
|
|
}
|
|
|
|
# Sign our packages
|
|
dpkg-sig -g "--passphrase $GPG_PASSPHRASE" -k releasedocker \
|
|
--sign builder bundles/$VERSION/ubuntu/*.deb
|
|
|
|
# Setup the APT repo
|
|
APTDIR=bundles/$VERSION/ubuntu/apt
|
|
mkdir -p $APTDIR/conf $APTDIR/db
|
|
s3cmd sync s3://$BUCKET/ubuntu/db/ $APTDIR/db/ || true
|
|
cat > $APTDIR/conf/distributions <<EOF
|
|
Codename: docker
|
|
Components: main
|
|
Architectures: amd64 i386
|
|
EOF
|
|
|
|
# Add the DEB package to the APT repo
|
|
DEBFILE=bundles/$VERSION/ubuntu/lxc-docker*.deb
|
|
reprepro -b $APTDIR includedeb docker $DEBFILE
|
|
|
|
# Sign
|
|
for F in $(find $APTDIR -name Release)
|
|
do
|
|
gpg -u releasedocker --passphrase $GPG_PASSPHRASE \
|
|
--armor --sign --detach-sign \
|
|
--output $F.gpg $F
|
|
done
|
|
|
|
# Upload keys
|
|
s3cmd sync /.gnupg/ s3://$BUCKET/ubuntu/.gnupg/
|
|
gpg --armor --export releasedocker > bundles/$VERSION/ubuntu/gpg
|
|
s3cmd --acl-public put bundles/$VERSION/ubuntu/gpg s3://$BUCKET/gpg
|
|
|
|
# Upload repo
|
|
s3cmd --acl-public sync $APTDIR/ s3://$BUCKET/ubuntu/
|
|
cat <<EOF | write_to_s3 s3://$BUCKET/ubuntu/info
|
|
# Add the repository to your APT sources
|
|
echo deb $(s3_url $BUCKET)/ubuntu docker main > /etc/apt/sources.list.d/docker.list
|
|
# Then import the repository key
|
|
curl $(s3_url $BUCKET)/gpg | apt-key add -
|
|
# Install docker
|
|
apt-get update ; apt-get install -y lxc-docker
|
|
EOF
|
|
echo "APT repository uploaded. Instructions available at $(s3_url $BUCKET)/ubuntu/info"
|
|
}
|
|
|
|
# Upload a static binary to S3
|
|
release_binary() {
|
|
[ -e bundles/$VERSION ]
|
|
S3DIR=s3://$BUCKET/builds/Linux/x86_64
|
|
s3cmd --acl-public put bundles/$VERSION/binary/docker-$VERSION $S3DIR/docker-$VERSION
|
|
cat <<EOF | write_to_s3 s3://$BUCKET/builds/info
|
|
# To install, run the following command as root:
|
|
curl -O http://$BUCKET.s3.amazonaws.com/builds/Linux/x86_64/docker-$VERSION && chmod +x docker-$VERSION && sudo mv docker-$VERSION /usr/local/bin/docker
|
|
# Then start docker in daemon mode:
|
|
sudo /usr/local/bin/docker -d
|
|
EOF
|
|
if [ -z "$NOLATEST" ]; then
|
|
echo "Copying docker-$VERSION to docker-latest"
|
|
s3cmd --acl-public cp $S3DIR/docker-$VERSION $S3DIR/docker-latest
|
|
echo "Advertising $VERSION on $BUCKET as most recent version"
|
|
echo $VERSION | write_to_s3 s3://$BUCKET/latest
|
|
fi
|
|
}
|
|
|
|
# Upload the index script
|
|
release_index() {
|
|
(
|
|
if [ "$BUCKET" != "get.docker.io" ]
|
|
then
|
|
sed s,https://get.docker.io/,http://$BUCKET.s3.amazonaws.com/, contrib/install.sh
|
|
else
|
|
cat contrib/install.sh
|
|
fi
|
|
) | write_to_s3 s3://$BUCKET/index
|
|
}
|
|
|
|
release_test() {
|
|
if [ -e "bundles/$VERSION/test" ]; then
|
|
s3cmd --acl-public sync bundles/$VERSION/test/ s3://$BUCKET/test/
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
setup_s3
|
|
release_binary
|
|
release_ubuntu
|
|
release_index
|
|
release_test
|
|
}
|
|
|
|
main
|