name: release
on:
release:
types: [published]
permissions:
contents: read
jobs:
guard:
name: guard (tag == versions)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: bash scripts/check-versions.sh "${{ github.event.release.tag_name }}"
ci:
name: checks
needs: guard
uses: ./.github/workflows/checks.yml
crates:
name: publish to crates.io
needs: ci
runs-on: ubuntu-latest
environment: release
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- name: publish derive then florecon
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
ver() { grep -m1 '^version' "$1" | sed -E 's/.*"([^"]+)".*/\1/'; }
publish() {
local crate="$1" manifest="$2" v
v=$(ver "$manifest")
if curl -sf -A "florecon-release-ci" "https://crates.io/api/v1/crates/$crate/$v" >/dev/null; then
echo "✓ $crate@$v already on crates.io — skipping"
else
echo "→ publishing $crate@$v"
cargo publish -p "$crate"
fi
}
publish florecon-derive florecon-derive/Cargo.toml
publish florecon Cargo.toml
pypi:
name: publish to PyPI
needs: ci
runs-on: ubuntu-latest
environment: release
permissions:
id-token: write steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v8.2.0
- name: build wheel + sdist
working-directory: hosts/python
run: uv build
- name: publish (trusted publishing)
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: hosts/python/dist
skip-existing: true