refactor(build): decouple per-module versioning
This commit is contained in:
@@ -1,17 +1,20 @@
|
|||||||
# This workflow publishes one or all modules to Maven Central when a GitHub Release is published.
|
# This workflow publishes one or more modules to Maven Central when a version tag is pushed
|
||||||
|
# to the main branch.
|
||||||
#
|
#
|
||||||
# Supported release tag formats:
|
# Supported tag formats:
|
||||||
# <module-name>/v<version> — publish a single module (e.g. tuple/v3.3.1)
|
# <module>/v<version> — publish a single module (e.g. tuple/v3.3.1)
|
||||||
# v<version> — publish all modules (e.g. v3.3.0, backward compat)
|
# <module>+<module>/v<version> — publish multiple modules (e.g. tuple+crypto-toolbox/v3.3.1)
|
||||||
|
# v<version> — publish all modules (e.g. v3.4.0)
|
||||||
#
|
#
|
||||||
# Valid module names: common-toolbox, tuple, identity-generator, crypto-toolbox, math-toolbox, version-catalogue
|
# Valid module names: common-toolbox, tuple, identity-generator, crypto-toolbox, math-toolbox, version-catalogue
|
||||||
|
|
||||||
name: Publish Packages to Maven Central
|
name: Publish Packages to Maven Central
|
||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
push:
|
||||||
types:
|
tags:
|
||||||
- published
|
- 'v[0-9]*.[0-9]*.[0-9]*'
|
||||||
|
- '*/v[0-9]*.[0-9]*.[0-9]*'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
@@ -19,53 +22,80 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
packages: write
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Parse Release Tag
|
- name: Verify Tag is on Main Branch
|
||||||
|
run: |
|
||||||
|
if ! git merge-base --is-ancestor HEAD origin/main; then
|
||||||
|
echo "::error::Tag ${{ github.ref_name }} does not point to a commit on the main branch"
|
||||||
|
echo "Tags must be pushed after the commit is merged to main."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✓ Tag ${{ github.ref_name }} is on main"
|
||||||
|
|
||||||
|
- name: Parse Tag
|
||||||
id: parse-tag
|
id: parse-tag
|
||||||
run: |
|
run: |
|
||||||
TAG="${{ github.event.release.tag_name }}"
|
declare -A MODULE_PROPS=(
|
||||||
echo "Release tag: ${TAG}"
|
["common-toolbox"]="commonToolboxVersion"
|
||||||
|
["tuple"]="tupleVersion"
|
||||||
|
["identity-generator"]="identityGeneratorVersion"
|
||||||
|
["crypto-toolbox"]="cryptoToolboxVersion"
|
||||||
|
["math-toolbox"]="mathToolboxVersion"
|
||||||
|
["version-catalogue"]="versionCatalogueVersion"
|
||||||
|
)
|
||||||
|
|
||||||
# <module>/v<version> — single module
|
TAG="${{ github.ref_name }}"
|
||||||
if [[ "${TAG}" =~ ^([a-z][a-z0-9-]*)/v?([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
echo "Tag: ${TAG}"
|
||||||
MODULE="${BASH_REMATCH[1]}"
|
|
||||||
VERSION="${BASH_REMATCH[2]}"
|
|
||||||
|
|
||||||
case "${MODULE}" in
|
# <module>[+<module>...]/v<version> — one or more specific modules
|
||||||
common-toolbox) PROP="commonToolboxVersion" ;;
|
if [[ "${TAG}" =~ ^([a-z][a-z0-9-]+(\+[a-z][a-z0-9-]+)*)/v?([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
||||||
tuple) PROP="tupleVersion" ;;
|
IFS='+' read -ra MODULES <<< "${BASH_REMATCH[1]}"
|
||||||
identity-generator) PROP="identityGeneratorVersion" ;;
|
VERSION="${BASH_REMATCH[3]}"
|
||||||
crypto-toolbox) PROP="cryptoToolboxVersion" ;;
|
|
||||||
math-toolbox) PROP="mathToolboxVersion" ;;
|
|
||||||
version-catalogue) PROP="versionCatalogueVersion" ;;
|
|
||||||
*)
|
|
||||||
echo "::error::Unknown module: ${MODULE}"
|
|
||||||
echo "Valid modules: common-toolbox, tuple, identity-generator, crypto-toolbox, math-toolbox, version-catalogue"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "module=${MODULE}" >> $GITHUB_OUTPUT
|
# v<version> — all modules
|
||||||
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
||||||
echo "gradle_property=${PROP}" >> $GITHUB_OUTPUT
|
|
||||||
echo "gradle_project=:${MODULE}" >> $GITHUB_OUTPUT
|
|
||||||
echo "single_module=true" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
echo "→ Publishing single module: ${MODULE} @ ${VERSION}"
|
|
||||||
|
|
||||||
# v<version> — all modules (backward compat)
|
|
||||||
else
|
else
|
||||||
|
MODULES=("common-toolbox" "tuple" "identity-generator" "crypto-toolbox" "math-toolbox" "version-catalogue")
|
||||||
VERSION="${TAG#v}"
|
VERSION="${TAG#v}"
|
||||||
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
||||||
echo "single_module=false" >> $GITHUB_OUTPUT
|
|
||||||
echo "→ Publishing all modules @ ${VERSION}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Validate all modules
|
||||||
|
for m in "${MODULES[@]}"; do
|
||||||
|
if [ -z "${MODULE_PROPS[$m]}" ]; then
|
||||||
|
echo "::error::Unknown module: ${m}"
|
||||||
|
echo "Valid modules: ${!MODULE_PROPS[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
||||||
|
echo "count=${#MODULES[@]}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
for m in "${MODULES[@]}"; do
|
||||||
|
echo "→ ${m} @ ${VERSION}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Store module list as a multi-line output
|
||||||
|
{
|
||||||
|
echo "modules<<MODULES_EOF"
|
||||||
|
printf '%s\n' "${MODULES[@]}"
|
||||||
|
echo "MODULES_EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Store property mappings
|
||||||
|
{
|
||||||
|
echo "props<<PROPS_EOF"
|
||||||
|
for m in "${MODULES[@]}"; do
|
||||||
|
echo "${m}=${MODULE_PROPS[$m]}"
|
||||||
|
done
|
||||||
|
echo "PROPS_EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Setup GPG TTY
|
- name: Setup GPG TTY
|
||||||
run: export GPG_TTY=$(tty)
|
run: export GPG_TTY=$(tty)
|
||||||
|
|
||||||
@@ -104,44 +134,42 @@ jobs:
|
|||||||
|
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
env:
|
env:
|
||||||
SINGLE: ${{ steps.parse-tag.outputs.single_module }}
|
MODULES: ${{ steps.parse-tag.outputs.modules }}
|
||||||
PROJECT: ${{ steps.parse-tag.outputs.gradle_project }}
|
PROPS: ${{ steps.parse-tag.outputs.props }}
|
||||||
PROPERTY: ${{ steps.parse-tag.outputs.gradle_property }}
|
|
||||||
VERSION: ${{ steps.parse-tag.outputs.version }}
|
VERSION: ${{ steps.parse-tag.outputs.version }}
|
||||||
run: |
|
run: |
|
||||||
if [ "${SINGLE}" = "true" ]; then
|
declare -A MODULE_PROPS
|
||||||
./gradlew "${PROJECT}:build" "-P${PROPERTY}=${VERSION}"
|
while IFS='=' read -r key value; do
|
||||||
else
|
MODULE_PROPS[$key]="$value"
|
||||||
./gradlew build \
|
done <<< "$PROPS"
|
||||||
-PcommonToolboxVersion="${VERSION}" \
|
|
||||||
-PtupleVersion="${VERSION}" \
|
while IFS= read -r MODULE; do
|
||||||
-PidentityGeneratorVersion="${VERSION}" \
|
echo "::group::Building ${MODULE}"
|
||||||
-PcryptoToolboxVersion="${VERSION}" \
|
PROP="${MODULE_PROPS[$MODULE]}"
|
||||||
-PmathToolboxVersion="${VERSION}" \
|
./gradlew ":${MODULE}:build" "-P${PROP}=${VERSION}"
|
||||||
-PversionCatalogueVersion="${VERSION}"
|
echo "::endgroup::"
|
||||||
fi
|
done <<< "$MODULES"
|
||||||
|
|
||||||
- name: List Output Items
|
- name: List Output Items
|
||||||
run: ls -l ./**/build/libs
|
run: ls -l ./**/build/libs
|
||||||
|
|
||||||
- name: Publish to Maven Central
|
- name: Publish to Maven Central
|
||||||
env:
|
env:
|
||||||
SINGLE: ${{ steps.parse-tag.outputs.single_module }}
|
MODULES: ${{ steps.parse-tag.outputs.modules }}
|
||||||
PROJECT: ${{ steps.parse-tag.outputs.gradle_project }}
|
PROPS: ${{ steps.parse-tag.outputs.props }}
|
||||||
PROPERTY: ${{ steps.parse-tag.outputs.gradle_property }}
|
|
||||||
VERSION: ${{ steps.parse-tag.outputs.version }}
|
VERSION: ${{ steps.parse-tag.outputs.version }}
|
||||||
run: |
|
run: |
|
||||||
if [ "${SINGLE}" = "true" ]; then
|
declare -A MODULE_PROPS
|
||||||
./gradlew "${PROJECT}:publish" "-P${PROPERTY}=${VERSION}"
|
while IFS='=' read -r key value; do
|
||||||
else
|
MODULE_PROPS[$key]="$value"
|
||||||
./gradlew publish \
|
done <<< "$PROPS"
|
||||||
-PcommonToolboxVersion="${VERSION}" \
|
|
||||||
-PtupleVersion="${VERSION}" \
|
while IFS= read -r MODULE; do
|
||||||
-PidentityGeneratorVersion="${VERSION}" \
|
echo "::group::Publishing ${MODULE}"
|
||||||
-PcryptoToolboxVersion="${VERSION}" \
|
PROP="${MODULE_PROPS[$MODULE]}"
|
||||||
-PmathToolboxVersion="${VERSION}" \
|
./gradlew ":${MODULE}:publish" "-P${PROP}=${VERSION}"
|
||||||
-PversionCatalogueVersion="${VERSION}"
|
echo "::endgroup::"
|
||||||
fi
|
done <<< "$MODULES"
|
||||||
|
|
||||||
- name: Create Deployment on Central Publisher Portal
|
- name: Create Deployment on Central Publisher Portal
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
Reference in New Issue
Block a user