DEV Community

Rafnix Guzmán
Rafnix Guzmán

Posted on • Originally published at blog.rafnixg.dev on

⚙️ Como automatizar tu librería en PyPI con GitHub Actions

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 (sdist y wheel)

  • 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:

  1. Ir a tu repositorio en GitHub.

  2. Hacer clic en Settings.

  3. En el men lateral, clic en Secrets and variables Actions.

  1. Clic en New repository secret.

  2. El nombre ser PYPI_API_TOKEN y en el valor peg tu API key de PyPI.

  3. 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

🚀 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]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 }}
Enter fullscreen mode Exit fullscreen mode

📂 Clonando el repositorio

- name: Clonando repositorio uses: actions/checkout@v3
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 }}
Enter fullscreen mode Exit fullscreen mode

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 }}
Enter fullscreen mode Exit fullscreen mode

💾 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
Enter fullscreen mode Exit fullscreen mode

Creamos un tag y lo subimos:

$ git tag v1.0.1$ git push origin --tags
Enter fullscreen mode Exit fullscreen mode

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

🔍Referencias

🔗 Documentacin oficial GitHub Actions

🔗 Documentacin oficial PyPI usando GitHub Actions

🔗 Documentacion del GitHub Actions PyPI Publish

Top comments (0)