github.com/duglin/docker@v1.13.1/hack/make/release-deb (about)

     1  #!/bin/bash
     2  set -e
     3  
     4  # This script creates the apt repos for the .deb files generated by hack/make/build-deb
     5  #
     6  # The following can then be used as apt sources:
     7  # 	deb http://apt.dockerproject.org/repo $distro-$release $version
     8  #
     9  # For example:
    10  #	deb http://apt.dockerproject.org/repo ubuntu-trusty main
    11  #	deb http://apt.dockerproject.org/repo ubuntu-trusty testing
    12  #	deb http://apt.dockerproject.org/repo debian-wheezy experimental
    13  #	deb http://apt.dockerproject.org/repo debian-jessie main
    14  #
    15  # ... and so on and so forth for the builds created by hack/make/build-deb
    16  
    17  : ${DOCKER_RELEASE_DIR:=$DEST}
    18  : ${GPG_KEYID:=releasedocker}
    19  APTDIR=$DOCKER_RELEASE_DIR/apt/repo
    20  
    21  # setup the apt repo (if it does not exist)
    22  mkdir -p "$APTDIR/conf" "$APTDIR/db" "$APTDIR/dists"
    23  
    24  # supported arches/sections
    25  arches=( amd64 i386 armhf )
    26  
    27  # Preserve existing components but don't add any non-existing ones
    28  for component in main testing experimental ; do
    29  	exists=$(find "$APTDIR/dists" -mindepth 2 -maxdepth 2 -type d -name "$component" -print -quit)
    30  	if [ -n "$exists" ] ; then
    31  		components+=( $component )
    32  	fi
    33  done
    34  
    35  # set the component for the version being released
    36  component="main"
    37  
    38  if [[ "$VERSION" == *-rc* ]]; then
    39  	component="testing"
    40  fi
    41  
    42  if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
    43  	component="experimental"
    44  fi
    45  
    46  # Make sure our component is in the list of components
    47  if [[ ! "${components[*]}" =~ $component ]] ; then
    48  	components+=( $component )
    49  fi
    50  
    51  # create apt-ftparchive file on every run. This is essential to avoid
    52  # using stale versions of the config file that could cause unnecessary
    53  # refreshing of bits for EOL-ed releases.
    54  cat <<-EOF > "$APTDIR/conf/apt-ftparchive.conf"
    55  Dir {
    56  	ArchiveDir "${APTDIR}";
    57  	CacheDir "${APTDIR}/db";
    58  };
    59  
    60  Default {
    61  	Packages::Compress ". gzip bzip2";
    62  	Sources::Compress ". gzip bzip2";
    63  	Contents::Compress ". gzip bzip2";
    64  };
    65  
    66  TreeDefault {
    67  	BinCacheDB "packages-\$(SECTION)-\$(ARCH).db";
    68  	Directory "pool/\$(SECTION)";
    69  	Packages "\$(DIST)/\$(SECTION)/binary-\$(ARCH)/Packages";
    70  	SrcDirectory "pool/\$(SECTION)";
    71  	Sources "\$(DIST)/\$(SECTION)/source/Sources";
    72  	Contents "\$(DIST)/\$(SECTION)/Contents-\$(ARCH)";
    73  	FileList "$APTDIR/\$(DIST)/\$(SECTION)/filelist";
    74  };
    75  EOF
    76  
    77  for dir in bundles/$VERSION/build-deb/*/; do
    78  	version="$(basename "$dir")"
    79  	suite="${version//debootstrap-}"
    80  
    81  	cat <<-EOF
    82  	Tree "dists/${suite}" {
    83  		Sections "${components[*]}";
    84  		Architectures "${arches[*]}";
    85  	}
    86  
    87  	EOF
    88  done >> "$APTDIR/conf/apt-ftparchive.conf"
    89  
    90  cat <<-EOF > "$APTDIR/conf/docker-engine-release.conf"
    91  APT::FTPArchive::Release::Origin "Docker";
    92  APT::FTPArchive::Release::Components "${components[*]}";
    93  APT::FTPArchive::Release::Label "Docker APT Repository";
    94  APT::FTPArchive::Release::Architectures "${arches[*]}";
    95  EOF
    96  
    97  # release the debs
    98  for dir in bundles/$VERSION/build-deb/*/; do
    99  	version="$(basename "$dir")"
   100  	codename="${version//debootstrap-}"
   101  
   102  	tempdir="$(mktemp -d /tmp/tmp-docker-release-deb.XXXXXXXX)"
   103  	DEBFILE=( "$dir/docker-engine"*.deb )
   104  
   105  	# add the deb for each component for the distro version into the
   106  	# pool (if it is not there already)
   107  	mkdir -p "$APTDIR/pool/$component/d/docker-engine/"
   108   	for deb in ${DEBFILE[@]}; do
   109  		d=$(basename "$deb")
   110  		# We do not want to generate a new deb if it has already been
   111  		# copied into the APTDIR
   112  		if [ ! -f "$APTDIR/pool/$component/d/docker-engine/$d" ]; then
   113  			cp "$deb" "$tempdir/"
   114  			# if we have a $GPG_PASSPHRASE we may as well
   115  			# dpkg-sign before copying the deb into the pool
   116  			if [ ! -z "$GPG_PASSPHRASE" ]; then
   117  				dpkg-sig -g "--no-tty  --digest-algo 'sha512' --passphrase '$GPG_PASSPHRASE'" \
   118  					-k "$GPG_KEYID" --sign builder "$tempdir/$d"
   119  			fi
   120  			mv "$tempdir/$d" "$APTDIR/pool/$component/d/docker-engine/"
   121  		fi
   122  	done
   123  
   124  	rm -rf "$tempdir"
   125  
   126  	# build the right directory structure, needed for apt-ftparchive
   127  	for arch in "${arches[@]}"; do
   128  		for c in "${components[@]}"; do
   129  			mkdir -p "$APTDIR/dists/$codename/$c/binary-$arch"
   130  		done
   131  	done
   132  
   133  	# update the filelist for this codename/component
   134  	find "$APTDIR/pool/$component" \
   135  		-name *~${codename}*.deb -o \
   136  		-name *~${codename#*-}*.deb > "$APTDIR/dists/$codename/$component/filelist"
   137  done
   138  
   139  # run the apt-ftparchive commands so we can have pinning
   140  apt-ftparchive generate "$APTDIR/conf/apt-ftparchive.conf"
   141  
   142  for dir in bundles/$VERSION/build-deb/*/; do
   143  	version="$(basename "$dir")"
   144  	codename="${version//debootstrap-}"
   145  
   146  	apt-ftparchive \
   147  		-c "$APTDIR/conf/docker-engine-release.conf" \
   148  		-o "APT::FTPArchive::Release::Codename=$codename" \
   149  		-o "APT::FTPArchive::Release::Suite=$codename" \
   150  		release \
   151  		"$APTDIR/dists/$codename" > "$APTDIR/dists/$codename/Release"
   152  
   153  	for arch in "${arches[@]}"; do
   154  		apt-ftparchive \
   155  			-c "$APTDIR/conf/docker-engine-release.conf" \
   156  			-o "APT::FTPArchive::Release::Codename=$codename" \
   157  			-o "APT::FTPArchive::Release::Suite=$codename" \
   158  			-o "APT::FTPArchive::Release::Components=$component" \
   159  			-o "APT::FTPArchive::Release::Architecture=$arch" \
   160  			release \
   161  			"$APTDIR/dists/$codename/$component/binary-$arch" > "$APTDIR/dists/$codename/$component/binary-$arch/Release"
   162  	done
   163  done