Skip to content

Commit 43ac7c9

Browse files
authored
Merge pull request #302 from LaurentGoderre/templating
Added templating
2 parents 329d3b8 + e57ff5c commit 43ac7c9

13 files changed

+263
-118
lines changed

.gitattributes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/*/**/Dockerfile linguist-generated
2+
/*/**/docker-entrypoint.sh linguist-generated
3+
/Dockerfile*.template linguist-language=Dockerfile

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.jq-template.awk

5.0/alpine/Dockerfile renamed to 5.0/alpine3.18/Dockerfile

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.

5.0/Dockerfile renamed to 5.0/bookworm/Dockerfile

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.

Dockerfile-alpine.template

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ruby:%%RUBY_VERSION%%-alpine3.18
1+
FROM ruby:{{ .ruby.version }}-{{ env.variant }}
22

33
# explicitly set uid/gid to guarantee that it won't change in the future
44
# the values 999:999 are identical to the current user/group id assigned
@@ -40,9 +40,9 @@ RUN set -eux; \
4040
chown redmine:redmine "$HOME"; \
4141
chmod 1777 "$HOME"
4242

43-
ENV REDMINE_VERSION %%REDMINE_VERSION%%
44-
ENV REDMINE_DOWNLOAD_URL %%REDMINE_DOWNLOAD_URL%%
45-
ENV REDMINE_DOWNLOAD_SHA256 %%REDMINE_DOWNLOAD_SHA256%%
43+
ENV REDMINE_VERSION {{ .version }}
44+
ENV REDMINE_DOWNLOAD_URL {{ .downloadUrl }}
45+
ENV REDMINE_DOWNLOAD_SHA256 {{ .sha256 }}
4646

4747
RUN set -eux; \
4848
wget -O redmine.tar.gz "$REDMINE_DOWNLOAD_URL"; \

Dockerfile-debian.template

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ruby:%%RUBY_VERSION%%-slim-bookworm
1+
FROM ruby:{{ .ruby.version }}-slim-{{ env.variant }}
22

33
# explicitly set uid/gid to guarantee that it won't change in the future
44
# the values 999:999 are identical to the current user/group id assigned
@@ -43,9 +43,9 @@ RUN set -eux; \
4343
chown redmine:redmine "$HOME"; \
4444
chmod 1777 "$HOME"
4545

46-
ENV REDMINE_VERSION %%REDMINE_VERSION%%
47-
ENV REDMINE_DOWNLOAD_URL %%REDMINE_DOWNLOAD_URL%%
48-
ENV REDMINE_DOWNLOAD_SHA256 %%REDMINE_DOWNLOAD_SHA256%%
46+
ENV REDMINE_VERSION {{ .version }}
47+
ENV REDMINE_DOWNLOAD_URL {{ .downloadUrl }}
48+
ENV REDMINE_DOWNLOAD_SHA256 {{ .sha256 }}
4949

5050
RUN set -eux; \
5151
# if we use wget here, we get certificate issues (https://github.com/docker-library/redmine/pull/249#issuecomment-984176479)

apply-templates.sh

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env bash
2+
set -Eeuo pipefail
3+
4+
[ -f versions.json ] # run "versions.sh" first
5+
6+
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
7+
8+
jqt='.jq-template.awk'
9+
if [ -n "${BASHBREW_SCRIPTS:-}" ]; then
10+
jqt="$BASHBREW_SCRIPTS/jq-template.awk"
11+
elif [ "$BASH_SOURCE" -nt "$jqt" ]; then
12+
# https://github.com/docker-library/bashbrew/blob/master/scripts/jq-template.awk
13+
wget -qO "$jqt" 'https://github.com/docker-library/bashbrew/raw/9f6a35772ac863a0241f147c820354e4008edf38/scripts/jq-template.awk'
14+
fi
15+
16+
if [ "$#" -eq 0 ]; then
17+
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
18+
eval "set -- $versions"
19+
fi
20+
21+
generated_warning() {
22+
cat <<-EOH
23+
#
24+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
25+
#
26+
# PLEASE DO NOT EDIT IT DIRECTLY.
27+
#
28+
29+
EOH
30+
}
31+
32+
for version; do
33+
export version
34+
35+
if [ -d "$version" ]; then
36+
rm -rf "$version"
37+
fi
38+
39+
if jq -e '.[env.version] | not' versions.json > /dev/null; then
40+
echo "skipping $version ..."
41+
continue
42+
fi
43+
44+
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
45+
eval "variants=( $variants )"
46+
47+
for variant in "${variants[@]}"; do
48+
export variant
49+
50+
echo "processing $version/$variant ..."
51+
52+
dir="$version${variant:+/$variant}"
53+
54+
mkdir -p "$dir"
55+
56+
cp -f docker-entrypoint.sh "$dir/"
57+
58+
case "$variant" in
59+
alpine*)
60+
template='Dockerfile-alpine.template'
61+
sed -i -e 's/gosu/su-exec/g' "$dir/docker-entrypoint.sh"
62+
;;
63+
*)
64+
template='Dockerfile-debian.template'
65+
;;
66+
esac
67+
68+
{
69+
generated_warning
70+
gawk -f "$jqt" "$template"
71+
} > "$dir/Dockerfile"
72+
done
73+
done

