diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a5994ef..93b4df3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -53,6 +53,9 @@ jobs:
id: tests
run: ./mvnw -U -B -ntp verify
+ - name: Verify external BOM consumption
+ run: bash scripts/verify-bom-consumer.sh
+
- name: Print failing test reports
if: failure() && steps.tests.outcome == 'failure'
shell: bash
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 71ef4f9..1c0b635 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -61,6 +61,9 @@ jobs:
|| { echo "Tag $GITHUB_REF_NAME does not match Maven version $PROJECT_VERSION." >&2; exit 1; }
echo "value=$PROJECT_VERSION" >> "$GITHUB_OUTPUT"
+ - name: Verify external BOM consumption
+ run: bash scripts/verify-bom-consumer.sh
+
- name: Verify and publish the exact release reactor
env:
PLATFORM_ACCEPTANCE_WORK_DIRECTORY: ${{ runner.temp }}/featureframework-platform-acceptance
diff --git a/pom.xml b/pom.xml
index 8831104..28d6550 100644
--- a/pom.xml
+++ b/pom.xml
@@ -215,7 +215,10 @@
org.codehaus.mojo
flatten-maven-plugin
${flatten.plugin.version}
- resolveCiFriendliesOnly
+
+ resolveCiFriendliesOnly
+ true
+
flattenprocess-resourcesflatten
flatten-cleancleanclean
diff --git a/scripts/verify-bom-consumer.sh b/scripts/verify-bom-consumer.sh
new file mode 100644
index 0000000..e09efdc
--- /dev/null
+++ b/scripts/verify-bom-consumer.sh
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+repository_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
+cd "$repository_root"
+
+version="$(
+ ./mvnw -q -ntp -DforceStdout help:evaluate -Dexpression=project.version \
+ | awk '/^[0-9]+\.[0-9]+\.[0-9]+$/ { print; exit }'
+)"
+if [[ -z "$version" ]]; then
+ echo "Unable to resolve the FeatureFramework project version." >&2
+ exit 1
+fi
+
+local_repository="$(mktemp -d)"
+consumer_directory="$(mktemp -d)"
+cleanup() {
+ rm -rf "$local_repository" "$consumer_directory"
+}
+trap cleanup EXIT
+
+./mvnw -B -ntp \
+ -pl featureframework-bom -am \
+ -DskipTests \
+ -Dmaven.repo.local="$local_repository" \
+ install
+
+parent_pom="$local_repository/nl/hauntedmc/featureframework/featureframework-parent/$version/featureframework-parent-$version.pom"
+bom_pom="$local_repository/nl/hauntedmc/featureframework/featureframework-bom/$version/featureframework-bom-$version.pom"
+
+for installed_pom in "$parent_pom" "$bom_pom"; do
+ if [[ ! -f "$installed_pom" ]]; then
+ echo "Expected installed consumer POM was not created: $installed_pom" >&2
+ exit 1
+ fi
+ if grep -Fq "\${revision}" "$installed_pom"; then
+ echo "Installed consumer POM still contains an unresolved \${revision}: $installed_pom" >&2
+ exit 1
+ fi
+done
+
+cat >"$consumer_directory/pom.xml" <
+
+ 4.0.0
+ nl.hauntedmc.featureframework.acceptance
+ bom-consumer
+ 1.0.0
+
+
+
+ nl.hauntedmc.featureframework
+ featureframework-bom
+ $version
+ pom
+ import
+
+
+
+
+
+ nl.hauntedmc.featureframework
+ featureframework-theme-api
+
+
+
+EOF
+
+effective_pom="$consumer_directory/effective-pom.xml"
+./mvnw -B -ntp \
+ -f "$consumer_directory/pom.xml" \
+ -Dmaven.repo.local="$local_repository" \
+ help:effective-pom \
+ -Doutput="$effective_pom"
+
+if ! awk -v expected="$version" '
+ /featureframework-theme-api<\/artifactId>/ { candidate = 1; next }
+ candidate && // {
+ value = $0
+ sub(/^.*/, "", value)
+ sub(/<\/version>.*$/, "", value)
+ if (value == expected) {
+ found = 1
+ }
+ candidate = 0
+ }
+ END { exit found ? 0 : 1 }
+' "$effective_pom"; then
+ echo "External BOM consumer did not receive featureframework-theme-api:$version from dependency management." >&2
+ exit 1
+fi
+
+echo "Verified external consumption of featureframework-bom:$version."