diff --git a/.github/workflows/github-packages-publish.yml b/.github/workflows/github-packages-publish.yml index a1918e7..c083358 100644 --- a/.github/workflows/github-packages-publish.yml +++ b/.github/workflows/github-packages-publish.yml @@ -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: -# /v — publish a single module (e.g. tuple/v3.3.1) -# v — publish all modules (e.g. v3.3.0, backward compat) +# Supported tag formats: +# /v — publish a single module (e.g. tuple/v3.3.1) +# +/v — publish multiple modules (e.g. tuple+crypto-toolbox/v3.3.1) +# v — publish all modules (e.g. v3.4.0) # # Valid module names: common-toolbox, tuple, identity-generator, crypto-toolbox, math-toolbox, version-catalogue name: Publish Packages to Maven Central on: - release: - types: - - published + push: + tags: + - 'v[0-9]*.[0-9]*.[0-9]*' + - '*/v[0-9]*.[0-9]*.[0-9]*' jobs: publish: @@ -19,53 +22,80 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - packages: write steps: - name: Checkout 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 run: | - TAG="${{ github.event.release.tag_name }}" - echo "Release tag: ${TAG}" + declare -A MODULE_PROPS=( + ["common-toolbox"]="commonToolboxVersion" + ["tuple"]="tupleVersion" + ["identity-generator"]="identityGeneratorVersion" + ["crypto-toolbox"]="cryptoToolboxVersion" + ["math-toolbox"]="mathToolboxVersion" + ["version-catalogue"]="versionCatalogueVersion" + ) - # /v — single module - if [[ "${TAG}" =~ ^([a-z][a-z0-9-]*)/v?([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then - MODULE="${BASH_REMATCH[1]}" - VERSION="${BASH_REMATCH[2]}" + TAG="${{ github.ref_name }}" + echo "Tag: ${TAG}" - case "${MODULE}" in - common-toolbox) PROP="commonToolboxVersion" ;; - tuple) PROP="tupleVersion" ;; - identity-generator) PROP="identityGeneratorVersion" ;; - 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 + # [+...]/v — one or more specific modules + if [[ "${TAG}" =~ ^([a-z][a-z0-9-]+(\+[a-z][a-z0-9-]+)*)/v?([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then + IFS='+' read -ra MODULES <<< "${BASH_REMATCH[1]}" + VERSION="${BASH_REMATCH[3]}" - echo "module=${MODULE}" >> $GITHUB_OUTPUT - 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 — all modules (backward compat) + # v — all modules else + MODULES=("common-toolbox" "tuple" "identity-generator" "crypto-toolbox" "math-toolbox" "version-catalogue") VERSION="${TAG#v}" - echo "version=${VERSION}" >> $GITHUB_OUTPUT - echo "single_module=false" >> $GITHUB_OUTPUT - echo "→ Publishing all modules @ ${VERSION}" 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<> $GITHUB_OUTPUT + + # Store property mappings + { + echo "props<> $GITHUB_OUTPUT + - name: Setup GPG TTY run: export GPG_TTY=$(tty) @@ -104,44 +134,42 @@ jobs: - name: Build with Gradle env: - SINGLE: ${{ steps.parse-tag.outputs.single_module }} - PROJECT: ${{ steps.parse-tag.outputs.gradle_project }} - PROPERTY: ${{ steps.parse-tag.outputs.gradle_property }} + MODULES: ${{ steps.parse-tag.outputs.modules }} + PROPS: ${{ steps.parse-tag.outputs.props }} VERSION: ${{ steps.parse-tag.outputs.version }} run: | - if [ "${SINGLE}" = "true" ]; then - ./gradlew "${PROJECT}:build" "-P${PROPERTY}=${VERSION}" - else - ./gradlew build \ - -PcommonToolboxVersion="${VERSION}" \ - -PtupleVersion="${VERSION}" \ - -PidentityGeneratorVersion="${VERSION}" \ - -PcryptoToolboxVersion="${VERSION}" \ - -PmathToolboxVersion="${VERSION}" \ - -PversionCatalogueVersion="${VERSION}" - fi + declare -A MODULE_PROPS + while IFS='=' read -r key value; do + MODULE_PROPS[$key]="$value" + done <<< "$PROPS" + + while IFS= read -r MODULE; do + echo "::group::Building ${MODULE}" + PROP="${MODULE_PROPS[$MODULE]}" + ./gradlew ":${MODULE}:build" "-P${PROP}=${VERSION}" + echo "::endgroup::" + done <<< "$MODULES" - name: List Output Items run: ls -l ./**/build/libs - name: Publish to Maven Central env: - SINGLE: ${{ steps.parse-tag.outputs.single_module }} - PROJECT: ${{ steps.parse-tag.outputs.gradle_project }} - PROPERTY: ${{ steps.parse-tag.outputs.gradle_property }} + MODULES: ${{ steps.parse-tag.outputs.modules }} + PROPS: ${{ steps.parse-tag.outputs.props }} VERSION: ${{ steps.parse-tag.outputs.version }} run: | - if [ "${SINGLE}" = "true" ]; then - ./gradlew "${PROJECT}:publish" "-P${PROPERTY}=${VERSION}" - else - ./gradlew publish \ - -PcommonToolboxVersion="${VERSION}" \ - -PtupleVersion="${VERSION}" \ - -PidentityGeneratorVersion="${VERSION}" \ - -PcryptoToolboxVersion="${VERSION}" \ - -PmathToolboxVersion="${VERSION}" \ - -PversionCatalogueVersion="${VERSION}" - fi + declare -A MODULE_PROPS + while IFS='=' read -r key value; do + MODULE_PROPS[$key]="$value" + done <<< "$PROPS" + + while IFS= read -r MODULE; do + echo "::group::Publishing ${MODULE}" + PROP="${MODULE_PROPS[$MODULE]}" + ./gradlew ":${MODULE}:publish" "-P${PROP}=${VERSION}" + echo "::endgroup::" + done <<< "$MODULES" - name: Create Deployment on Central Publisher Portal run: |