Cloud/session: - fix(_extract_session_token): return "" for non-JWT cookie strings (snipe_guest=uuid was triggering 401 → forced login redirect for all unauthenticated cloud visitors) - fix(affiliate): exclude guest: and anonymous users from pref-store writes (#38) - fix(market-comp): use enriched comp_query for market comp hash so write/read keys match (#30) Frontend: - feat(SearchView): unauthenticated landing strip with free-account CTA (#36) - feat(SearchView): aria-pressed on filter toggles, aria-label on icon buttons, focus-visible rings on all interactive controls, live region for result count (#35) - feat(SearchView): no-results empty-state hint text (#36) - feat(SEO): og:image 1200x630, summary_large_image twitter card, canonical link (#37) - feat(OG): generated og-image.png (dark tactical theme, feature pills) (#37) - feat(settings): TrustSignalPref view wired to /settings route (#28) - fix(router): /settings route added; unauthenticated access redirects to home (#34) CI/CD: - feat(ci): Forgejo Actions workflow (ruff + pytest + vue-tsc + vitest) (#22) - feat(ci): mirror workflow (GitHub + Codeberg on push to main/tags) (#22) - feat(ci): release workflow (Docker build+push + git-cliff changelog) (#22) - chore: git-cliff config (.cliff.toml) for conventional commit changelog (#22) - chore(pyproject): dev extras (pytest/ruff/httpx), ruff config with ignore list (#22) Lint: - fix: remove 11 unused imports across api/, app/, tests/ (ruff F401 clean)
92 lines
3.3 KiB
YAML
92 lines
3.3 KiB
YAML
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags: ['v*']
|
|
|
|
env:
|
|
# Forgejo container registry (BSL product — not pushing to public GHCR)
|
|
# cf-agents#3: revisit public registry policy before enabling GHCR push
|
|
REGISTRY: git.opensourcesolarpunk.com
|
|
IMAGE_API: git.opensourcesolarpunk.com/circuit-forge/snipe-api
|
|
IMAGE_WEB: git.opensourcesolarpunk.com/circuit-forge/snipe-web
|
|
|
|
jobs:
|
|
release:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
# ── Changelog ────────────────────────────────────────────────────────────
|
|
- name: Generate changelog
|
|
uses: orhun/git-cliff-action@v3
|
|
id: cliff
|
|
with:
|
|
config: .cliff.toml
|
|
args: --latest --strip header
|
|
env:
|
|
OUTPUT: CHANGES.md
|
|
|
|
# ── Docker ───────────────────────────────────────────────────────────────
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@v3
|
|
|
|
- name: Set up Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Log in to Forgejo registry
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.FORGEJO_RELEASE_TOKEN }}
|
|
|
|
# API image — built with circuitforge-core sibling from GitHub mirror
|
|
- name: Checkout circuitforge-core
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: CircuitForgeLLC/circuitforge-core
|
|
path: circuitforge-core
|
|
|
|
- name: Build and push API image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
file: Dockerfile
|
|
push: true
|
|
platforms: linux/amd64,linux/arm64
|
|
tags: |
|
|
${{ env.IMAGE_API }}:${{ github.ref_name }}
|
|
${{ env.IMAGE_API }}:latest
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
- name: Build and push web image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
file: docker/web/Dockerfile
|
|
push: true
|
|
platforms: linux/amd64,linux/arm64
|
|
tags: |
|
|
${{ env.IMAGE_WEB }}:${{ github.ref_name }}
|
|
${{ env.IMAGE_WEB }}:latest
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
# ── Forgejo Release ───────────────────────────────────────────────────────
|
|
- name: Create Forgejo release
|
|
env:
|
|
FORGEJO_TOKEN: ${{ secrets.FORGEJO_RELEASE_TOKEN }}
|
|
REPO: ${{ github.event.repository.name }}
|
|
TAG: ${{ github.ref_name }}
|
|
NOTES: ${{ steps.cliff.outputs.content }}
|
|
run: |
|
|
curl -sS -X POST \
|
|
"https://git.opensourcesolarpunk.com/api/v1/repos/Circuit-Forge/${REPO}/releases" \
|
|
-H "Authorization: token ${FORGEJO_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$(jq -n --arg tag "$TAG" --arg body "$NOTES" \
|
|
'{tag_name: $tag, name: $tag, body: $body}')"
|