Skip to content

Commit 8b93251

Browse files
Add script for creating a support matrix of all SDN versions that ever shipped with Spring Boot.
1 parent 9e2edad commit 8b93251

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@ node_modules
3838
node
3939
package-lock.json
4040
.mvn/.develocity
41+
.tmp
4142

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
#!/usr/bin/env bash
2+
3+
#
4+
# Builds a database of all Spring Boot versions that ship with a starter for Spring Data Neo4j.
5+
# This script requires Maven, xidel and DuckDB on the path.
6+
#
7+
8+
set -euo pipefail
9+
export LC_ALL=en_US.UTF-8
10+
11+
DB="$(pwd)/$1"
12+
13+
# Support matrix from
14+
# https://spring.io/projects/spring-boot#support
15+
duckdb "$DB" \
16+
-s "
17+
CREATE TABLE IF NOT EXISTS support_matrix AS SELECT * FROM VALUES
18+
('3.4', '2024-11-21'::date, '2025-11-21'::date, '2027-02-21'::date),
19+
('3.3', '2024-05-23'::date, '2025-05-23'::date, '2026-08-23'::date),
20+
('3.2', '2023-11-23'::date, '2024-11-23'::date, '2026-02-23'::date),
21+
('3.1', '2023-05-18'::date, '2024-05-18'::date, '2025-08-18'::date),
22+
('3.0', '2022-11-24'::date, '2023-11-24'::date, '2025-02-24'::date),
23+
('2.7', '2022-05-19'::date, '2023-11-24'::date, '2026-12-31'::date),
24+
('2.6', '2021-11-17'::date, '2022-11-24'::date, '2024-02-24'::date),
25+
('2.5', '2021-05-20'::date, '2022-05-19'::date, '2023-08-24'::date),
26+
('2.4', '2020-11-12'::date, '2021-11-18'::date, '2023-02-23'::date),
27+
('2.3', '2020-05-15'::date, '2021-05-20'::date, '2022-08-20'::date),
28+
('2.2', '2019-10-16'::date, '2020-10-16'::date, '2022-01-16'::date),
29+
('2.1', '2018-10-30'::date, '2019-10-30'::date, '2021-01-30'::date),
30+
('2.0', '2018-03-01'::date, '2019-03-01'::date, '2020-06-01'::date),
31+
('1.5', '2017-01-30'::date, '2019-08-06'::date, '2020-11-06'::date)
32+
src(spring_boot, initial_release, end_of_oss_support, end_of_commercial_support)
33+
" \
34+
-s "CREATE SEQUENCE IF NOT EXISTS version_id" \
35+
-s "CREATE TABLE IF NOT EXISTS versions (
36+
id INTEGER PRIMARY KEY DEFAULT(nextval('version_id')),
37+
spring_boot VARCHAR(32) NOT NULL,
38+
release_date DATE,
39+
spring_data_neo4j VARCHAR(32),
40+
neo4j_ogm VARCHAR(32),
41+
neo4j_java_driver VARCHAR(32),
42+
CONSTRAINT spring_boot_unique UNIQUE(spring_boot)
43+
)" \
44+
-s "CREATE OR REPLACE FUNCTION f_make_version(string) AS (
45+
SELECT list_transform(string_split(string, '.'), x -> TRY_CAST (x AS INTEGER))
46+
)
47+
" \
48+
-s "
49+
CREATE OR REPLACE VIEW v_versions AS (
50+
SELECT v.* EXCLUDE(id, release_date), release_date, end_of_oss_support, end_of_commercial_support
51+
FROM versions v
52+
ASOF LEFT JOIN support_matrix sm ON f_make_version(v.spring_boot) >= f_make_version(sm.spring_boot)
53+
ORDER BY f_make_version(v.spring_boot) ASC
54+
)" \
55+
-s "
56+
CREATE OR REPLACE VIEW v_oss_supported_versions AS (
57+
SELECT *
58+
FROM v_versions v
59+
WHERE end_of_oss_support >= today()
60+
ORDER BY f_make_version(v.spring_boot) ASC
61+
)" \
62+
-s "
63+
CREATE OR REPLACE VIEW v_commercially_supported_versions AS (
64+
SELECT *
65+
FROM v_versions v
66+
WHERE end_of_commercial_support >= today()
67+
ORDER BY f_make_version(v.spring_boot) ASC
68+
)"
69+
70+
mkdir -p .tmp
71+
72+
# Create a helper pom
73+
# shellcheck disable=SC2016
74+
echo '<?xml version="1.0" encoding="UTF-8"?>
75+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
76+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
77+
<modelVersion>4.0.0</modelVersion>
78+
<groupId>org.neo4j</groupId>
79+
<artifactId>sdn-version-checker</artifactId>
80+
<version>0.0.1-SNAPSHOT</version>
81+
<name>demo</name>
82+
<description>Demo project for Spring Boot</description>
83+
<properties>
84+
<java.version>17</java.version>
85+
</properties>
86+
<dependencyManagement>
87+
<dependencies>
88+
<dependency>
89+
<groupId>org.springframework.boot</groupId>
90+
<artifactId>spring-boot-dependencies</artifactId>
91+
<version>${bootVersion}</version>
92+
<type>pom</type>
93+
<scope>import</scope>
94+
</dependency>
95+
</dependencies>
96+
</dependencyManagement>
97+
<dependencies>
98+
<dependency>
99+
<groupId>org.springframework.boot</groupId>
100+
<artifactId>spring-boot-starter-data-neo4j</artifactId>
101+
</dependency>
102+
</dependencies>
103+
<build>
104+
<plugins>
105+
<plugin>
106+
<groupId>org.apache.maven.plugins</groupId>
107+
<artifactId>maven-dependency-plugin</artifactId>
108+
<version>3.8.1</version>
109+
</plugin>
110+
</plugins>
111+
</build>
112+
</project>
113+
' > .tmp/pom.xml
114+
115+
116+
# Get all the dependencies
117+
for sb in $(\
118+
xidel -se '/metadata/versioning/versions/version' https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/maven-metadata.xml | \
119+
duckdb "$DB" -noheader -csv -s "SELECT * from read_csv('/dev/stdin', header=false, columns={'spring_boot': 'VARCHAR'}) ANTI JOIN versions USING (spring_boot) WHERE f_make_version(spring_boot) >= [1,4,0] "\
120+
); do
121+
set +e
122+
mvn -B -q -f .tmp/pom.xml -DoutputFile="$sb".json -DoutputType=json -DbootVersion="$sb" dependency:tree >/dev/null 2>/dev/null
123+
set -e
124+
done
125+
126+
# Get release dates from the maven index, might not be 100% accurate, but good enough
127+
curl -s https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/ | sed -nE 's/.*title="(.*)\/".*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1,\2/p' > .tmp/release_dates.csv
128+
129+
# Extract dependency information
130+
if compgen -G ".tmp/*.json" > /dev/null;
131+
then
132+
duckdb "$DB" \
133+
-s "
134+
WITH parent AS (
135+
SELECT unnest(children, recursive:=true) from read_json('.tmp/*.json')
136+
), starter AS (
137+
SELECT version AS spring_boot, unnest(children, recursive:=true) FROM parent
138+
), ogm AS (
139+
SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM starter
140+
), driver_via_ogm AS (
141+
SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM ogm
142+
), driver_via_sdn AS (
143+
SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM starter
144+
WHERE starter.artifactId = 'spring-data-neo4j'
145+
)
146+
INSERT INTO versions BY NAME
147+
SELECT starter.spring_boot,
148+
r.release_date,
149+
starter.version AS spring_data_neo4j,
150+
ogm.version AS neo4j_ogm,
151+
coalesce(driver_via_ogm.version, driver_via_sdn.version) AS neo4j_java_driver
152+
FROM starter
153+
NATURAL JOIN read_csv('.tmp/release_dates.csv', header=false, columns={'spring_boot': 'VARCHAR', 'release_date': 'DATE'}) r
154+
LEFT OUTER JOIN ogm ON
155+
ogm.parent = starter.artifactId AND
156+
ogm.parentVersion = starter.version AND
157+
ogm.spring_boot = starter.spring_boot AND
158+
ogm.artifactId = 'neo4j-ogm-core'
159+
LEFT OUTER JOIN driver_via_ogm ON
160+
driver_via_ogm.parent ='neo4j-ogm-bolt-driver' AND
161+
driver_via_ogm.parentVersion = ogm.version AND
162+
driver_via_ogm.spring_boot = starter.spring_boot AND
163+
driver_via_ogm.artifactId = 'neo4j-java-driver'
164+
LEFT OUTER JOIN driver_via_sdn ON
165+
driver_via_sdn.parent = starter.artifactId AND
166+
driver_via_sdn.parentVersion = starter.version AND
167+
driver_via_sdn.spring_boot = starter.spring_boot AND
168+
driver_via_sdn.artifactId = 'neo4j-java-driver'
169+
WHERE starter.artifactId = 'spring-data-neo4j'
170+
ON CONFLICT DO NOTHING
171+
"
172+
fi
173+
174+
rm -rf .tmp

0 commit comments

Comments
 (0)