blob: 2c3e2e6b82c018b86ffc290d6bf873f1863a9652 [file]
# 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: Release
# Releases are NOT automatic. A release manager pushes a git tag manually:
# * v1.7.0-rc1 -> publishes a GitHub *pre-release* only (artifact for the Apache vote)
# * v1.7.0 -> publishes a GitHub *release* and pushes the package to PyPI
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
release:
name: Manual Tag Release
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Resolve Tag
id: tag
run: |
set -euo pipefail
TAG="${GITHUB_REF_NAME}"
VERSION="${TAG#v}"
if [[ "$VERSION" =~ ^([0-9]+\.[0-9]+\.[0-9]+)-[Rr][Cc]([0-9]+)$ ]]; then
BASE_VERSION="${BASH_REMATCH[1]}"
RC_NUMBER="${BASH_REMATCH[2]}"
IS_RC=true
elif [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
BASE_VERSION="$VERSION"
RC_NUMBER=""
IS_RC=false
else
echo "::error::Tag '$TAG' is not a supported release tag (expected vX.Y.Z or vX.Y.Z-rcN)."
exit 1
fi
# The source release must describe its own version, so pyproject.toml
# has to be bumped and committed before the tag is pushed.
PROJECT_VERSION="$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")"
if [[ "$PROJECT_VERSION" != "$BASE_VERSION" ]]; then
echo "::error::pyproject.toml version ($PROJECT_VERSION) does not match tag version ($BASE_VERSION). Bump pyproject.toml before tagging."
exit 1
fi
# Apache source release artifact naming. The RC number is intentionally
# NOT part of the file name, so the bits that get voted on are byte
# identical to the bits published for the final release.
ARTIFACT="apache-casbin-django-orm-adapter-${BASE_VERSION}-incubating-src.tar.gz"
{
echo "tag=$TAG"
echo "base_version=$BASE_VERSION"
echo "rc_number=$RC_NUMBER"
echo "is_rc=$IS_RC"
echo "artifact=$ARTIFACT"
} >> "$GITHUB_OUTPUT"
- name: Build Apache Source Package
run: |
set -euo pipefail
ARTIFACT="${{ steps.tag.outputs.artifact }}"
# The tarball unpacks into a single top level directory named after the
# artifact, and contains sources only - no binaries, no VCS metadata.
git archive --format=tar.gz \
--prefix="${ARTIFACT%.tar.gz}/" \
-o "$ARTIFACT" HEAD
sha512sum "$ARTIFACT" > "$ARTIFACT.sha512"
- name: Publish GitHub Pre-Release
if: steps.tag.outputs.is_rc == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
ARTIFACT="${{ steps.tag.outputs.artifact }}"
gh release create "${{ steps.tag.outputs.tag }}" \
--title "v${{ steps.tag.outputs.base_version }}-rc${{ steps.tag.outputs.rc_number }}" \
--prerelease \
--notes "Release candidate ${{ steps.tag.outputs.rc_number }} for version ${{ steps.tag.outputs.base_version }}. This is not an official release; it is the source package for the Apache vote. Release managers should download \`$ARTIFACT\`, sign it locally, and use it for the vote." \
"$ARTIFACT" "$ARTIFACT.sha512"
- name: Publish GitHub Release
if: steps.tag.outputs.is_rc == 'false'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
ARTIFACT="${{ steps.tag.outputs.artifact }}"
gh release create "${{ steps.tag.outputs.tag }}" \
--title "v${{ steps.tag.outputs.base_version }}" \
--notes "Version ${{ steps.tag.outputs.base_version }}. The official source package is \`$ARTIFACT\`." \
"$ARTIFACT" "$ARTIFACT.sha512"
- name: Publish to PyPI
if: steps.tag.outputs.is_rc == 'false'
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
set -euo pipefail
python -m pip install --upgrade build twine
python -m build
python -m twine upload dist/*