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."