This is an automated email from the ASF dual-hosted git repository.

hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-jcasbin.git


The following commit(s) were added to refs/heads/master by this push:
     new 58dfd39  feat: auto release snapshot versions now (#521)
58dfd39 is described below

commit 58dfd3981065fc05eefc62bda7f378bbe39bd685
Author: cooronx <[email protected]>
AuthorDate: Tue Apr 28 23:34:37 2026 +0800

    feat: auto release snapshot versions now (#521)
---
 .github/workflows/maven-ci.yml             |  98 ++++++++++++++++++----
 .github/workflows/maven-snapshot.yml       |  49 +++++++++++
 .github/workflows/source-release-draft.yml | 125 +++++++++++++++++++++++++++++
 .github/workflows/source-snapshot.yml      | 113 ++++++++++++++++++++++++++
 pom.xml                                    |   7 --
 5 files changed, 368 insertions(+), 24 deletions(-)

diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml
index ef4a67a..de3d9a8 100644
--- a/.github/workflows/maven-ci.yml
+++ b/.github/workflows/maven-ci.yml
@@ -22,11 +22,6 @@ jobs:
         uses: actions/setup-java@v1
         with:
           java-version: 1.8
-          server-id: ossrh
-          server-username: OSSRH_JIRA_USERNAME
-          server-password: OSSRH_JIRA_PASSWORD
-          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
-          gpg-passphrase: GPG_PASSPHRASE
 
       - name: Build with Maven
         run: mvn clean test cobertura:cobertura
@@ -36,18 +31,87 @@ jobs:
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
 
-      - name: Set up Node.js
-        uses: actions/setup-node@v2
+  prepare_snapshot_version:
+    name: Prepare Snapshot Version
+    needs: build
+    if: ${{ github.repository == 'apache/casbin-jcasbin' && github.event_name 
== 'push' && github.ref == 'refs/heads/master' }}
+    runs-on: ubuntu-latest
+    outputs:
+      version: ${{ steps.snapshot.outputs.version }}
+      maven_version: ${{ steps.snapshot.outputs.maven_version }}
+      basename: ${{ steps.snapshot.outputs.basename }}
+      previous_tag: ${{ steps.snapshot.outputs.previous_tag }}
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
         with:
-          node-version: 20
+          fetch-depth: 0
 
-      - name: Semantic Release
+      - name: Compute snapshot version
+        id: snapshot
         run: |
-          npm install -g @conveyal/maven-semantic-release semantic-release
-          semantic-release --prepare @conveyal/maven-semantic-release 
--publish @semantic-release/github,@conveyal/maven-semantic-release 
--verify-conditions @semantic-release/github,@conveyal/maven-semantic-release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          GPG_KEY_NAME: ${{ secrets.GPG_KEY_NAME }}
-          GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
-          OSSRH_JIRA_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }}
-          OSSRH_JIRA_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }}
+          LATEST_RELEASE_TAG="$(
+            git tag --list 'v*' |
+              grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
+              sort -V |
+              tail -n 1
+          )"
+
+          if [ -z "${LATEST_RELEASE_TAG}" ]; then
+            BASE_VERSION="0.1.0"
+          else
+            RELEASE_VERSION="${LATEST_RELEASE_TAG#v}"
+            MAJOR="${RELEASE_VERSION%%.*}"
+            REST="${RELEASE_VERSION#*.}"
+            MINOR="${REST%%.*}"
+            NEXT_MINOR="$((MINOR + 1))"
+            BASE_VERSION="${MAJOR}.${NEXT_MINOR}.0"
+          fi
+
+          ESCAPED_BASE_VERSION="${BASE_VERSION//./\\.}"
+          LAST_SNAPSHOT_NUMBER="$(
+            git tag --list "v${BASE_VERSION}-snapshot.*" |
+              sed -nE "s/^v${ESCAPED_BASE_VERSION}-snapshot\\.([0-9]+)$/\\1/p" 
|
+              sort -n |
+              tail -n 1
+          )"
+          LAST_SNAPSHOT_NUMBER="${LAST_SNAPSHOT_NUMBER:-0}"
+          NEXT_SNAPSHOT_NUMBER="$((LAST_SNAPSHOT_NUMBER + 1))"
+          SNAPSHOT_VERSION="v${BASE_VERSION}-snapshot.${NEXT_SNAPSHOT_NUMBER}"
+          MAVEN_VERSION="${SNAPSHOT_VERSION#v}"
+          BASENAME="jcasbin-${MAVEN_VERSION}-src"
+
+          echo "version=${SNAPSHOT_VERSION}" >> "${GITHUB_OUTPUT}"
+          echo "maven_version=${MAVEN_VERSION}" >> "${GITHUB_OUTPUT}"
+          echo "basename=${BASENAME}" >> "${GITHUB_OUTPUT}"
+          if [ "${LAST_SNAPSHOT_NUMBER}" -gt 0 ]; then
+            echo 
"previous_tag=v${BASE_VERSION}-snapshot.${LAST_SNAPSHOT_NUMBER}" >> 
"${GITHUB_OUTPUT}"
+          else
+            echo "previous_tag=${LATEST_RELEASE_TAG}" >> "${GITHUB_OUTPUT}"
+          fi
+
+          echo "Computed snapshot version: ${SNAPSHOT_VERSION}"
+          echo "Computed Maven version: ${MAVEN_VERSION}"
+
+  publish-maven:
+    name: Publish Maven
+    needs: prepare_snapshot_version
+    if: ${{ github.repository == 'apache/casbin-jcasbin' && github.event_name 
== 'push' && github.ref == 'refs/heads/master' }}
+    uses: ./.github/workflows/maven-snapshot.yml
+    with:
+      maven_version: ${{ needs.prepare_snapshot_version.outputs.maven_version 
}}
+    secrets: inherit
+
+  semantic-release:
+    name: Semantic Release
+    needs:
+      - prepare_snapshot_version
+      - publish-maven
+    if: ${{ github.repository == 'apache/casbin-jcasbin' && github.event_name 
== 'push' && github.ref == 'refs/heads/master' }}
+    permissions:
+      contents: write
+    uses: ./.github/workflows/source-snapshot.yml
+    with:
+      version: ${{ needs.prepare_snapshot_version.outputs.version }}
+      basename: ${{ needs.prepare_snapshot_version.outputs.basename }}
+      previous_tag: ${{ needs.prepare_snapshot_version.outputs.previous_tag }}
diff --git a/.github/workflows/maven-snapshot.yml 
b/.github/workflows/maven-snapshot.yml
new file mode 100644
index 0000000..eb11c32
--- /dev/null
+++ b/.github/workflows/maven-snapshot.yml
@@ -0,0 +1,49 @@
+name: Publish Maven
+
+on:
+  workflow_call:
+    inputs:
+      maven_version:
+        required: true
+        type: string
+  workflow_dispatch:
+    inputs:
+      maven_version:
+        description: Maven release version to publish, for example 
1.2.3-snapshot.1
+        required: true
+        type: string
+
+permissions:
+  contents: read
+
+jobs:
+  publish-maven:
+    name: Publish Maven
+    if: ${{ github.repository == 'apache/casbin-jcasbin' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - name: Set up JDK 1.8
+        uses: actions/setup-java@v4
+        with:
+          distribution: temurin
+          java-version: 8
+          server-id: ossrh
+          server-username: OSSRH_JIRA_USERNAME
+          server-password: OSSRH_JIRA_PASSWORD
+          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
+          gpg-passphrase: GPG_PASSPHRASE
+
+      - name: Publish Maven
+        run: |
+          mvn -B org.codehaus.mojo:versions-maven-plugin:2.16.2:set 
-DnewVersion="${{ inputs.maven_version }}" -DgenerateBackupPoms=false
+          mvn -B deploy -DskipTests
+        env:
+          GPG_KEY_NAME: ${{ secrets.GPG_KEY_NAME }}
+          GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+          OSSRH_JIRA_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }}
+          OSSRH_JIRA_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }}
diff --git a/.github/workflows/source-release-draft.yml 
b/.github/workflows/source-release-draft.yml
new file mode 100644
index 0000000..8986105
--- /dev/null
+++ b/.github/workflows/source-release-draft.yml
@@ -0,0 +1,125 @@
+name: Build Source Release Draft
+
+on:
+  push:
+    tags:
+      - "v*"
+
+permissions:
+  contents: write
+
+jobs:
+  build-source-release-draft:
+    if: ${{ github.repository == 'apache/casbin-jcasbin' && 
!contains(github.ref_name, '-') }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - name: Compute release metadata
+        id: release
+        run: |
+          TAG_NAME="${GITHUB_REF_NAME}"
+          if ! [[ "${TAG_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+            echo "Unsupported release tag: ${TAG_NAME}" >&2
+            exit 1
+          fi
+
+          VERSION="${TAG_NAME#v}"
+          BASENAME="jcasbin-${VERSION}-src"
+          PREVIOUS_TAG="$(
+            git tag --list 'v*' |
+              grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
+              sort -V |
+              awk -v current="${TAG_NAME}" '
+                $0 == current {
+                  print previous
+                  exit
+                }
+                {
+                  previous = $0
+                }
+              '
+          )"
+
+          echo "tag=${TAG_NAME}" >> "${GITHUB_OUTPUT}"
+          echo "version=${VERSION}" >> "${GITHUB_OUTPUT}"
+          echo "basename=${BASENAME}" >> "${GITHUB_OUTPUT}"
+          echo "previous_tag=${PREVIOUS_TAG}" >> "${GITHUB_OUTPUT}"
+
+      - name: Generate release notes
+        run: |
+          CURRENT_TAG="${{ steps.release.outputs.tag }}"
+          CURRENT_VERSION="${{ steps.release.outputs.version }}"
+          PREVIOUS_TAG="${{ steps.release.outputs.previous_tag }}"
+          RELEASE_DATE="$(date -u +%F)"
+          RANGE="${CURRENT_TAG}"
+
+          if [ -n "${PREVIOUS_TAG}" ]; then
+            RANGE="${PREVIOUS_TAG}..${CURRENT_TAG}"
+          fi
+
+          FEATURES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(feat)(\(.+\))?: ' || true)"
+          FIXES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(fix)(\(.+\))?: ' || true)"
+          DOCS="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(docs?|doc)(\(.+\))?: ' || true)"
+
+          {
+            if [ -n "${PREVIOUS_TAG}" ]; then
+              echo "# 
[${CURRENT_VERSION}](https://github.com/${GITHUB_REPOSITORY}/compare/${PREVIOUS_TAG}...${CURRENT_TAG})
 (${RELEASE_DATE})"
+            else
+              echo "# ${CURRENT_VERSION} (${RELEASE_DATE})"
+            fi
+            echo
+            echo "This GitHub release is a draft helper for packaging and 
release notes."
+            echo
+            if [ -n "${PREVIOUS_TAG}" ]; then
+              echo "Changes since ${PREVIOUS_TAG}."
+            fi
+            echo
+
+            if [ -n "${FEATURES}" ]; then
+              echo "## Features"
+              echo
+              printf '%s\n' "${FEATURES}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -n "${FIXES}" ]; then
+              echo "## Fixes"
+              echo
+              printf '%s\n' "${FIXES}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -n "${DOCS}" ]; then
+              echo "## Docs"
+              echo
+              printf '%s\n' "${DOCS}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -z "${FEATURES}${FIXES}${DOCS}" ]; then
+              echo "## Notes"
+              echo
+              echo "- No feat/fix/doc commits were found in this release 
range."
+            fi
+          } > RELEASE_NOTES.md
+
+      - name: Create source archives
+        run: |
+          mkdir -p dist
+          git archive --format=tar.gz --prefix="${{ 
steps.release.outputs.basename }}/" -o "dist/${{ steps.release.outputs.basename 
}}.tar.gz" "${{ steps.release.outputs.tag }}"
+          git archive --format=zip --prefix="${{ 
steps.release.outputs.basename }}/" -o "dist/${{ steps.release.outputs.basename 
}}.zip" "${{ steps.release.outputs.tag }}"
+
+      - name: Create draft GitHub release
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ steps.release.outputs.tag }}
+          name: JCasbin ${{ steps.release.outputs.tag }}
+          body_path: RELEASE_NOTES.md
+          draft: true
+          files: |
+            dist/${{ steps.release.outputs.basename }}.tar.gz
+            dist/${{ steps.release.outputs.basename }}.zip
diff --git a/.github/workflows/source-snapshot.yml 
b/.github/workflows/source-snapshot.yml
new file mode 100644
index 0000000..f764f7f
--- /dev/null
+++ b/.github/workflows/source-snapshot.yml
@@ -0,0 +1,113 @@
+name: Semantic Release
+
+on:
+  workflow_call:
+    inputs:
+      version:
+        required: true
+        type: string
+      basename:
+        required: true
+        type: string
+      previous_tag:
+        required: false
+        type: string
+        default: ""
+  workflow_dispatch:
+    inputs:
+      version:
+        description: GitHub release tag, for example v1.2.3-snapshot.1
+        required: true
+        type: string
+      basename:
+        description: Source archive basename, for example 
jcasbin-1.2.3-snapshot.1-src
+        required: true
+        type: string
+      previous_tag:
+        description: Previous tag for release notes
+        required: false
+        type: string
+
+permissions:
+  contents: write
+
+jobs:
+  semantic-release:
+    name: Semantic Release
+    if: ${{ github.repository == 'apache/casbin-jcasbin' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - name: Generate snapshot release notes
+        run: |
+          PREVIOUS_TAG="${{ inputs.previous_tag }}"
+          CURRENT_TAG="${{ inputs.version }}"
+          CURRENT_VERSION="${CURRENT_TAG#v}"
+          RELEASE_DATE="$(date -u +%F)"
+          RANGE="HEAD"
+
+          if [ -n "${PREVIOUS_TAG}" ]; then
+            RANGE="${PREVIOUS_TAG}..HEAD"
+          fi
+
+          FEATURES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(feat)(\(.+\))?: ' || true)"
+          FIXES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(fix)(\(.+\))?: ' || true)"
+          DOCS="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei 
'^(docs?|doc)(\(.+\))?: ' || true)"
+
+          {
+            if [ -n "${PREVIOUS_TAG}" ]; then
+              echo "# 
[${CURRENT_VERSION}](https://github.com/${GITHUB_REPOSITORY}/compare/${PREVIOUS_TAG}...${CURRENT_TAG})
 (${RELEASE_DATE})"
+            else
+              echo "# ${CURRENT_VERSION} (${RELEASE_DATE})"
+            fi
+            echo
+            if [ -n "${FEATURES}" ]; then
+              echo "## Features"
+              echo
+              printf '%s\n' "${FEATURES}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -n "${FIXES}" ]; then
+              echo "## Fixes"
+              echo
+              printf '%s\n' "${FIXES}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -n "${DOCS}" ]; then
+              echo "## Docs"
+              echo
+              printf '%s\n' "${DOCS}" | sed 's/^/- /'
+              echo
+            fi
+
+            if [ -z "${FEATURES}${FIXES}${DOCS}" ]; then
+              echo "## Notes"
+              echo
+              echo "- No feat/fix/doc commits were found in this snapshot 
range."
+            fi
+          } > SNAPSHOT_RELEASE_NOTES.md
+
+      - name: Create source archives
+        run: |
+          mkdir -p dist
+          git archive --format=tar.gz --prefix="${{ inputs.basename }}/" -o 
"dist/${{ inputs.basename }}.tar.gz" HEAD
+          git archive --format=zip --prefix="${{ inputs.basename }}/" -o 
"dist/${{ inputs.basename }}.zip" HEAD
+
+      - name: Create Semantic release
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ inputs.version }}
+          target_commitish: ${{ github.sha }}
+          name: ${{ inputs.version }}
+          body_path: SNAPSHOT_RELEASE_NOTES.md
+          draft: false
+          prerelease: false
+          files: |
+            dist/${{ inputs.basename }}.tar.gz
+            dist/${{ inputs.basename }}.zip
diff --git a/pom.xml b/pom.xml
index d491ce5..c36ee33 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,13 +46,6 @@
         <slf4j.version>2.0.16</slf4j.version>
     </properties>
 
-    <distributionManagement>
-        <snapshotRepository>
-            <id>ossrh</id>
-            <url>https://central.sonatype.com</url>
-        </snapshotRepository>
-    </distributionManagement>
-
     <build>
         <plugins>
             <plugin>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to