generate-stackbrew-library.sh

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ declare -A aliases=(
99
self="$(basename "$BASH_SOURCE")"
1010
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
1111

12-
versions=( */ )
13-
versions=( "${versions[@]%/}" )
12+
if [ "$#" -eq 0 ]; then
13+
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
14+
eval "set -- $versions"
15+
fi
1416

1517
# sort version numbers with highest first
16-
IFS=$'\n'; versions=( $(echo "${versions[*]}" | sort -rV) ); unset IFS
18+
IFS=$'\n'; set -- $(sort -rV <<<"$*"); unset IFS
1719

1820
# get the most recent commit which modified any of "$@"
1921
fileCommit() {
@@ -68,61 +70,49 @@ join() {
6870
echo "${out#$sep}"
6971
}
7072

71-
for version in "${versions[@]}"; do
72-
# normally this would be down in the other loop, but "passenger" doesn't have it, so this is the simplest option (we just can't ever have "alpine" be out of sync, so we should remove it instead if it ever needs to be out of sync)
73-
commit="$(dirCommit "$version")"
74-
fullVersion="$(git show "$commit":"$version/Dockerfile" | awk '$1 == "ENV" && $2 == "REDMINE_VERSION" { print $3; exit }')"
73+
for version; do
74+
export version
7575

76-
versionAliases=(
77-
$fullVersion
76+
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
77+
eval "variants=( $variants )"
78+
79+
alpine="$(jq -r '.[env.version].alpine' versions.json)"
80+
debian="$(jq -r '.[env.version].debian' versions.json)"
81+
82+
fullVersion="$(jq -r '.[env.version].version' versions.json)"
83+
84+
versionAliases=()
85+
while [ "$fullVersion" != "$version" -a "${fullVersion%[.]*}" != "$fullVersion" ]; do
86+
versionAliases+=( $fullVersion )
87+
fullVersion="${fullVersion%[.]*}"
88+
done
89+
versionAliases+=(
7890
$version
7991
${aliases[$version]:-}
8092
)
8193

82-
for variant in '' passenger alpine; do
83-
dir="$version${variant:+/$variant}"
84-
[ -f "$dir/Dockerfile" ] || continue
85-
94+
for variant in "${variants[@]}"; do
95+
dir="$version/$variant"
8696
commit="$(dirCommit "$dir")"
8797

88-
if [ -n "$variant" ]; then
89-
variantAliases=( "${versionAliases[@]/%/-$variant}" )
90-
variantAliases=( "${variantAliases[@]//latest-/}" )
91-
else
92-
variantAliases=( "${versionAliases[@]}" )
93-
fi
94-
9598
variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$dir/Dockerfile")"
99+
variantArches="${parentRepoToArches[$variantParent]}"
96100

97-
suite="${variantParent#*:}" # "ruby:2.7-slim-bullseye", "2.7-alpine3.15"
98-
suite="${suite##*-}" # "bullseye", "alpine3.15"
99-
suite="${suite#alpine}" # "bullseye", "3.15"
101+
variantAliases=( "${versionAliases[@]/%/-$variant}" )
102+
variantAliases=( "${variantAliases[@]//latest-/}" )
100103

101104
case "$variant" in
102-
alpine)
103-
suite="alpine$suite" # "alpine3.8"
104-
suiteAliases=( "${versionAliases[@]/%/-$suite}" )
105+
"$debian")
106+
variantAliases=(
107+
"${versionAliases[@]}"
108+
"${variantAliases[@]}"
109+
)
105110
;;
106-
passenger)
107-
# the "passenger" variant doesn't get any extra aliases (sorry)
108-
suiteAliases=()
109-
;;
110-
*)
111-
suiteAliases=( "${variantAliases[@]/%/-$suite}" )
111+
alpine"$alpine")
112+
variantAliases+=( "${versionAliases[@]/%/-alpine}" )
113+
variantAliases=( "${variantAliases[@]//latest-/}" )
112114
;;
113115
esac
114-
suiteAliases=( "${suiteAliases[@]//latest-/}" )
115-
variantAliases+=( "${suiteAliases[@]}" )
116-
117-
case "$variant" in
118-
passenger) variantArches='amd64' ;; # https://github.com/docker-library/redmine/pull/87#issuecomment-323877678
119-
*) variantArches="${parentRepoToArches[$variantParent]}" ;;
120-
esac
121-
122-
if [ "$variant" != 'alpine' ]; then
123-
# the "gosu" Debian package isn't available on mips64le
124-
variantArches="$(sed <<<" $variantArches " -e 's/ mips64le / /g')"
125-
fi
126116

127117
echo
128118
cat <<-EOE

0 commit comments

Comments
 (0)