blob: c0f811c2b4bab1ef35243b0a0e02dda7ed0cd505 [file] [log] [blame]
#!/bin/bash
# This script generates a manifest compatibile with the expectations set forth
# by docker-library/official-images.
#
# It is not compatible with the version of Bash currently shipped with OS X due
# to the use of features introduced in Bash 4.
set -eu
declare -A aliases=(
[1.10]='latest'
)
self="$(basename "$BASH_SOURCE")"
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
# Identify directories matching '?.?' (e.g. '1.7') and remove trailing slashes
versions=( ?.?/ ?.??/ )
versions=( "${versions[@]%/}" )
# get the most recent commit which modified any of "$@"
fileCommit() {
git log -1 --format='format:%H' HEAD -- "$@"
}
# get the most recent commit which modified "$1/Dockerfile" or any file COPY'd from "$1/Dockerfile"
dirCommit() {
local dir="$1"; shift
(
cd "$dir"
fileCommit \
Dockerfile \
$(git show HEAD:./Dockerfile | awk '
toupper($1) == "COPY" {
for (i = 2; i < NF; i++) {
print $i
}
}
')
)
}
getArches() {
local repo="$1"; shift
local officialImagesUrl='https://github.com/docker-library/official-images/raw/master/library/'
eval "declare -g -A parentRepoToArches=( $(
find -name 'Dockerfile' -exec awk '
toupper($1) == "FROM" && $2 !~ /^('"$repo"'|scratch|microsoft\/[^:]+)(:|$)/ {
print "'"$officialImagesUrl"'" $2
}
' '{}' + \
| sort -u \
| xargs bashbrew cat --format '[{{ .RepoName }}:{{ .TagName }}]="{{ join " " .TagEntry.Architectures }}"'
) )"
}
getArches 'flink'
cat <<-EOH
# this file is generated via https://github.com/apache/flink-docker/blob/$(fileCommit "$self")/$self
Maintainers: Patrick Lucas <me@patricklucas.com> (@patricklucas),
Ismaël Mejía <iemejia@gmail.com> (@iemejia)
GitRepo: https://github.com/apache/flink-docker.git
EOH
# prints "$2$1$3$1...$N"
join() {
local sep="$1"; shift
local out; printf -v out "${sep//%/%%}%s" "$@"
echo "${out#$sep}"
}
# Sorry for the style here, but it makes the nested code easier to read
for version in "${versions[@]}"; do
# Defaults, can vary between versions
source_variants=( debian )
scala_versions=( 2.11 2.12 )
# Version-specific variants (example)
# if [ "$flink_release" = "x.y" ]; then
# scala_versions=( 2.10 2.11 2.12 )
# fi
for source_variant in "${source_variants[@]}"; do
for scala_version in "${scala_versions[@]}"; do
dir="$version/scala_${scala_version}-${source_variant}"
# Not all variant combinations may exist
[ -f "$dir/Dockerfile" ] || continue
commit="$(dirCommit "$dir")"
# Extract the full Flink version from the Dockerfile
flink_version="$(git show "$commit":"$dir/Dockerfile" | awk '/ENV FLINK_VERSION=(.*) /{ split($2,a,"="); print a[2]}')"
full_version=$flink_version-scala_$scala_version
variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$dir/Dockerfile")"
variantArches="${parentRepoToArches[$variantParent]}"
# Start with the full version e.g. "1.2.0-scala_2.11" and add
# additional tags as relevant
tags=( $full_version )
is_latest_version=
[ "$version" = "${versions[-1]}" ] && is_latest_version=1
is_latest_scala=
[ "$scala_version" = "${scala_versions[-1]}" ] && is_latest_scala=1
add_tags=( $version )
# Add a scala version tag to each image
tags=(
${tags[@]}
${add_tags[@]/%/-scala_$scala_version}
)
# If this is the latest Flink release, add a tag with only the scala version
if [ -n "$is_latest_version" ]; then
tags=(
${tags[@]}
"scala_$scala_version"
)
fi
# For the latest supported Scala version, add tags that omit the scala version
if [ -n "$is_latest_scala" ]; then
tags=(
${tags[@]}
$flink_version
$version
)
fi
# Add -$variant suffix for non-debian-based images
if [ "$source_variant" != "debian" ]; then
tags=( ${tags[@]/%/-$source_variant} )
fi
# Finally, designate the 'latest' tag (or '$variant', for non-debian-based images)
if [ -n "$is_latest_scala" ]; then
alias_tag="${aliases[$version]:-}"
if [ -n "$alias_tag" ] && [ "$source_variant" != "debian" ]; then
alias_tag="$source_variant"
fi
tags=(
${tags[@]}
$alias_tag
)
fi
echo
# The tabs here are necessary for the heredoc to work right
cat <<-EOE
Tags: $(join ', ' "${tags[@]}")
Architectures: $(join ', ' $variantArches)
GitCommit: $commit
Directory: $dir
EOE
done
done
done