-
Notifications
You must be signed in to change notification settings - Fork 24
/
generate-stackbrew-library.sh
executable file
·125 lines (108 loc) · 3.67 KB
/
generate-stackbrew-library.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env bash
#
# Produce https://github.com/docker-library/official-images/blob/master/library/solr
# Based on https://github.com/docker-library/httpd/blob/master/generate-stackbrew-library.sh
set -eu
declare -A aliases
declare -g -A parentRepoToArches
self="$(basename "${BASH_SOURCE[0]}")"
if [[ "$OSTYPE" == "darwin"* ]]; then
source "$(dirname "${BASH_SOURCE[0]}")/tools/init_macos.sh"
fi
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
declare -a versions
readarray -t versions < <(find . -maxdepth 1 -regex '\./[0-9]*\.[0-9]*' -printf '%f\n' | sort -rV)
latest_version="${versions[0]}"
# make a map from major version to most recent minor, eg 9.6 -> 9
readarray -t versions_increasing < <(printf '%s\n' "${versions[@]}" | tac )
declare -A major_to_minor
for v in "${versions_increasing[@]}"; do
major="$(sed -E 's/\..*//' <<<"$v")"
major_to_minor[$major]=$v
done
# invert that to create aliases eg 9.6 -> 9
for major in "${!major_to_minor[@]}"; do
aliases[${major_to_minor[$major]}]="$major"
done
# 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"
dirCommit() {
local dir="$1"; shift
(
cd "$dir"
fileCommit \
"Dockerfile"
)
}
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' -not -path "./official-images/*" -exec awk '
toupper($1) == "FROM" && $2 !~ /^('"$repo"'|scratch|microsoft\/[^:]+)(:|$)/ {
print "'"$officialImagesUrl"'" $2
}
' '{}' + \
| sort -u \
| xargs bashbrew cat --format '[{{ .RepoName }}:{{ .TagName }}]="{{ join " " .TagEntry.Architectures }}"'
) )"
}
getArches 'solr'
cat <<-EOH
# this file is generated via https://github.com/apache/solr-docker/blob/$(fileCommit "$self")/$self
Maintainers: The Apache Solr Project <[email protected]> (@asfbot),
Shalin Mangar (@shalinmangar),
David Smiley (@dsmiley),
Jan Høydahl (@janhoy),
Houston Putman (@houstonputman)
GitRepo: https://github.com/apache/solr-docker.git
GitFetch: refs/heads/main
EOH
for version in "${versions[@]}"; do
# We can remove the variant loop when 8.11 is no longer supported
for variant in '' slim; do
dir="$version${variant:+-$variant}"
[ -f "$dir/Dockerfile" ] || continue
commit="$(dirCommit "$dir")"
# grep the full version from the Dockerfile, eg: SOLR_VERSION="6.6.1"
fullVersion="$(git show "$commit:$dir/Dockerfile" | \
grep -E 'SOLR_VERSION="[^"]+"' | \
sed -E -e 's/.*SOLR_VERSION="([^"]+)".*$/\1/')"
if [[ -z $fullVersion ]]; then
echo "Cannot determine full version from $dir/Dockerfile"
exit 1
fi
versionAliases=(
"$fullVersion"
"$version"
)
if [[ -n "${aliases[$version]:-}" ]]; then
versionAliases=( "${versionAliases[@]}" "${aliases[$version]:-}" )
fi
if [ -z "$variant" ]; then
variantAliases=( "${versionAliases[@]}" )
if [[ $version == "$latest_version" ]]; then
variantAliases=( "${variantAliases[@]}" "latest" )
fi
else
variantAliases=( "${versionAliases[@]/%/-$variant}" )
if [[ $version == "$latest_version" ]]; then
variantAliases=( "${variantAliases[@]}" "$variant" )
fi
fi
variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$dir/Dockerfile")"
variantArches=(${parentRepoToArches[$variantParent]})
# Do not produce 32bit images
variantArches=("${variantArches[@]/*32*}")
echo
cat <<-EOE
Tags: $(sed -E 's/ +/, /g' <<<"${variantAliases[@]}")
Architectures: $(sed -E 's/ +/, /g' <<<"${variantArches[@]}")
GitCommit: $commit
Directory: $dir
EOE
done
done