Repository navigation
[DX-3325] Release automático del SDK al mergear PRs con label release:* - #138
Merged
pibahamondesw merged 3 commits intoNov 6, 2026
Conversation
pibahamondesw
force-pushed
the
dx-3325-release-automatico-de-fintoc-python-al-mergear-prs-con-label
branch
from
November 6, 2026 13:32
e78bfa4 to
1b07d98
Compare
Contributor
Author
|
fin review |
pibahamondesw
force-pushed
the
dx-3325-release-automatico-de-fintoc-python-al-mergear-prs-con-label
branch
from
November 6, 2026 13:37
1b07d98 to
1316d8f
Compare
Contributor
Author
|
fin review |
pibahamondesw
force-pushed
the
dx-3325-release-automatico-de-fintoc-python-al-mergear-prs-con-label
branch
from
November 6, 2026 13:49
1316d8f to
9472e8c
Compare
Contributor
Author
|
fin review |
pibahamondesw
marked this pull request as ready for review
November 6, 2026 21:24
pibahamondesw
deleted the
dx-3325-release-automatico-de-fintoc-python-al-mergear-prs-con-label
branch
November 6, 2026 21:26
7 tasks done
pibahamondesw
added a commit
that referenced
this pull request
Nov 7, 2026
…139) ## Description **Contexto.** El release automático (#138) publica en PyPI y recién después, en `release/finalize`, empuja el commit de versión y el tag. Si alguien mergea a `master` mientras corre el release, ese push se rechaza con el paquete ya publicado, sin tag ni GitHub Release. fintoc-com/release-action#3 agregó `push: 'true'` a `prepare` para empujar antes de publicar. Issue: [DX-3387](https://linear.app/fintoc/issue/DX-3387/fintoc-python-empujar-commit-y-tag-antes-de-publicar). **¿Qué hay de nuevo?** - [x] `release/prepare` corre con `push: 'true'`: empuja el commit de versión y el tag a `master` en un push atómico y sin force, antes de `poetry build` y de publicar. - Si `master` se movió durante el release, el push se rechaza y no se publica nada. - `release/finalize` ve el tag en el remote, se salta el push y solo crea el GitHub Release. - [x] El chequeo de commits posteriores al PR solo deja pasar commits `release: ` cuyo autor es `fin-releases[bot]`. Antes bastaba el prefijo del mensaje, así que un PR humano titulado `release: ...` se colaba. Es el mismo filtro de fintoc-com/fintoc-cli#62. - [x] `RELEASING.md` documenta el nuevo orden y sus modos de falla en la tabla *Si falla*. **Tests** - [x] `actionlint` sobre `release.yml`: 8 hallazgos, los mismos que en `origin/master` (actions `@v3`, label de Blacksmith, el typo `steps.poetry-cache`, `$HOME` sin comillas). La línea nueva no agrega ninguno. - [x] El filtro nuevo de `compare`, probado contra la historia real del repo: `31abd1b...d170905` lista `88c1ef6 d170905` y omite `d54ea49` (`release: v2.29.0` de `fin-releases[bot]`); un rango con solo el commit de versión y el mismo SHA no listan nada. Todos los commits `release: ` recientes los autorea `fin-releases[bot]`. - [x] `shellcheck .github/scripts/*.sh` sin hallazgos. - [x] `.github/scripts/resolve-release.test.sh` pasa (incluye "push sin PR mergeado se salta", que cubre el run del commit de versión). ## Release notes <!-- Sin release: cambio de CI. --> ## Requirements None. ## Additional changes None. ## Consideraciones - El checkout del job `release` ya es por nombre de rama (`ref: master`), así que `HEAD` no queda detached y el push de `prepare` funciona sin más cambios. - El chequeo de "commits posteriores al PR" queda igual: detecta lo que se mergeó antes de que arrancara el job. El push sin force de `prepare` cubre lo que se mergea durante el job. - El commit de versión, ahora empujado antes de publicar, sigue disparando un run de `release` que no hace nada: no tiene PR mergeado asociado, así que `resolve` deja `bump` vacío y el job `release` queda *skipped*. - Cambio de trade-off: las notas de respaldo (`generate-notes`), `poetry build` y la publicación en PyPI ahora corren después del push. Si fallan, el tag queda en `master` sin paquete en PyPI. El recovery (publicar desde el tag o saltarse la versión) está en `RELEASING.md`. Se acepta porque es menos dañino que un paquete publicado sin tag, y porque `generate-notes` ya funciona con el tag existente en el remote. - Re-correr el job después de que el push entró publica la versión siguiente, no la que falló. Quedó escrito en `RELEASING.md`. - Este PR no lleva label `release:*`, así que al mergearlo no publica. ¿Es seguro hacer rollback? Sí ¿Cuáles son los pasos para hacer rollback? Revert PR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Contexto. Hoy el SDK solo se publica disparando a mano el workflow
release(workflow_dispatch). Queremos que los SDK se publiquen solos al mergear, sin darle a Composeactions: writepara disparar el workflow. Se acordó que el release salga de GitHub Actions al mergear a la rama principal, con la misma convención en fintoc-ruby, fintoc-node y fintoc-cli. Issue: DX-3325.¿Qué hay de nuevo?
releasetambién corre en push amaster. Elworkflow_dispatchqueda igual, como respaldo manual.resolvedecidebumpy notas:merge_commit_shaes el commit pusheado (commits/{sha}/pulls, con hasta 3 intentos cada 10 s si GitHub todavía no lo asocia). El bump sale de su labelrelease:patch|minor|major.release:*no se publica: el jobreleasequeda skipped, no falla. Esto cubre también el commit de versión que empujaprepare, que no tiene PR.release:*(o uno desconocido) hace fallar el workflow con un mensaje claro.## Release notesdel body del PR, hasta el siguiente##, sin comentarios HTML.releases/generate-notescon el tag deprepare). Aplica también alworkflow_dispatchsin notas.releasetieneconcurrency: releasesincancel-in-progress, para que nunca corran dos releases a la vez. Está a nivel de job para que los pushes sin release (que solo correnresolve) no ocupen el grupo ni desplacen un release pendiente.blacksmith-2vcpu-ubuntu-2404. PyPI se publica conPYPI_API_TOKENy no con trusted publishing, así quereleasepuede correr en Blacksmith.releaseparte demastery, en push, aborta antes de publicar simastertiene otros commits después del PR mergeado (ver Consideraciones).## Release notes, justo después de Description, que explica la convención.RELEASING.mddocumenta el flujo nuevo.Tests
.github/scripts/resolve-release.test.sh(corre en CI, jobrelease-scriptsdetests) cubre: sección al final con comentarios, sección seguida de otra (con\r\n), solo comentario, sin sección, sin label, dos labels, label desconocido, PR no mergeado,workflow_dispatchcon y sin notas.comparedel chequeo, probada contra este repo: con el mismo SHA no lista nada, un commitrelease: v2.29.0posterior se ignora, y commits de otro PR se listan.generate-notesprobado contra este repo con un tag inexistente y el SHA completo demaster.actionlintyshellcheck: lo nuevo no tiene hallazgos. Solo quedan los que ya existían enmaster(actions@v3, el typosteps.poetry-cache,$HOMEsin comillas), que no toqué.Release notes
Requirements
Ver Consideraciones: hay que crear los labels antes de mergear.
Additional changes
None.
Consideraciones
release:patch,release:minoryrelease:majoren el repo. Sin ellos, los PRs nunca van a publicar.## Release notesen sus PRs) lo ve Francisca.env:o por archivo, nunca interpolados con${{ }}en unrun:.resolvetiene permisos mínimos (contents: read,pull-requests: read).generate-notescorre justo después depreparey antes de publicar en PyPI, así que si falla no queda nada publicado..github/pull_request_template.md, que es el que GitHub usa por defecto.PULL_REQUEST_TEMPLATE/release.mdsolo se aplica con?template=release.mdy es un template antiguo de descripción de versión, así que no lo toqué. El template está en inglés, así que la sección nueva también.## Release notesva justo después de Description y no al final. Así la sección siguiente la cierra y no se cuela en las notas públicas lo que venga después, como el footer de Compose (🤖🐙 Created with Compose · [View session](…)). Compose sigue el orden del template, así que esto le sirve si mantiene ese orden.releasehace checkout demastery no degithub.sha. Así un release que quedó en cola parte del commit de versión del anterior y no calcula un tag que ya existe. A cambio, en push verifica antes de publicar quemasterno tenga commits posteriores agithub.shaaparte de commitsrelease: .... Si los tiene, aborta sin publicar, para no sacar cambios de otro PR con el bump y las notas de este. El siguiente release los incluye, o se usa el dispatch si hace falta un bump mayor.concurrencydeja un solo run pendiente por grupo. Con tres merges con label seguidos, el del medio se cancela y su cambio sale en el siguiente release (o se rescata con el dispatch).mastermientras corre el release, el push definalizefalla después de publicar en PyPI (el recovery está enRELEASING.md). La solución de raíz (rebase antes del push) va enrelease-action.resolve-release.shy su test son los mismos de fintoc-ruby ([DX-3324] Release automático al mergear PRs con label release:* fintoc-ruby#47), para mantener una sola implementación en los 4 SDKs.release:*, así que al mergearlo no publica.¿Es seguro hacer rollback? Sí
¿Cuáles son los pasos para hacer rollback? Revert PR