Contenido del curso
Planificación y Gestión del Proyecto
Desarrollo, Versionamiento y Pruebas
- 5

Crea tu primera API con .NET en GitHub
06:38 min - 6

Pruebas unitarias con xUnit en .NET
06:40 min - 7

Blindaje de rama main y gestión de commits en GitHub
07:06 min - 8

GitHub Actions para validar pruebas en pull requests
08:34 min - 9

Dockerfile para API .NET en Docker local
Viendo ahora - 10

CI/CD para imágenes Docker en GitHub Actions
05:58 min - 11

Publicar imagen Docker en Hub con GitHub Actions
06:21 min
CI/CD
Observabilidad, Mejora Continua
- 15

OpenTelemetry con Azure Application Insights
08:16 min - 16

Variables de ambiente en GitHub Actions y Azure Container App
09:49 min - 17

Creación de paneles personalizados con Azure Workbooks
09:49 min - 18

Creación de método para obtener contactos con pruebas unitarias
04:01 min - 19

Deploy automático con pull request en Azure
04:29 min - 20

Herramientas DevOps que puedes intercambiar
04:05 min - 21

Scrum y DevOps juntos en GitHub Projects
03:31 min - 22

Qué sigue después de tu primer pipeline
02:55 min
Dockerfile para API .NET en Docker local
Resumen
Cuando trabajas con metodologías ágiles y descubres que falta una pieza técnica, como un Dockerfile para crear la imagen de tu proyecto .NET, lo correcto es registrar ese trabajo como un nuevo issue dentro del sprint. Así mantienes la trazabilidad, evitas duplicar esfuerzos con tu equipo y documentas tu progreso real.
Por qué debes crear un issue antes de programar?
Antes de tocar código, abre el issue en tu repositorio. Esa es la regla que sostiene el trabajo colaborativo y el seguimiento del backlog.
Hay una distinción clave que debes entender: no puedes agregar funcionalidades nuevas a mitad del sprint, porque esas ya estaban planeadas desde el inicio. Pero sí puedes crear tareas nuevas cuando descubres detalles técnicos que omitiste al desglosar tus issues. El Dockerfile es un ejemplo perfecto de esto.
¿Qué pasa si trabajo sin crear un issue? Tu equipo no sabe en qué estás, no puedes registrar progreso en el proyecto y arriesgas chocar con el trabajo de alguien más. En la práctica, es como si no hubieras hecho nada.
En la demostración [02:10] se crea un blank issue llamado "Agregar imagen de Docker", se mueve a In progress y se toma su número, en este caso el ocho, para nombrar la rama de trabajo.
Cómo configurar el Dockerfile para una API en .NET 8?
Con el issue creado, el siguiente paso es crear una rama dedicada con la convención amin-es/8 y dentro de la carpeta src/ContactosApi agregar el archivo Dockerfile.
El archivo debe apuntar al SDK 8, referenciar correctamente el proyecto ContactosApi (respetando mayúsculas y minúsculas), restaurar dependencias, compilar y publicar la DLL final que ejecutará el contenedor.
- Verifica que el nombre del proyecto en el Dockerfile coincida exactamente con el del .csproj.
- Asegúrate de tener Docker Desktop ejecutándose antes de compilar.
- Posiciónate con
cden la carpeta donde vive el Dockerfile antes de correr el build.
Un detalle que suele tropezar a muchos: confundir ApiContactos con ContactosApi. La consistencia en los nombres no es estética, es funcional. Si te equivocas, el build falla.
Cómo construir y correr la imagen de Docker localmente?
Desde la terminal, ya posicionado en src/ContactosApi, ejecutas el comando de construcción y luego corres la imagen para validar que todo levante.
bash docker build -t aminespinosa/contactosapi . docker images docker run -it --rm --name apicontactos -p 8080:8080 aminespinosa/contactosapi
El primer comando empaqueta la aplicación con el tag aminespinosa/contactosapi. El segundo lista las imágenes disponibles para confirmar que se creó. El tercero la ejecuta exponiendo el puerto 8080 [05:30].
¿Por qué probar la imagen en local antes de subirla? Porque si funciona en tu máquina, hay altísima probabilidad de que la GitHub Action la compile sin errores. El entorno local es tu primer ambiente de validación.
Por qué Swagger no aparece al ejecutar el contenedor?
Al abrir localhost:8080/swagger después del primer run, la pantalla aparece vacía. La causa está en Program.cs: Swagger está envuelto en un if que solo lo activa en modo desarrollo.
Docker no corre tu aplicación en modo desarrollo, así que necesitas quitar esa condicional para que la plantilla de Swagger se exponga siempre. Tras eliminar el if, vuelves a ejecutar docker build y docker run con el mismo tag.
Ahora sí, al visitar localhost:8080/swagger/index.html aparece la documentación interactiva de la API.
¿Qué hace el flag
--rmen docker run? Elimina automáticamente el contenedor cuando lo detienes, manteniendo limpio tu entorno local sin contenedores fantasma acumulados.
Qué sigue después de tener la imagen funcionando?
Con el contenedor corriendo y Swagger respondiendo, tienes todo lo necesario para abrir un pull request que cierre el issue número ocho.
El flujo completo queda así:
- Detectas el trabajo faltante y creas el issue en el backlog.
- Generas la rama con la convención del equipo (
amin-es/8). - Implementas el Dockerfile y validas localmente con
buildyrun. - Ajustas el código necesario, como liberar Swagger del modo desarrollo.
- Subes los cambios y abres el pull request para revisión.
Este hábito de trabajar siempre desde un issue registrado es lo que diferencia a un colaborador que aporta valor visible al equipo de uno que se pierde en el ruido. Cuéntame en los comentarios: ¿en tu equipo registran cada tarea o todavía hay quien programa fuera del backlog?