Publicación pública segura en GitHub
Regla principal
Protege la confianza pública antes que la velocidad. Prefiere una instantánea pública limpia, un PR/CI de rama de lanzamiento, artefactos de Release de GitHub verificados, sumas de verificación y la aprobación explícita del mantenedor para operaciones irreversibles.
Nunca publiques desde el historial privado en su lugar. Un repositorio que se creó como una instantánea pública limpia y se mantuvo privado solo para los retoques finales puede volverse público después de la compuerta de limpieza final. Usa PyPI/TestPyPI solo cuando la distribución del paquete Python esté realmente en el alcance.
Flujo de trabajo
- Inspecciona primero:
git status -sb, remotos, rama actual, etiquetas y flujos de trabajo relevantes.- Visibilidad del repositorio público, rama predeterminada, estado de release/etiqueta y entornos de GitHub con
gh. - Documentos existentes que mencionen rutas de instalación, publicación, Homebrew, TestPyPI, PyPI, repositorios privados, rutas locales o archivos de traspaso.
- Delimita la superficie pública:
- Los documentos públicos y los metadatos del paquete pueden mencionar el propietario/repositorio público, el nombre del paquete, las etiquetas públicas y los comandos de instalación oficiales.
- Los documentos públicos no deben mencionar nombres de repositorios privados, rutas de inicio locales,
HANDOFF.md,CONTINUITY.md,.local,.codex, tokens, claves, transcripciones internas sin procesar o instrucciones solo para mantenedores a menos que se reescriban como orientación para el público. - Prefiere enlaces relativos en README para documentos y medios locales del repositorio. Las URL absolutas de propietario/repositorio de GitHub están bien en las notas de la versión, pero en el README pueden crear un acoplamiento evitable con el propietario y falsos positivos en las comprobaciones de limpieza de la superficie pública.
- Prepara las compuertas de lanzamiento de GitHub:
- Compila/prueba localmente antes de la mutación remota.
- Usa
release/vX.Y.Z-> PR -> CI -> fusión por defecto antes de etiquetar. - Requiere la aprobación visual de Aki del README renderizado en GitHub antes de fusionar cuando el README o los archivos README localizados cambien.
- Verifica los activos de Release antes de la subida: nombres de archivo esperados, metadatos de versión, suma de verificación, contenido del archivo y comprobaciones de firma/notarización específicas de la plataforma cuando corresponda.
- Para activos
.appzip de macOS, compila el archivo sin metadatos AppleDouble o de Finder. PrefiereCOPYFILE_DISABLE=1 zipo un comando de archivo equivalente, y rechaza archivos que contengan__MACOSX,.DS_Storeo archivos._*. Esos archivos adicionales pueden hacer que una aplicación firmada falle en la verificación después de descomprimir. - Siempre verifica el archivo exacto que se subirá extrayéndolo a un directorio temporal, verificando los metadatos de la versión de la aplicación/paquete y ejecutando la verificación de firma/notarización correspondiente en la carga útil extraída.
- Publica la release de GitHub en este orden:
- Vuelve a obtener
main, verifica que la última CI esté en verde y confirma que el árbol de trabajo local esté limpio. - Confirma que la etiqueta de destino y la Release de GitHub no existan ya.
- Crea la etiqueta en el commit verificado de
main. - Empuja la etiqueta.
- Crea archivos de suma de verificación a partir de los archivos de subida finales usando nombres base orientados a la release, no rutas locales como
dist/.... - Crea la Release de GitHub con notas intencionales y solo activos intencionales.
- Sube archivos de suma de verificación cuando sean útiles para el tipo de activo e incluye la suma de verificación en las notas de la Release cuando ayude a los usuarios a verificar la descarga.
- Vuelve a obtener
- Verifica después de la publicación en GitHub:
- La etiqueta apunta al commit esperado.
- La Release de GitHub es visible en la URL esperada.
- Los activos de Release y las sumas de verificación coinciden con los archivos verificados localmente.
- Descarga los activos de Release publicados en un directorio temporal y verifícalos a partir de las copias descargadas. Para archivos respaldados por suma de verificación, ejecuta
shasum -a 256 -c <activo>.sha256; para zips.appde macOS, descomprime el activo descargado y ejecuta la versión de la aplicación y las comprobaciones decodesign --verify --strict --deepen la aplicación extraída. - El README/documentos públicos coinciden con la versión activa de la release y los nombres de los activos.
Subsección opcional de PyPI / TestPyPI
Usa esta subsección solo cuando la release de GitHub también publique un paquete Python, CLI o ruta de instalación uvx.
- Asegúrate de que existan entornos de GitHub para
testpypiypypi. - Mantén
pypidetrás de la aprobación del mantenedor. - Usa
id-token: writey Editores de Confianza de PyPI en lugar de tokens de PyPI almacenados. - Publica en este orden:
- Flujo de trabajo de solo compilación desde la etiqueta prevista.
- Archivo de Release de GitHub con
SHA256SUMSy atestaciones de artefacto. - Publicación en TestPyPI, luego prueba de instalación.
- Publicación en PyPI solo después de que TestPyPI muestre la versión y la prueba de instalación pase.
- Actualización de documentos para que la ruta de instalación activa sea la principal.
- Verifica después de publicar:
- El JSON de PyPI/TestPyPI contiene la versión esperada.
uvx --from <paquete> <comando> --helpfunciona.- La re-subida de la misma versión está bloqueada por las comprobaciones de preparación.
- El README/documentos públicos coinciden con la ruta de instalación activa.
Lista de verificación de instantánea pública solo en GitHub
Usa esto cuando el destino sea un repositorio de GitHub o una release de aplicación sin PyPI.
- Mantén el repositorio privado hasta que la compuerta final pase. Si el destino público es un repositorio separado ya público, nunca copies el historial privado en él; mueve solo el contenido de la instantánea limpiada.
- Usa una rama de lanzamiento y un PR por defecto para instantáneas públicas:
- Crea o actualiza
release/vX.Y.Zen el repositorio público. - Confirma la instantánea preparada y los documentos públicos en esa rama.
- Abre un PR en
mainy deja que la CI se ejecute allí. - Cuando el README o los documentos orientados a la release cambien, usa también
readme-release-syncpara que la copia pública se mantenga legible, bilingüe y alineada con el comportamiento enviado. - Dale a Aki enlaces de README renderizados por GitHub para el PR/rama y espera la aprobación visual explícita antes de fusionar. Las vistas previas locales de Markdown, las vistas de archivos sin procesar, las capturas de pantalla o las comprobaciones automatizadas de enlaces no reemplazan esta compuerta.
- Fusiona solo después de que la CI esté en verde y la limpieza de la superficie pública haya pasado.
- Empuja directamente a
mainsolo cuando Aki pida explícitamente saltarse la compuerta del PR.
- Crea o actualiza
- Limpia los archivos rastreados, no solo el árbol de trabajo:
- secretos, rutas locales, nombres de mantenedores, nombres de repositorios privados antiguos, archivos de traspaso, archivos generados y nombres de productos obsoletos.
git ls-filespara archivos.mov,.mp4, salidas de compilación, cachés y archivos binarios grandes.
- Trata los medios del README como parte de la superficie pública:
- Los GIF incrustados son el formato de demostración más fiable para README de GitHub; mantenlos por debajo del límite práctico de imagen/GIF de GitHub.
- Las inserciones de
<video>en README local y los enlaces de vista previa MP4 locales al repositorio pueden fallar o abrir páginas de vista previa de archivos inestables de GitHub. - Pon demostraciones MP4 opcionales en los activos de Release de GitHub solo cuando sean realmente necesarias, y elimínalas, junto con las referencias en las notas de la release, si el producto no las necesita.
- Antes de crear la etiqueta o la Release de GitHub, vuelve a obtener:
- Estado de fusión del PR y último estado de CI en
maindespués de la fusión. git status -sb,git log --oneline -1,git tag --listy activos de release actuales.- README y rutas de imagen referenciadas a través de la API de contenidos de GitHub cuando el repositorio ya sea público.
- Contenido del archivo y resultados de verificación de activos extraídos para cada subida binaria.
- Estado de fusión del PR y último estado de CI en
- Antes de cambiar la visibilidad, vuelve a obtener:
gh repo view ... --json visibility,isPrivate,url,defaultBranchRef.- Último estado de Actions para la rama predeterminada.
- Activos de Release y notas de release.
- README y rutas de imagen referenciadas a través de la API de contenidos de GitHub.
- Cambia la visibilidad solo después de que Aki diga explícitamente que publique, luego verifica
visibility=PUBLIC, disponibilidad de URL de README público, activos de Release y un árbol de trabajo local limpio.
Flujo de instantánea limpia a repositorio público
Usa este flujo cuando un repositorio privado/interno alimente un repositorio público separado.
- Termina y valida la funcionalidad en el repositorio privado.
- Crea una carpeta de instantánea temporal a partir de una lista blanca de archivos públicos.
- Aplica nombres públicos y elimina superficies solo privadas en la instantánea.
- Limpia la instantánea en busca de secretos, rutas privadas, archivos de traspaso, nombres de productos antiguos, archivos generados y archivos grandes accidentales.
- Copia la instantánea limpiada en el árbol de trabajo del repositorio público.
- Crea o cambia a
release/vX.Y.Z. - Actualiza el README público, README localizado, changelog, metadatos de versión, borrador de notas de release y referencias a medios del README en esa rama.
- Inspecciona
git diff, enlaces a medios del README, paridad bilingüe, redacción obsoleta y resultados de escaneo de superficie pública. - Ejecuta las comprobaciones locales relevantes de compilación/prueba/empaquetado.
- Confirma los cambios de preparación de release en
release/vX.Y.Zy empuja la rama. - Abre un PR en
main; no etiquetes ni crees una Release de GitHub todavía. - Espera a la CI, corrige fallos en la rama de release y vuelve a ejecutar comprobaciones.
- Envía a Aki las URL de README renderizadas por GitHub para
README.mdy cualquier archivo README localizado en el PR/rama. Espera la aprobación visual explícita de que el README se vea correcto en GitHub. - Fusiona el PR solo después de que la CI, las compuertas de limpieza y la aprobación visual del README renderizado por GitHub de Aki hayan pasado.
- Vuelve a obtener
mainy verifica que el commit fusionado esté limpio y en verde. - Detente para la aprobación de Aki antes de crear
vX.Y.Z, subir activos o crear/publicar la Release de GitHub.
Flujo sin repositorio público todavía
Usa esta ruta cuando el proyecto nunca ha tenido un repositorio público.
- No conviertas el repositorio de trabajo privado/interno en público.
- Crea un nuevo repositorio de publicación limpio y mantenlo privado al principio.
- Inicialízalo solo a partir de la instantánea pública limpiada, no del historial privado.
- Usa nombres de productos orientados al público, metadatos de paquete, archivos README, licencia, changelog, borrador de notas de release, capturas de pantalla/GIF y flujos de trabajo desde el principio.
- Ejecuta la misma limpieza de secretos/ruta privada/archivo grande/superficie pública en los archivos rastreados.
- Usa
release/vX.Y.Z-> PR -> CI -> aprobación visual del README renderizado por GitHub de Aki -> fusión, aunque el repositorio siga siendo privado. - Crea la etiqueta y el borrador de Release de GitHub previstos mientras el repositorio aún sea privado cuando sea posible, y verifica los activos/comprobaciones allí.
- Detente para la aprobación de Aki antes de cambiar la visibilidad.
- Cambia la visibilidad a público solo después de la limpieza final, CI en verde, activos de release intencionales y la aprobación explícita de Aki.
- Después del cambio de visibilidad, vuelve a obtener y verifica la disponibilidad del README público, los activos de Release, las etiquetas, el último estado de Actions y el árbol de trabajo local limpio.
Lecciones importantes
- Las definiciones de flujos de trabajo de GitHub Actions se toman de la ref utilizada para despachar el flujo de trabajo. Si se creó una etiqueta antes de agregar una nueva entrada o compuerta de flujo de trabajo, despachar desde esa etiqueta antigua no conocerá la nueva entrada.
- Las releases futuras deben colocar las compuertas de release antes de crear la etiqueta. Luego despacha desde esa etiqueta con las entradas protegidas.
- Si una etiqueta histórica única es anterior a la compuerta, no adivines. Ejecuta comprobaciones de preparación locales, prueba TestPyPI primero, verifica artefactos/atestaciones y documenta la excepción.
- La higiene de los activos de Release es importante: después de las subidas exploratorias, la Release pública final debe contener solo artefactos intencionales. Elimina los activos no deseados y sus líneas SHA o menciones en las notas de release antes de publicar.
Manual detallado
Lee references/pypi-trusted-release-runbook.md para la lista de verificación paso a paso, los patrones de comando y los patrones de auditoría de documentos públicos.