From 55e328d615bd153fcd1776ad32ddc9fd50ad0479 Mon Sep 17 00:00:00 2001 From: Hadrien David Date: Sun, 2 Aug 2026 11:32:39 -0400 Subject: [PATCH] fix(ci): make release publishing retry-safe --- .github/workflows/doc.yml | 15 ++++++++------- .github/workflows/release.yml | 13 ++++++------- pyproject.toml | 28 +++++++++++++++++++++------- uv.lock | 28 +++++++++++++++------------- 4 files changed, 50 insertions(+), 34 deletions(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 0400ea3..e42778e 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -2,20 +2,21 @@ name: Build & Publish Doc on: push: - tags: - - '*' branches: + - main - docs/** workflow_dispatch: +concurrency: + group: docs + cancel-in-progress: true + jobs: Build-Doc: runs-on: ubuntu-latest - concurrency: release permissions: - contents: write - id-token: write + contents: read steps: - name: 📥 checkout uses: actions/checkout@v7 @@ -24,7 +25,7 @@ jobs: - name: 🔧 setup uv uses: ./.github/uv - name: ⚙️ install deps - run: uv sync --extra docs + run: uv sync --group docs - name: 📙 mkdocs build run: uv run mkdocs build - name: 📦 Upload artifacts @@ -44,4 +45,4 @@ jobs: uses: actions/deploy-pages@v4 environment: name: github-pages - url: ${{ steps.deployment.outputs.page_url }} \ No newline at end of file + url: ${{ steps.deployment.outputs.page_url }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59dddb9..1a62228 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,20 +18,19 @@ jobs: uses: actions/checkout@v7 with: fetch-depth: 0 + token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} - name: 🔧 setup uv uses: ./.github/uv - name: 📜 semantic release version & publish on PyPI run: | - RET_CODE=0 - uv run semantic-release --strict version || RET_CODE=$? - if [ $RET_CODE -ne 0 ]; then + next_version=$(uv run semantic-release version --print) + last_released_version=$(uv run semantic-release version --print-last-released) + if [[ "$next_version" == "$last_released_version" ]]; then echo "🙅🏽 Nothing to publish" else - echo "🙆🏽 Publishing on PyPI" - uv build - uv run twine upload dist/* + uv run semantic-release --strict version fi env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} diff --git a/pyproject.toml b/pyproject.toml index 09bc3ad..c2c7b5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,12 @@ Changelog = "https://github.com/hadrien/fastsqla/releases" license-files = [] [project.optional-dependencies] +sqlmodel = ["sqlmodel>=0.0.22"] + +[tool.uv] +package = true + +[dependency-groups] docs = [ "mkdocs-glightbox>=0.5.2", "mkdocs-llmstxt>=0.5.0", @@ -51,12 +57,6 @@ docs = [ "mkdocstrings[python]>=1.0.0", "pygments @ git+https://github.com/pygments/pygments.git@b6f6dab78e13652741d5e5811b4256b4dcb5fcd8", ] -sqlmodel = ["sqlmodel>=0.0.22"] - -[tool.uv] -package = true - -[dependency-groups] dev = [ "asgi-lifespan>=2.1.0", "coverage>=7.6.1", @@ -94,9 +94,23 @@ env = "GH_TOKEN" [tool.semantic_release] version_toml = ["pyproject.toml:project.version"] allow_zero_version = true +build_command = """ +uv lock && +git add uv.lock && +uv build && +uv run twine check dist/* && +uv run twine upload --non-interactive --skip-existing --verbose dist/* +""" +commit_message = """\ +chore(release): v{version} + +Automatically generated by python-semantic-release +""" [tool.semantic_release.commit_parser_options] -patch_tags = ["fix", "perf", "build"] +minor_tags = ["feat"] +patch_tags = ["build", "ci", "docs", "fix", "perf", "refactor", "style", "test"] +other_allowed_tags = ["chore"] [tool.semantic_release.changelog] mode = "init" diff --git a/uv.lock b/uv.lock index 87b6000..60dd4a3 100644 --- a/uv.lock +++ b/uv.lock @@ -399,13 +399,6 @@ dependencies = [ ] [package.optional-dependencies] -docs = [ - { name = "mkdocs-glightbox" }, - { name = "mkdocs-llmstxt" }, - { name = "mkdocs-material" }, - { name = "mkdocstrings", extra = ["python"] }, - { name = "pygments" }, -] sqlmodel = [ { name = "sqlmodel" }, ] @@ -427,20 +420,22 @@ dev = [ { name = "toml" }, { name = "twine" }, ] +docs = [ + { name = "mkdocs-glightbox" }, + { name = "mkdocs-llmstxt" }, + { name = "mkdocs-material" }, + { name = "mkdocstrings", extra = ["python"] }, + { name = "pygments" }, +] [package.metadata] requires-dist = [ { name = "fastapi", specifier = ">=0.115.6" }, - { name = "mkdocs-glightbox", marker = "extra == 'docs'", specifier = ">=0.5.2" }, - { name = "mkdocs-llmstxt", marker = "extra == 'docs'", specifier = ">=0.5.0" }, - { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.7.1" }, - { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=1.0.0" }, - { name = "pygments", marker = "extra == 'docs'", git = "https://github.com/pygments/pygments.git?rev=b6f6dab78e13652741d5e5811b4256b4dcb5fcd8" }, { name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.37" }, { name = "sqlmodel", marker = "extra == 'sqlmodel'", specifier = ">=0.0.22" }, { name = "structlog", specifier = ">=24.4.0" }, ] -provides-extras = ["docs", "sqlmodel"] +provides-extras = ["sqlmodel"] [package.metadata.requires-dev] dev = [ @@ -459,6 +454,13 @@ dev = [ { name = "toml", specifier = ">=0.10.2" }, { name = "twine", specifier = ">=5.1.1" }, ] +docs = [ + { name = "mkdocs-glightbox", specifier = ">=0.5.2" }, + { name = "mkdocs-llmstxt", specifier = ">=0.5.0" }, + { name = "mkdocs-material", specifier = ">=9.7.1" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=1.0.0" }, + { name = "pygments", git = "https://github.com/pygments/pygments.git?rev=b6f6dab78e13652741d5e5811b4256b4dcb5fcd8" }, +] [[package]] name = "ghp-import"