aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/publish.yml
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2026-08-17 15:44:37 -0300
committerElvis Claros Castro <elvis@claros.ar>2026-08-17 15:44:37 -0300
commite31c0d38d1347d12a4e29f1ccdb2602b1a1ea169 (patch)
treea6b51d9bcdf4508055c77013911e8e3585619311 /.github/workflows/publish.yml
parent0a08eb01eb882004d7094e029490531bb736f61c (diff)
downloadclaude-logbook-e31c0d38d1347d12a4e29f1ccdb2602b1a1ea169.tar.gz
claude-logbook-e31c0d38d1347d12a4e29f1ccdb2602b1a1ea169.zip
Publicar en PyPI desde el release, sin tokens
Trusted publishing: PyPI confía en este workflow por OIDC y no hay ningún secreto guardado en el repo. El único permiso que pide el job es id-token: write; el resto del workflow corre sin permisos. Antes de que sirva hay que dar de alta el pending publisher en pypi.org con los cuatro datos que espera (owner, repo, publish.yml, environment pypi). Incluye dos guardas antes de subir nada: - que el tag del release coincida con __version__, porque una versión subida a PyPI no se puede reemplazar, solo yankear; - twine check sobre el sdist y el wheel. Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
Diffstat (limited to '.github/workflows/publish.yml')
-rw-r--r--.github/workflows/publish.yml60
1 files changed, 60 insertions, 0 deletions
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..4fc675c
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,60 @@
+name: Publish
+
+# Publica en PyPI cuando se publica un release de GitHub.
+#
+# No hay ningún token guardado: PyPI confía en este workflow por OIDC
+# (trusted publishing). Del lado de pypi.org hay que haber dado de alta un
+# "pending publisher" con exactamente estos cuatro datos:
+#
+# Owner ElvisClaros
+# Repository claude-logbook
+# Workflow publish.yml
+# Environment pypi
+#
+# Si alguno no coincide, PyPI rechaza el upload.
+
+on:
+ release:
+ types: [published]
+
+permissions: {}
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+
+ environment:
+ name: pypi
+ url: https://pypi.org/p/claude-logbook
+
+ permissions:
+ id-token: write # lo único que habilita el trusted publishing
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
+
+ # El número vive en claude_logbook/__init__.py y es fácil olvidarse de
+ # subirlo. Mejor fallar acá que publicar algo mal rotulado: una versión
+ # subida a PyPI no se puede reemplazar nunca, solo yankear.
+ - name: El tag coincide con __version__
+ run: |
+ tag="${GITHUB_REF_NAME#v}"
+ ver="$(python -c 'import claude_logbook; print(claude_logbook.__version__)')"
+ echo "tag=$tag __version__=$ver"
+ test "$tag" = "$ver"
+
+ - name: Build
+ run: |
+ python -m pip install --upgrade build
+ python -m build
+
+ - name: Los artefactos están sanos
+ run: |
+ python -m pip install --upgrade twine
+ twine check dist/*
+
+ - uses: pypa/gh-action-pypi-publish@release/v1