Skip to content

Commit d6edf41

Browse files
authored
Merge pull request #213 from infosiftr/jq-template
Add initial jq-based templating engine
2 parents f6ffec9 + c191e1a commit d6edf41

14 files changed

+211
-69
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
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Verify Templating
2+
3+
on:
4+
pull_request:
5+
push:
6+
7+
defaults:
8+
run:
9+
shell: 'bash -Eeuo pipefail -x {0}'
10+
11+
jobs:
12+
apply-templates:
13+
name: Check For Uncomitted Changes
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v2
17+
- name: Apply Templates
18+
run: ./apply-templates.sh
19+
- name: Check Git Status
20+
run: |
21+
status="$(git status --short)"
22+
[ -z "$status" ]

.gitignore

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

2.1/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.

2.2/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.

3.0/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.

3.11/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.

4.0/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.

Dockerfile.template

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM adoptopenjdk:%%JAVA_VERSION%%-jre-hotspot-bionic
1+
FROM adoptopenjdk:{{ .java }}-jre-hotspot-bionic
22

33
# explicitly set user/group IDs
44
RUN set -eux; \
@@ -13,7 +13,15 @@ RUN set -eux; \
1313
# "free" is used by cassandra-env.sh
1414
procps \
1515
# "cqlsh" needs a python interpreter
16+
{{
17+
# python3 is only supported in 4.0+
18+
# https://issues.apache.org/jira/browse/CASSANDRA-10190
19+
if env.version | split(".") | .[0] | tonumber < 4 then (
20+
-}}
21+
python \
22+
{{ ) else ( -}}
1623
python3 \
24+
{{ ) end -}}
1725
# "ip" is not required by Cassandra itself, but is commonly used in scripting Cassandra's configuration (since it is so fixated on explicit IP addresses)
1826
iproute2 \
1927
# Cassandra will automatically use numactl if available
@@ -59,8 +67,8 @@ ENV GPG_KEYS \
5967
# gpg: key E91335D77E3E87CB: public key "Michael Semb Wever <[email protected]>" imported
6068
A4C465FEA0C552561A392A61E91335D77E3E87CB
6169

62-
ENV CASSANDRA_VERSION %%CASSANDRA_VERSION%%
63-
ENV CASSANDRA_SHA512 %%CASSANDRA_SHA512%%
70+
ENV CASSANDRA_VERSION {{ .version }}
71+
ENV CASSANDRA_SHA512 {{ .sha512 }}
6472

6573
RUN set -eux; \
6674
savedAptMark="$(apt-mark showmanual)"; \
@@ -142,7 +150,9 @@ RUN set -eux; \
142150
VOLUME /var/lib/cassandra
143151

144152
COPY docker-entrypoint.sh /usr/local/bin/
153+
{{ if env.version | split(".") | .[0] | tonumber < 4 then ( -}}
145154
RUN ln -s usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
155+
{{ ) else "" end -}}
146156
ENTRYPOINT ["docker-entrypoint.sh"]
147157

148158
# 7000: intra-node communication

apply-templates.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env bash
2+
set -Eeuo pipefail
3+
4+
[ -f versions.json ] # run "versions.sh" first
5+
6+
jqt='.jq-template.awk'
7+
if [ -n "${BASHBREW_SCRIPTS:-}" ]; then
8+
jqt="$BASHBREW_SCRIPTS/jq-template.awk"
9+
elif [ "$BASH_SOURCE" -nt "$jqt" ]; then
10+
wget -qO "$jqt" 'https://github.com/docker-library/bashbrew/raw/ac3e8e9541cb362a579b05bec41dd40d1df1c6e6/scripts/jq-template.awk'
11+
fi
12+
13+
if [ "$#" -eq 0 ]; then
14+
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
15+
eval "set -- $versions"
16+
fi
17+
18+
generated_warning() {
19+
cat <<-EOH
20+
#
21+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
22+
#
23+
# PLEASE DO NOT EDIT IT DIRECTLY.
24+
#
25+
26+
EOH
27+
}
28+
29+
for version; do
30+
export version
31+
32+
echo "processing $version ..."
33+
34+
{
35+
generated_warning
36+
gawk -f "$jqt" Dockerfile.template
37+
} > "$version/Dockerfile"
38+
39+
cp -a docker-entrypoint.sh "$version/"
40+
done

