Continuando con un post anterior donde publicamos nuestra librera a PyPI, vamos a ir un paso ms all en el proceso de construccin y despliegue (o, mejor dicho, build y release). En este tutorial, crearemos nuestro propio workflow en GitHub Actions , aprovechando que nuestro repositorio ya est en GitHub, para automatizar este proceso y hacerlo ms eficiente y menos propenso a errores.
Al final de este tutorial tendremos configurado un workflow que construye y publica en PyPI de forma automtica con cada nueva release que se cree en el repositorio de GitHub.
👉 Si an no publicaste tu librera en PyPI , te recomiendo comenzar por este tutorial previo:
https://blog.rafnixg.dev/como-publicar-tu-propia-libreria-de-python-guia-paso-a-paso
Qu es GitHub Actions?
GitHub Actions es una plataforma de CI/CD (Integracin y Entrega Continua) integrada directamente en GitHub. Permite automatizar tareas dentro del ciclo de vida de tu proyecto, como ejecutar tests, construir paquetes, y desplegar cdigo, todo sin salir de tu repositorio.
La magia est en los workflows , que son conjuntos de instrucciones definidas en archivos YAML. Estos workflows se ejecutan en respuesta a eventos especficos, como hacer un push, crear un tag, abrir un pull request o crear un nuevo release.
En el caso de una librera de Python, esto nos permite automatizar pasos como:
Construir los paquetes (
sdistywheel)Publicar automticamente en PyPI o TestPyPI cuando subimos una nueva versin
Con unas pocas lneas de configuracin, podemos lograr que todo esto suceda de forma automtica cada vez que haces un release , reduciendo errores y ganando tiempo.
📦 Automatizando la publicacin en PyPI con GitHub Actions
Requisitos previos
Antes de iniciar, asegrate de tener:
Un repositorio de GitHub con tu librera
Una cuenta de PyPI
Un API Token generado de tu cuenta de PyPI
👉 Si ya seguiste el tutorial anterior, deberas tener todo esto listo. Si no, te recomiendo revisarlo antes de seguir.
🔐 Agregar tu token de PyPI como secret en GitHub
Debemos configurar en nuestro repositorio un nuevo secret para usarlo en los workflows , para esto solo debemos seguir los siguientes pasos:
Ir a tu repositorio en GitHub.
Hacer clic en Settings.
En el men lateral, clic en Secrets and variables Actions.
Clic en New repository secret.
El nombre ser
PYPI_API_TOKENy en el valor peg tu API key de PyPI.Clic en Add secret.
Esto es lo que usa GitHub Actions para autenticar y publicar la librera.
📁 Estructura de archivos
Ya con todo esto listo podemos empezar, lo primero que debemos saber es que para que nuestra Github Actions funcione los workflows deben estar en una carpeta llama .github/workflows en la raz de nuestro repositorio, dentro de esta carpeta ira nuestro archivo de workflow llamado python-publish.yml.
Podemos crear todo usando los siguientes comandos:
$ mkdir -p .github/workflows$ touch .github/workflows/python-publish.yml
La estructura de archivos quedara similar a esta:
rafnixg-lib/ .github/ workflows/ python-publish.yml src/ rafnixg/ __init__.py __main__.py rafnixg.py LICENSE README.md pyproject.toml
🚀 Configurando el workflow
Vamos a iniciar creando el contenido de nuestro archivo de workflow python-publish.yml.
🎯Activando el workflow al publicar un release
name: Publicar Paquete a PyPIon: release: types: [published]
Esto indica el nombre que tendr nuestro workflow y tambin define que solo se va a ejecutar cuando las release sean published con esto limitamos que solo estas acciones sean las que disparen nuestro workflow.
🛡Definir permisos mnimos necesarios
permissions: contents: read
Ac le decimos a GitHub Actions que este workflow solo necesita leer el contenido del repositorio. Es una buena prctica limitar los permisos al mnimo necesario.
🛠Crear el job y configurar el entorno
jobs: deploy: runs-on: ubuntu-latest
Creamos un job llamado deploy, que se ejecutar en un entorno virtual Ubuntu. Este job va a encargarse de construir y publicar nuestro paquete.
📋Agregar los pasos del workflow
Los steps son partes del proceso que irn ejecutando de forma secuencia y sern lo que ejecutarn los pasos para publicar nuestra librera en PyPI luego de ser construida.
En los steps se puede hacer uso de otros actions creados por otros usuarios como si de libreras se tratase, solo debemos indicarlo con uses: actions/nombre-del-actions@version y tambien podemos usar comando sobre la mquina virtual donde se est ejecutando la actions con el comando run: comando bash
steps: - name: Clonando repositorio uses: actions/checkout@v3 - name: Configurando Python 3 uses: actions/setup-python@v3 with: python-version: '3.x' - name: Instalando dependencias run: | python -m pip install --upgrade pip pip install build - name: Construir Paquete run: python -m build - name: Publicar Paquete uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }}
📂 Clonando el repositorio
- name: Clonando repositorio uses: actions/checkout@v3
Usamos la accin oficial para clonar el cdigo del repositorio , paso necesario para poder construir el paquete.
🐍 Configurar el entorno de Python
- name: Configurando Python 3 uses: actions/setup-python@v3 with: python-version: '3.x'
Le decimos a GitHub Actions que configure un entorno de Python (versin 3.x). Esto es clave para poder instalar dependencias y ejecutar los comandos de build.
📥 Instalando las dependencias necesarias
- name: Instalando dependencias run: | python -m pip install --upgrade pip pip install build
Actualizamos pip y luego instalamos el mdulo build, que nos permite crear los archivos .tar.gz y .whl que necesita PyPI.
🏗Construir el paquete
- name: Construir Paquete run: python -m build
Este paso ejecuta python -m build, que genera el paquete listo para ser publicado en la carpeta dist/.
📤Publicar el paquete en PyPI
- name: Publicar Paquete uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }}
Finalmente, usamos la accin oficial para subir el paquete a PyPI. Aqu usamos el API Key que se guarda como Secret en el repositorio de GitHub (PYPI_API_TOKEN), para evitar exponer credenciales.
📄 Archivo completo del workflow (python-publish.yml)
El archivo python-publish.yml finalmente queda de la siguiente manera:
name: Publicar Paquete a PyPIon: release: types: [published]jobs: deploy: runs-on: ubuntu-latest steps: - name: Clonando repositorio uses: actions/checkout@v3 - name: Configurando Python 3 uses: actions/setup-python@v3 with: python-version: '3.x' - name: Instalando dependencias run: | python -m pip install --upgrade pip pip install build - name: Construir Paquete run: python -m build - name: Publicar Paquete uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }}
💾 Subiendo los cambios al repositorio
Ya con nuestro archivo creado, solo nos resta subir un commit con los cambios que tenemos:
$ git add .github/workflows/python-publish.yml$ git commit -m "Add GitHub Actions workflow for PyPI release"$ git push origin
Creamos un tag y lo subimos:
$ git tag v1.0.1$ git push origin --tags
Revisamos nuestro repositorio de GitHub y nos aseguramos de que se subi todo correctamente, para seguir con la creacin de una nueva release.
🏷 Crear una nueva release en GitHub
En nuestro repositorio hacemos clic en Releases. para ingresar a la pgina de todas las releases que vamos a haciendo.
En esta pgina hacemos clic en draf a new release
Esto nos abre el formulario para crear nuevas releases, ac debemos seleccionar el tag correspondiente con la release en Choose a tag y hacer clic en Generate release notes, esto genera una descripcin usando los commits y los Pull Request.
Por ltimo, revisa la descripcin ajusta si lo necesitas y dale clic a Publish release.
Verificar el resultado de la publicacin
Cada vez que crees una nueva release , se publicar una nueva versin de tu paquete en PyPI. En la tab Actions de nuestro repositorio vamos a ver cmo se ejecuta el workflow que lo publica.
🧠 Conclusin
Automatizar la publicacin con GitHub Actions no solo te ahorra tiempo, tambin reduce errores y hace que todo el proceso sea mucho ms limpio y profesional. Una vez configurado, solo tienes que enfocarte en mejorar tu librera y dejar que la publicacin se maneje sola






Top comments (0)