Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0dafec4cb | ||
| 075041f371 | |||
| 981d5211b6 | |||
|
e0988cf23b
|
|||
|
22813bab65
|
|||
| d5cf0a8636 | |||
|
d6aeabc0a9
|
|||
|
5456f8e740
|
|||
|
26ebe3b40e
|
|||
|
25bc94dfa5
|
|||
|
0c251ac807
|
@@ -75,6 +75,18 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
git config user.name "Gitea CI"
|
git config user.name "Gitea CI"
|
||||||
git config user.email "ci@git.theprivateserver.de"
|
git config user.email "ci@git.theprivateserver.de"
|
||||||
|
|
||||||
|
- name: Determine branch to push to
|
||||||
|
id: push_branch
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||||
|
# workflow_dispatch runs on a branch ref like refs/heads/main
|
||||||
|
BRANCH=${GITHUB_REF#refs/heads/}
|
||||||
|
else
|
||||||
|
# for a merged PR use the PR base ref (target branch)
|
||||||
|
BRANCH=${{ github.event.pull_request.base.ref }}
|
||||||
|
fi
|
||||||
|
echo "PUSH_BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
id: bump
|
id: bump
|
||||||
run: |
|
run: |
|
||||||
@@ -133,7 +145,7 @@ jobs:
|
|||||||
uses: ad-m/github-push-action@master
|
uses: ad-m/github-push-action@master
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
branch: ${{ github.ref }}
|
branch: ${{ env.PUSH_BRANCH }}
|
||||||
- name: Build Changelog
|
- name: Build Changelog
|
||||||
id: build_changelog
|
id: build_changelog
|
||||||
uses: https://github.com/mikepenz/release-changelog-builder-action@v5
|
uses: https://github.com/mikepenz/release-changelog-builder-action@v5
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ on:
|
|||||||
types: [opened, synchronize, edited, reopened]
|
types: [opened, synchronize, edited, reopened]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-smoke:
|
build-image:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -17,24 +17,48 @@ jobs:
|
|||||||
|
|
||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@v5
|
uses: astral-sh/setup-uv@v5
|
||||||
- name: Set up Python
|
|
||||||
run: uv python install
|
- name: (optional) Prepare dependencies
|
||||||
with:
|
|
||||||
python-version-file: "pyproject.toml"
|
|
||||||
- name: Install the project dependencies
|
|
||||||
run: |
|
run: |
|
||||||
uv sync --all-groups
|
uv python install --python-version-file pyproject.toml || true
|
||||||
uv add pip
|
uv sync --all-groups || true
|
||||||
uv export --format requirements.txt -o requirements.txt
|
uv add pip || true
|
||||||
# uv run python -m pip install --upgrade pip
|
uv export --format requirements.txt -o requirements.txt || true
|
||||||
# uv run python -m pip install -r requirements.txt
|
|
||||||
- name: Build image
|
- name: Build image
|
||||||
run: |
|
run: |
|
||||||
docker build -t semapform-api:test-pr .
|
docker build -t semapform-api:test-pr .
|
||||||
|
|
||||||
|
- name: Save image artifact
|
||||||
|
run: |
|
||||||
|
docker save semapform-api:test-pr -o semapform-api.tar
|
||||||
|
|
||||||
|
- name: Upload image artifact
|
||||||
|
uses: https://github.com/christopherHX/gitea-upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: semapform-image
|
||||||
|
path: semapform-api.tar
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
smoke-tests:
|
||||||
|
needs: build-image
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download image artifact
|
||||||
|
uses: christopherhx/gitea-download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: semapform-image
|
||||||
|
|
||||||
|
- name: Restore image
|
||||||
|
run: |
|
||||||
|
docker load -i semapform-api.tar
|
||||||
|
|
||||||
- name: Start container (background)
|
- name: Start container (background)
|
||||||
run: |
|
run: |
|
||||||
# do NOT bind the container port to the host to avoid port conflicts on the runner
|
|
||||||
docker run -d --name semapform-test semapform-api:test-pr sleep infinity
|
docker run -d --name semapform-test semapform-api:test-pr sleep infinity
|
||||||
|
|
||||||
- name: Start server in container and smoke test HTTP (in-container)
|
- name: Start server in container and smoke test HTTP (in-container)
|
||||||
@@ -46,7 +70,6 @@ jobs:
|
|||||||
# show container status to aid debugging
|
# show container status to aid debugging
|
||||||
docker ps -a --filter name=semapform-test || true
|
docker ps -a --filter name=semapform-test || true
|
||||||
|
|
||||||
# perform a readiness loop (try container-local /health) using small execs
|
|
||||||
echo "waiting for service to become ready inside container"
|
echo "waiting for service to become ready inside container"
|
||||||
set -e
|
set -e
|
||||||
READY=0
|
READY=0
|
||||||
@@ -64,11 +87,9 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run the repository smoke-test script inside the container and surface its output
|
|
||||||
echo "running test_api.py inside container"
|
echo "running test_api.py inside container"
|
||||||
docker exec semapform-test python test_api.py || true
|
docker exec semapform-test python test_api.py || true
|
||||||
|
|
||||||
# dump the last 200 lines of logs so this step always displays useful output
|
|
||||||
docker logs semapform-test --tail 200 || true
|
docker logs semapform-test --tail 200 || true
|
||||||
|
|
||||||
- name: Cleanup container
|
- name: Cleanup container
|
||||||
|
|||||||
@@ -12,6 +12,28 @@ from fastapi.responses import JSONResponse
|
|||||||
|
|
||||||
app = FastAPI(title="Signature Validation API")
|
app = FastAPI(title="Signature Validation API")
|
||||||
|
|
||||||
|
# Optional path prefix support: when behind a reverse-proxy that uses a
|
||||||
|
# URL prefix (eg. `https://api.example.tld/library/...`) set `API_PREFIX` to
|
||||||
|
# that prefix (example: `/library`) so incoming requests are rewritten to the
|
||||||
|
# application root. This keeps route definitions unchanged while supporting
|
||||||
|
# both proxied and direct deployments.
|
||||||
|
_api_prefix_raw = os.getenv("API_PREFIX", "").strip()
|
||||||
|
api_prefix = ""
|
||||||
|
if _api_prefix_raw:
|
||||||
|
if not _api_prefix_raw.startswith("/"):
|
||||||
|
_api_prefix_raw = "/" + _api_prefix_raw
|
||||||
|
api_prefix = _api_prefix_raw.rstrip("/")
|
||||||
|
|
||||||
|
|
||||||
|
@app.middleware("http")
|
||||||
|
async def _strip_api_prefix(request, call_next):
|
||||||
|
if api_prefix and request.url.path.startswith(api_prefix):
|
||||||
|
new_path = request.url.path[len(api_prefix) :]
|
||||||
|
request.scope["path"] = new_path or "/"
|
||||||
|
request.scope["root_path"] = api_prefix
|
||||||
|
return await call_next(request)
|
||||||
|
|
||||||
|
|
||||||
# Allow PHP application to call this API
|
# Allow PHP application to call this API
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
CORSMiddleware,
|
CORSMiddleware,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "semapform-api"
|
name = "semapform-api"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
description = "Add your description here"
|
description = "Add your description here"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bibapi>=0.0.5",
|
"bibapi[catalogue]>=0.0.6",
|
||||||
"fastapi>=0.122.0",
|
"fastapi>=0.122.0",
|
||||||
"pip>=25.3",
|
"pip>=25.3",
|
||||||
"uvicorn>=0.38.0",
|
"uvicorn>=0.38.0",
|
||||||
@@ -15,7 +15,7 @@ name = "gitea"
|
|||||||
url = "https://git.theprivateserver.de/api/packages/PHB/pypi/simple/"
|
url = "https://git.theprivateserver.de/api/packages/PHB/pypi/simple/"
|
||||||
|
|
||||||
[tool.bumpversion]
|
[tool.bumpversion]
|
||||||
current_version = "0.1.2"
|
current_version = "0.1.3"
|
||||||
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
||||||
serialize = ["{major}.{minor}.{patch}"]
|
serialize = ["{major}.{minor}.{patch}"]
|
||||||
search = "{current_version}"
|
search = "{current_version}"
|
||||||
|
|||||||
Reference in New Issue
Block a user