generate-stackbrew-library.sh

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +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
16+
17+
# sort version numbers with highest first
18+
IFS=$'\n'; set -- $(sort -rV <<<"$*"); unset IFS
1419

1520
# get the most recent commit which modified any of "$@"
1621
fileCommit() {
@@ -65,10 +70,10 @@ join() {
6570
echo "${out#$sep}"
6671
}
6772

68-
for version in "${versions[@]}"; do
69-
commit="$(dirCommit "$version")"
73+
for version; do
74+
export version
7075

71-
fullVersion="$(git show "$commit":"$version/Dockerfile" | awk '$1 == "ENV" && $2 == "CASSANDRA_VERSION" { print $3; exit }')"
76+
fullVersion="$(jq -r '.[env.version].version' versions.json)"
7277

7378
versionAliases=( $fullVersion )
7479
if [ "$version" != "$fullVersion" ]; then
@@ -100,6 +105,8 @@ for version in "${versions[@]}"; do
100105

101106
arches="$(xargs -n1 <<<"$arches" | sort)"
102107

108+
commit="$(dirCommit "$version")"
109+
103110
echo
104111
cat <<-EOE
105112
Tags: $(join ', ' "${versionAliases[@]}")

update.sh

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,64 +3,5 @@ set -Eeuo pipefail
33

44
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
55

6-
defaultJavaVersion='11'
7-
declare -A javaVersions=(
8-
[2.1]='8'
9-
[2.2]='8'
10-
[3.0]='8'
11-
[3.11]='8'
12-
)
13-
14-
versions=( "$@" )
15-
if [ ${#versions[@]} -eq 0 ]; then
16-
versions=( */ )
17-
fi
18-
versions=( "${versions[@]%/}" )
19-
20-
for version in "${versions[@]}"; do
21-
possibleVersions=( $(
22-
git ls-remote --tags 'https://gitbox.apache.org/repos/asf/cassandra.git' "refs/tags/cassandra-$version*" \
23-
| cut -d/ -f3- \
24-
| cut -d^ -f1 \
25-
| cut -d- -f2- \
26-
| sort -urV
27-
) )
28-
29-
fullVersion=
30-
sha512=
31-
for possibleVersion in "${possibleVersions[@]}"; do
32-
if sha512="$(wget -qO- "https://downloads.apache.org/cassandra/$possibleVersion/apache-cassandra-$possibleVersion-bin.tar.gz.sha512" | grep -oE '[a-f0-9]{128}')" && [ -n "$sha512" ]; then
33-
fullVersion="$possibleVersion"
34-
break
35-
fi
36-
done
37-
if [ -z "$fullVersion" ]; then
38-
echo >&2 "error: failed to find full version for $version"
39-
exit 1
40-
fi
41-
42-
echo "$version: $fullVersion"
43-
44-
javaVersion="${javaVersions[$version]:-$defaultJavaVersion}"
45-
cp -a docker-entrypoint.sh "$version/"
46-
sed \
47-
-e "s/%%CASSANDRA_VERSION%%/$fullVersion/g" \
48-
-e "s/%%CASSANDRA_SHA512%%/$sha512/g" \
49-
-e "s/%%JAVA_VERSION%%/$javaVersion/g" \
50-
Dockerfile.template > "$version/Dockerfile"
51-
52-
# remove the "/docker-entrypoint.sh" backwards-compatibility symlink in Cassandra 3.12+
53-
case "$version" in
54-
2.*|3.0|3.11) ;;
55-
*) sed -i '/^RUN .* \/docker-entrypoint.sh # backwards compat$/d' "$version/Dockerfile" ;;
56-
esac
57-
# TODO once Cassandra 2.x and 3.x are deprecated, we should remove this from the template itself (and remove this code too)
58-
59-
# python3 is only supported in 4.0+
60-
# https://issues.apache.org/jira/browse/CASSANDRA-10190
61-
case "$version" in
62-
2.* | 3.*)
63-
sed -i 's/python3/python/g' "$version/Dockerfile"
64-
;;
65-
esac
66-
done
6+
./versions.sh "$@"
7+
./apply-templates.sh "$@"

