bashbrew/push.sh

128 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
set -e
# so we can have fancy stuff like !(pattern)
shopt -s extglob
dir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
library="$dir/../library"
logs="$dir/logs"
namespaces='library stackbrew'
library="$(readlink -f "$library")"
logs="$(readlink -f "$logs")"
# TODO actually log stuff
# arg handling: all args are [repo|repo:tag]
usage() {
cat <<EOUSAGE
usage: $0 [options] [repo[:tag] ...]
ie: $0 --all
$0 debian ubuntu:12.04
This script pushes the specified docker images from library that are built
and tagged in the specified namespaces.
options:
--help, -h, -? Print this help message
--all Pushes all docker images built for the given namespaces
--no-push Don't actually push the images to the Docker Hub
--library="$library"
Where to find repository manifest files
--namespaces="$namespaces"
Space separated list of namespaces to tag images in after
building
EOUSAGE
}
opts="$(getopt -o 'h?' --long 'help,all,no-push,library:,logs:,namespaces:' -- "$@" || { usage >&2 && false; })"
eval set -- "$opts"
doPush=1
buildAll=
while true; do
flag=$1
shift
case "$flag" in
--help|-h|'-?')
usage
exit 0
;;
--all) buildAll=1 ;;
--no-push) doPush= ;;
--library) library="$1" && shift ;;
--logs) logs="$1" && shift ;;
--namespaces) namespaces="$1" && shift ;;
--)
break
;;
*)
{
echo "error: unknown flag: $flag"
usage
} >&2
exit 1
;;
esac
done
repos=()
if [ "$buildAll" ]; then
repos=( "$library"/!(MAINTAINERS) )
fi
repos+=( "$@" )
repos=( "${repos[@]%/}" )
if [ "${#repos[@]}" -eq 0 ]; then
echo >&2 'error: no repos specified'
usage >&2
exit 1
fi
for repoTag in "${repos[@]}"; do
repo="${repoTag%%:*}"
tag="${repoTag#*:}"
[ "$repo" != "$tag" ] || tag=
if [ -f "$repo" ]; then
repoFile="$repo"
repo="$(basename "$repoFile")"
repoTag="${repo}${tag:+:$tag}"
else
repoFile="$library/$repo"
fi
repoFile="$(readlink -f "$repoFile")"
# parse the repo library file
IFS=$'\n'
tagList=( $(awk -F ': +' '!/^#|^\s*$/ { print $1 }' "$repoFile") )
unset IFS
tags=()
for tag in "${tagList[@]}"; do
tags+=( "$repo:$tag" )
done
pushes=()
if [ "$repo" = "$repoTag" ]; then
pushes=( "${tags[@]}" )
else
pushes+=( "$repoTag" )
fi
for pushTag in "${pushes[@]}"; do
for namespace in $namespaces; do
if [ "$doPush" ]; then
docker push "$namespace/$pushTag"
else
echo "docker push" "$namespace/$pushTag"
fi
done
done
done