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-node-casbin.git


The following commit(s) were added to refs/heads/master by this push:
     new cc8ffd3  feat: auto release snapshot version now (#556)
cc8ffd3 is described below

commit cc8ffd34ad9b6d7eff3fbf2fa1cef2e7d3a65489
Author: cooronx <[email protected]>
AuthorDate: Wed Apr 29 00:10:05 2026 +0800

    feat: auto release snapshot version now (#556)
---
 .github/workflows/main.yml            | 103 +++++++++++++++++++++++++++--
 .github/workflows/npm-snapshot.yml    |  50 ++++++++++++++
 .github/workflows/semantic-relese.yml | 121 ++++++++++++++++++++++++++++++++++
 3 files changed, 267 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 95a1217..8c6a663 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -28,15 +28,104 @@ jobs:
           flags: node-${{ matrix.node-version }}
           fail_ci_if_error: false
 
-  semantic-release:
+  prepare_snapshot_version:
+    name: Prepare Snapshot Version
     needs: [test]
+    if: >-
+      ${{
+        github.repository == 'apache/casbin-node-casbin' &&
+        github.event_name == 'push' &&
+        github.ref == 'refs/heads/master'
+      }}
     runs-on: ubuntu-latest
+    outputs:
+      version: ${{ steps.snapshot.outputs.version }}
+      npm_version: ${{ steps.snapshot.outputs.npm_version }}
+      basename: ${{ steps.snapshot.outputs.basename }}
+      previous_tag: ${{ steps.snapshot.outputs.previous_tag }}
     steps:
       - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          ref: ${{ github.sha }}
+
+      - name: Compute snapshot version
+        id: snapshot
+        run: |
+          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}"
+          NPM_VERSION="${SNAPSHOT_VERSION#v}"
+          BASENAME="casbin-${NPM_VERSION}-src"
+
+          echo "version=${SNAPSHOT_VERSION}" >> "${GITHUB_OUTPUT}"
+          echo "npm_version=${NPM_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 npm version: ${NPM_VERSION}"
+
+  publish-npm:
+    name: Publish NPM
+    needs: prepare_snapshot_version
+    if: >-
+      ${{
+        github.repository == 'apache/casbin-node-casbin' &&
+        github.event_name == 'push' &&
+        github.ref == 'refs/heads/master'
+      }}
+    uses: ./.github/workflows/npm-snapshot.yml
+    with:
+      npm_version: ${{ needs.prepare_snapshot_version.outputs.npm_version }}
+      ref: ${{ github.sha }}
+    secrets: inherit
 
-      - name: Run semantic-release
-        if: github.repository == 'apache/casbin-node-casbin' && 
github.event_name == 'push'
-        run: yarn install && yarn semantic-release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+  semantic-relese:
+    name: semantic-relese
+    needs:
+      - prepare_snapshot_version
+      - publish-npm
+    if: >-
+      ${{
+        github.repository == 'apache/casbin-node-casbin' &&
+        github.event_name == 'push' &&
+        github.ref == 'refs/heads/master'
+      }}
+    permissions:
+      contents: write
+    uses: ./.github/workflows/semantic-relese.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 }}
+      ref: ${{ github.sha }}
diff --git a/.github/workflows/npm-snapshot.yml 
b/.github/workflows/npm-snapshot.yml
new file mode 100644
index 0000000..71e5f5a
--- /dev/null
+++ b/.github/workflows/npm-snapshot.yml
@@ -0,0 +1,50 @@
+name: Publish NPM
+
+on:
+  workflow_call:
+    inputs:
+      npm_version:
+        required: true
+        type: string
+      ref:
+        required: true
+        type: string
+  workflow_dispatch:
+    inputs:
+      npm_version:
+        description: NPM snapshot version to publish, for example 
1.2.3-snapshot.1
+        required: true
+        type: string
+      ref:
+        description: Git ref or commit SHA to publish
+        required: true
+        type: string
+
+permissions:
+  contents: read
+
+jobs:
+  publish-npm:
+    name: Publish NPM
+    if: ${{ github.repository == 'apache/casbin-node-casbin' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          ref: ${{ inputs.ref }}
+
+      - name: Set up Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: 22
+          registry-url: https://registry.npmjs.org
+
+      - name: Publish snapshot package
+        run: |
+          yarn install --frozen-lockfile
+          npm version "${{ inputs.npm_version }}" --no-git-tag-version
+          npm publish --tag snapshot
+        env:
+          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/semantic-relese.yml 
b/.github/workflows/semantic-relese.yml
new file mode 100644
index 0000000..deafbdc
--- /dev/null
+++ b/.github/workflows/semantic-relese.yml
@@ -0,0 +1,121 @@
+name: semantic-relese
+
+on:
+  workflow_call:
+    inputs:
+      version:
+        required: true
+        type: string
+      basename:
+        required: true
+        type: string
+      previous_tag:
+        required: false
+        type: string
+        default: ""
+      ref:
+        required: true
+        type: string
+  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 
casbin-1.2.3-snapshot.1-src
+        required: true
+        type: string
+      previous_tag:
+        description: Previous tag for release notes
+        required: false
+        type: string
+      ref:
+        description: Git ref or commit SHA for the snapshot
+        required: true
+        type: string
+
+permissions:
+  contents: write
+
+jobs:
+  semantic-relese:
+    name: semantic-relese
+    if: ${{ github.repository == 'apache/casbin-node-casbin' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          ref: ${{ inputs.ref }}
+
+      - 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 source snapshot release
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ inputs.version }}
+          target_commitish: ${{ inputs.ref }}
+          name: ${{ inputs.version }}
+          body_path: SNAPSHOT_RELEASE_NOTES.md
+          draft: false
+          prerelease: false
+          files: |
+            dist/${{ inputs.basename }}.tar.gz
+            dist/${{ inputs.basename }}.zip


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

Reply via email to