versions.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"2.1": {
3+
"java": "8",
4+
"sha512": "ea2c35f3f9ce2be8eb96df603927c6867613f3e2215132145da2c3015dd1ddf1370d7196ef4485002e7a54fe22c32abd9c659102057f9297b69113bf83d96d0b",
5+
"version": "2.1.21"
6+
},
7+
"2.2": {
8+
"java": "8",
9+
"sha512": "db2026342e876caf790833d49f7ab1a2fbba39bf380384ef66e2da4913f537690a56c97cb2f6ea17f667a0d34aeb406fa658db02aec1121a5ba7134ab59a5cfb",
10+
"version": "2.2.16"
11+
},
12+
"3.0": {
13+
"java": "8",
14+
"sha512": "905ceb18da3391353b3904cdf243b30738167358655d80398d729b8e67fe5b3f1f10a51db19e30c42f7c511b564671785e7654b0892fc79a0fb7c4fda96dbe7b",
15+
"version": "3.0.21"
16+
},
17+
"3.11": {
18+
"java": "8",
19+
"sha512": "c23a51d2d583e707fae8b0e0c413a6287a47af131650715cb3ae8d404b9958fca531c6d73cd196bde5054d2485cc12b6bf195de173f1baa647ac4cc012d9aecd",
20+
"version": "3.11.7"
21+
},
22+
"4.0": {
23+
"java": "11",
24+
"sha512": "240ae95f78de172333eee865f01b838433845fbd0dceea0eb91ea3a419873f74c5e266cfb62553fa0260849afa7ec5cc65335d037d1455e36b96ddc0f18effc7",
25+
"version": "4.0-beta1"
26+
}
27+
}

versions.sh

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env bash
2+
set -Eeuo pipefail
3+
4+
defaultJavaVersion='11'
5+
declare -A javaVersions=(
6+
[2.1]='8'
7+
[2.2]='8'
8+
[3.0]='8'
9+
[3.11]='8'
10+
)
11+
12+
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
13+
14+
versions=( "$@" )
15+
if [ ${#versions[@]} -eq 0 ]; then
16+
versions=( */ )
17+
json='{}'
18+
else
19+
json="$(< versions.json)"
20+
fi
21+
versions=( "${versions[@]%/}" )
22+
23+
for version in "${versions[@]}"; do
24+
export version
25+
26+
possibleVersions=( $(
27+
git ls-remote --tags 'https://gitbox.apache.org/repos/asf/cassandra.git' "refs/tags/cassandra-$version*" \
28+
| cut -d/ -f3- \
29+
| cut -d^ -f1 \
30+
| cut -d- -f2- \
31+
| sort -urV
32+
) )
33+
34+
fullVersion=
35+
sha512=
36+
for possibleVersion in "${possibleVersions[@]}"; do
37+
if sha512="$(wget -qO- "https://downloads.apache.org/cassandra/$possibleVersion/apache-cassandra-$possibleVersion-bin.tar.gz.sha512" | grep -oE '[a-f0-9]{128}')" && [ -n "$sha512" ]; then
38+
fullVersion="$possibleVersion"
39+
break
40+
fi
41+
done
42+
if [ -z "$fullVersion" ]; then
43+
echo >&2 "error: failed to find full version for $version"
44+
exit 1
45+
fi
46+
export fullVersion sha512
47+
48+
export javaVersion="${javaVersions[$version]:-$defaultJavaVersion}"
49+
50+
echo "$version: $fullVersion"
51+
52+
json="$(jq <<<"$json" -c '
53+
.[env.version] = {
54+
version: env.fullVersion,
55+
sha512: env.sha512,
56+
java: env.javaVersion,
57+
}
58+
')"
59+
done
60+
61+
jq <<<"$json" -S . > versions.json

0 commit comments

Comments
 (0)