Skip to content

Commit 41ff6e8

Browse files
Added templating
1 parent 329d3b8 commit 41ff6e8

12 files changed

+260
-118
lines changed

.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
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#
2+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
3+
#
4+
# PLEASE DO NOT EDIT IT DIRECTLY.
5+
#
6+
17
FROM ruby:3.1-alpine3.18
28

39
# explicitly set uid/gid to guarantee that it won't change in the future
File renamed without changes.

5.0/Dockerfile renamed to 5.0/bookworm/Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
#
2+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
3+
#
4+
# PLEASE DO NOT EDIT IT DIRECTLY.
5+
#
6+
17
FROM ruby:3.1-slim-bookworm
28

39
# explicitly set uid/gid to guarantee that it won't change in the future
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

update.sh

Lines changed: 2 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,7 @@
11
#!/usr/bin/env bash
22
set -Eeuo pipefail
33

4-
# see https://www.redmine.org/projects/redmine/wiki/redmineinstall
5-
defaultRubyVersion='3.1'
6-
declare -A rubyVersions=(
7-
)
8-
94
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
105

11-
versions=( "$@" )
12-
if [ ${#versions[@]} -eq 0 ]; then
13-
versions=( */ )
14-
fi
15-
versions=( "${versions[@]%/}" )
16-
17-
# https://github.com/docker-library/redmine/issues/256
18-
downloadsPage="$(curl -fsSL 'https://redmine.org/projects/redmine/wiki/Download')"
19-
20-
releasesUrl='https://www.redmine.org/releases'
21-
versionsPage="$(curl -fsSL "$releasesUrl")"
22-
23-
allVersions="$(
24-
sed <<<"$versionsPage"$'\n'"$downloadsPage" \
25-
-rne 's/.*redmine-([0-9.]+)[.]tar[.]gz.*/\1/p' \
26-
| sort -ruV
27-
)"
28-
29-
for version in "${versions[@]}"; do
30-
ourVersions="$(grep -E "^$version[.]" <<<"$allVersions")"
31-
fullVersion=
32-
for tryVersion in $ourVersions; do
33-
url="$releasesUrl/redmine-$tryVersion.tar.gz"
34-
if sha256="$(curl -fsSL "$url.sha256" 2>/dev/null)" && sha256="$(cut -d' ' -f1 <<<"$sha256")" && [ -n "$sha256" ]; then
35-
fullVersion="$tryVersion"
36-
break
37-
fi
38-
if urlLine="$(grep -oEm1 'href="https?://[^"]+/'"redmine-$tryVersion.tar.gz"'".*sha256:.*' <<<"$downloadsPage")" && url="$(cut -d'"' -f2 <<<"$urlLine")" && [ -n "$url" ] && sha256="$(grep -oEm1 'sha256:[[:space:]]*[a-f0-9]{64}' <<<"$urlLine")" && [ -n "$sha256" ] && sha256="${sha256: -64}"; then
39-
fullVersion="$tryVersion"
40-
break
41-
fi
42-
done
43-
if [ -z "$fullVersion" ]; then
44-
echo >&2 "error: failed to find full version for '$version'"
45-
exit 1
46-
fi
47-
48-
rubyVersion="${rubyVersions[$version]:-$defaultRubyVersion}"
49-
50-
text="ruby $rubyVersion"
51-
52-
echo "$version: $fullVersion ($text)"
53-
54-
commonSedArgs=(
55-
-r
56-
-e 's/%%REDMINE_VERSION%%/'"$fullVersion"'/'
57-
-e 's/%%RUBY_VERSION%%/'"$rubyVersion"'/'
58-
-e 's!%%REDMINE_DOWNLOAD_URL%%!'"$url"'!'
59-
-e 's/%%REDMINE_DOWNLOAD_SHA256%%/'"$sha256"'/'
60-
-e 's/%%REDMINE%%/redmine:'"$version"'/'
61-
)
62-
63-
mkdir -p "$version"
64-
cp docker-entrypoint.sh "$version/"
65-
sed "${commonSedArgs[@]}" Dockerfile-debian.template > "$version/Dockerfile"
66-
67-
mkdir -p "$version/alpine"
68-
cp docker-entrypoint.sh "$version/alpine/"
69-
sed -i -e 's/gosu/su-exec/g' "$version/alpine/docker-entrypoint.sh"
70-
sed "${commonSedArgs[@]}" Dockerfile-alpine.template > "$version/alpine/Dockerfile"
71-
done
6+
./versions.sh "$@"
7+
./apply-templates.sh "$@"

0 commit comments

Comments
 (0)