From 31914cf1ea62d336d17fd34b135fd6cc5b7152bf Mon Sep 17 00:00:00 2001 From: cooronx <2197083441@qq.com> Date: Sat, 25 Apr 2026 18:41:54 +0800 Subject: [PATCH] fix: replace semantic-release with source release workflows --- .github/workflows/default.yml | 19 --- .github/workflows/source-release-draft.yml | 137 +++++++++++++++++++ .github/workflows/source-snapshot.yml | 150 +++++++++++++++++++++ .releaserc.json | 16 --- Makefile | 3 - 5 files changed, 287 insertions(+), 38 deletions(-) create mode 100644 .github/workflows/source-release-draft.yml create mode 100644 .github/workflows/source-snapshot.yml delete mode 100644 .releaserc.json diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml index 86bdc0fb2..68817582a 100644 --- a/.github/workflows/default.yml +++ b/.github/workflows/default.yml @@ -38,22 +38,3 @@ jobs: - name: Run go test bench run: make benchmark - - semantic-release: - needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Run semantic-release - if: github.repository == 'casbin/casbin' && github.event_name == 'push' - run: make release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/source-release-draft.yml b/.github/workflows/source-release-draft.yml new file mode 100644 index 000000000..5caa3f7c7 --- /dev/null +++ b/.github/workflows/source-release-draft.yml @@ -0,0 +1,137 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Build Source Release Draft + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + build-source-release-draft: + if: ${{ github.repository == 'apache/casbin' && !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="casbin-${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="${CURRENT_TAG#v}" + 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 "${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: Casbin ${{ 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 000000000..ddc6e82f1 --- /dev/null +++ b/.github/workflows/source-snapshot.yml @@ -0,0 +1,150 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Build Source Snapshot + +on: + push: + branches: + - master + workflow_dispatch: + +permissions: + contents: write + +jobs: + build-source-snapshot: + if: ${{ github.repository == 'apache/casbin' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Compute snapshot metadata + 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}" + IFS='.' read -r MAJOR MINOR PATCH <<< "${RELEASE_VERSION}" + BASE_VERSION="${MAJOR}.$((MINOR + 1)).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}" + BASENAME="casbin-${SNAPSHOT_VERSION#v}-src" + + if [ "${LAST_SNAPSHOT_NUMBER}" -gt 0 ]; then + CHANGELOG_START_TAG="v${BASE_VERSION}-snapshot.${LAST_SNAPSHOT_NUMBER}" + else + CHANGELOG_START_TAG="${LATEST_RELEASE_TAG}" + fi + + echo "latest_release_tag=${LATEST_RELEASE_TAG}" >> "${GITHUB_OUTPUT}" + echo "changelog_start_tag=${CHANGELOG_START_TAG}" >> "${GITHUB_OUTPUT}" + echo "base_version=${BASE_VERSION}" >> "${GITHUB_OUTPUT}" + echo "number=${NEXT_SNAPSHOT_NUMBER}" >> "${GITHUB_OUTPUT}" + echo "version=${SNAPSHOT_VERSION}" >> "${GITHUB_OUTPUT}" + echo "basename=${BASENAME}" >> "${GITHUB_OUTPUT}" + + - name: Generate snapshot release notes + run: | + PREVIOUS_TAG="${{ steps.snapshot.outputs.changelog_start_tag }}" + CURRENT_TAG="${{ steps.snapshot.outputs.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="${{ steps.snapshot.outputs.basename }}/" -o "dist/${{ steps.snapshot.outputs.basename }}.tar.gz" HEAD + git archive --format=zip --prefix="${{ steps.snapshot.outputs.basename }}/" -o "dist/${{ steps.snapshot.outputs.basename }}.zip" HEAD + + - name: Create snapshot GitHub release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.snapshot.outputs.version }} + target_commitish: ${{ github.sha }} + name: ${{ steps.snapshot.outputs.version }} + body_path: SNAPSHOT_RELEASE_NOTES.md + draft: false + prerelease: false + files: | + dist/${{ steps.snapshot.outputs.basename }}.tar.gz + dist/${{ steps.snapshot.outputs.basename }}.zip diff --git a/.releaserc.json b/.releaserc.json deleted file mode 100644 index 58cb0bb4c..000000000 --- a/.releaserc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "debug": true, - "branches": [ - "+([0-9])?(.{+([0-9]),x}).x", - "master", - { - "name": "beta", - "prerelease": true - } - ], - "plugins": [ - "@semantic-release/commit-analyzer", - "@semantic-release/release-notes-generator", - "@semantic-release/github" - ] -} diff --git a/Makefile b/Makefile index 64546af2a..19868ad25 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,3 @@ benchmark: lint: golangci-lint run --verbose - -release: - npx semantic-release@v19.0.2