Introducción
En el laboratorio anterior, aprendió sobre el «control de calidad» (CI). Ahora pasaremos al siguiente paso: el empaquetado.
Piense en el software como un producto de una fábrica. Después de superar todas las pruebas de calidad, debe colocarse en una caja, sellarse y etiquetarse antes de enviarlo a los clientes. En el mundo del software, esta «caja» suele ser un contenedor de Docker.
Llamamos artefacto al resultado empaquetado. Una vez construidos, los artefactos deben almacenarse en un registro para que las etapas posteriores, como la implementación, puedan recuperar exactamente la misma compilación.
La reproducibilidad es la idea clave. La implementación debe utilizar un producto de compilación conocido, no volver a construir el código de forma diferente en cada máquina de destino.
GitHub proporciona un registro llamado GitHub Container Registry (GHCR).
En este laboratorio, enseñará a su asistente robótico a:
- Empaquetar su aplicación en un contenedor de Docker.
- Etiquetarla con una etiqueta de versión.
- Enviarla automáticamente al almacén de GitHub.
Requisitos previos
Continuaremos utilizando el repositorio github-actions-basics.
Crear un Dockerfile
Antes de que el robot pueda empaquetar su aplicación, necesita instrucciones. En Docker, estas instrucciones se escriben en un archivo especial llamado Dockerfile.
Vaya al directorio del proyecto.
cd ~/project
git clone https://github.com/your-username/github-actions-basics.git
cd github-actions-basics
Nota: Sustituya your-username por su nombre de usuario real de GitHub.
Cree un archivo llamado Dockerfile (con la «D» en mayúscula y sin extensión) con el siguiente contenido.
cat > Dockerfile << EOF
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "index.js"]
EOF
Esta lista de empaquetado indica exactamente al robot qué debe hacer:
FROM node:16-alpine: Comenzar con un sistema base ligero que ya tiene Node.js instalado.WORKDIR /app: Crear una carpeta de trabajo dentro de la caja.COPY ...: Copiar los archivos del proyecto dentro de la caja.RUN npm install: Instalar las dependencias necesarias dentro de la caja.CMD ...: Iniciar la aplicación cuando alguien abra (ejecute) esta caja.
Ahora, agregue este archivo al repositorio y envíelo a GitHub.
git add Dockerfile
git commit -m "Add Dockerfile"
git push
Crear el flujo de trabajo de publicación
Ahora crearemos un flujo de trabajo nuevo para gestionar el empaquetado y el envío. Lo llamaremos docker-publish.yml.
Cree el archivo:
touch .github/workflows/docker-publish.yml
Ábralo con nano.
nano .github/workflows/docker-publish.yml
Agregue la siguiente configuración. Presentaremos un concepto nuevo llamado permisos.
name: Docker Publish
on:
push:
branches: ["master", "main"]
permissions:
contents: read
packages: write
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
¿Por qué necesitamos permisos?
De forma predeterminada, el robot tiene acceso limitado por motivos de seguridad. Como queremos que el robot cargue elementos en su cuenta de GitHub, en la sección «packages», debemos darle explícitamente una clave para el almacén. Eso es lo que hace packages: write.
Este es un buen ejemplo del principio de privilegio mínimo aplicado al diseño de canalizaciones. Los flujos de trabajo deben recibir únicamente los permisos necesarios para realizar su tarea.
Guarde los cambios y salga de nano (Ctrl+X, Y, Enter).
Agregar los pasos de construcción y envío
Ahora verificaremos la parte más importante: la construcción y el envío reales.
Utilizaremos dos herramientas oficiales (acciones) de Docker:
docker/login-action: Para iniciar sesión en el almacén.docker/build-push-action: Para construir la caja y enviarla.
Esta etapa conecta la integración continua con la entrega. Después de que las pruebas se completen correctamente, la canalización crea un artefacto versionado que otros sistemas pueden implementar más adelante sin volver a construirlo desde el código fuente.
Abra de nuevo .github/workflows/docker-publish.yml.
nano .github/workflows/docker-publish.yml
Agregue los siguientes pasos al trabajo build-and-push:
- name: Log in to the Container registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}/app:latest
Cómo funcionan las variables mágicas:
ghcr.io: Es la dirección del «almacén» de GitHub.${{ github.actor }}: Es una variable que completa automáticamente su nombre de usuario de GitHub.${{ secrets.GITHUB_TOKEN }}: Es una contraseña temporal especial que GitHub crea para el robot. No tiene que hacer nada: ¡funciona automáticamente! Este token permite que el robot inicie sesión de forma segura sin que usted escriba su contraseña.tags: Crea la etiqueta de su caja. Sigue este formato:Dirección del almacén / Su nombre / Nombre del repositorio / Nombre de la aplicación : Versión.
Guarde los cambios y salga de nano.
Ahora, envíe este flujo de trabajo a GitHub para iniciar el proceso.
git add .
git commit -m "Add Docker publishing workflow"
git push
Verificar el artefacto
Su robot ya está trabajando intensamente. Está configurando un servidor, iniciando sesión, construyendo el contenedor y cargándolo.
- Vaya a su repositorio en GitHub.
- Haga clic en la pestaña Actions.
- Haga clic en la ejecución del flujo de trabajo «Docker Publish».
- Observe cómo los pasos se vuelven verdes.

Cuando el paso «Build and push Docker image» termine correctamente, su paquete estará en el almacén. Vamos a comprobarlo.
- Vaya a la página principal de su repositorio, en la pestaña Code.
- Observe la barra lateral derecha. Debería ver una sección titulada Packages.
- Allí aparecerá un paquete nuevo.
Haga clic en el nombre del paquete para ver sus detalles. Este es su artefacto terminado. Cualquier persona con acceso a su repositorio —o el público, si su repositorio es público— podrá descargar y ejecutar su aplicación mediante esta imagen.

Resumen
En este laboratorio, construyó una canalización completa de entrega.
Aprendió:
- Empaquetado: Cómo escribir un
Dockerfilepara colocar su aplicación en un contenedor. - Permisos: Cómo conceder a su flujo de trabajo acceso de escritura a sus paquetes.
- Almacenamiento: Cómo utilizar GitHub Container Registry (GHCR) para almacenar sus imágenes.
- Automatización: Cómo construir y enviar su código automáticamente mediante acciones estándar.
Ahora su asistente robótico puede comprobar su código (CI) y enviar su código como artefactos. En el siguiente laboratorio, veremos cómo gestionar de forma segura información confidencial, como las contraseñas.



