diff --git a/.github/workflows/scaffold-cross-platform.yml b/.github/workflows/scaffold-cross-platform.yml new file mode 100644 index 0000000..f209c34 --- /dev/null +++ b/.github/workflows/scaffold-cross-platform.yml @@ -0,0 +1,102 @@ +name: Cross-platform scaffold smoke + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: scaffold-cross-platform-${{ github.ref }} + cancel-in-progress: true + +env: + # Full registry URLs: published PyPI 0.1.0 does not resolve catalog slugs. + # After create-awesome-python-app>=0.2.0 ships resolve_catalog_spec, slugs also work. + CPA_TEMPLATE_FASTAPI: https://github.com/Create-Python-App/cpa-templates?subdir=templates/fastapi-starter + CPA_ADDON_DOCKER: https://github.com/Create-Python-App/cpa-templates?subdir=extensions/python-docker + +jobs: + scaffold: + name: ${{ matrix.os }} / fastapi-starter + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: astral-sh/setup-uv@v7 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Scaffold FastAPI starter from PyPI CLI + env: + TARGET: ${{ runner.temp }}/cpa-fastapi-starter + shell: bash + run: | + set -euo pipefail + # Options before project_directory — Typer treats a leading path as the + # positional arg; trailing options after a bare path can be misparsed. + uvx create-awesome-python-app@latest \ + --template "$CPA_TEMPLATE_FASTAPI" \ + --no-interactive \ + --no-install \ + --force \ + "$TARGET" + + - name: Verify scaffolded project + env: + TARGET: ${{ runner.temp }}/cpa-fastapi-starter + shell: bash + run: | + set -euo pipefail + python - <<'PY' + import os + from pathlib import Path + + target = Path(os.environ["TARGET"]) + required = [ + target / "pyproject.toml", + target / "app" / "main.py", + target / "README.md", + ] + missing = [str(path) for path in required if not path.exists()] + if missing: + raise SystemExit(f"Missing scaffolded files: {missing}") + print(f"Verified scaffold at {target}") + PY + + addon-smoke: + name: ubuntu-latest / fastapi-starter + python-docker + runs-on: ubuntu-latest + steps: + - uses: astral-sh/setup-uv@v7 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Scaffold with one extension from PyPI CLI + env: + TARGET: ${{ runner.temp }}/cpa-fastapi-docker + run: | + set -euo pipefail + uvx create-awesome-python-app@latest \ + --template "$CPA_TEMPLATE_FASTAPI" \ + --addons "$CPA_ADDON_DOCKER" \ + --no-interactive \ + --no-install \ + --force \ + "$TARGET" + + - name: Verify extension files + env: + TARGET: ${{ runner.temp }}/cpa-fastapi-docker + run: | + set -euo pipefail + test -f "$TARGET/Dockerfile" + test -f "$TARGET/.dockerignore" diff --git a/docs/CPA_TEMPLATES_TRACKING.md b/docs/CPA_TEMPLATES_TRACKING.md index 9285345..be48c5b 100644 --- a/docs/CPA_TEMPLATES_TRACKING.md +++ b/docs/CPA_TEMPLATES_TRACKING.md @@ -31,7 +31,8 @@ uvx create-awesome-python-app@latest … It must **not** check out this monorepo or fall back to `uv run` against a local source tree. That way green Actions means the same binary users install works with the templates under test. -CLI CI in this repo stays focused on unit/lint/type/smoke-distribution (`uvx` / Docker / brew / AUR). +CLI CI in this repo stays focused on unit/lint/type, cross-platform scaffold +smoke via published `uvx`, and smoke-distribution (`uvx` / Docker / brew / AUR). ## CNA parity reference