Cómo implementar CI/CD para proyectos .Net a bajo costo

Javier Eduardo Mendoza Blandón
11 min readMay 30, 2023

--

usando Azure DevOps con alojamiento en Smarter ASP

English article: https://bit.ly/42gwB7I

Bienvenido(as), esta guía tiene por objetivo enseñarte todo lo que necesitas saber para implementar CI/CD en Azure DevOps con el hosting de Smarter ASP para proyectos .Net especialmente con API’s en solo 29 pasos.

Requisitos

o Conocimientos básicos de la herramienta Visual Studio .NET 2022.

o Visual Studio 2022 Versión 17.5.4

o Versión de dotnet 6.0.16

Porque CI/CD?

La integración continua y la entrega/despliegue continuo (CI/CD) con Azure DevOps son importantes debido a que ofrecen una forma rápida y confiable de desarrollar, probar e implementar aplicaciones de software.

El CI/CD permite a los equipos de desarrollo de software entregar actualizaciones de software con frecuencia, garantizando una mayor calidad y reduciendo los costos.

Contexto

¿Estás al tanto de la opción de crear CI/CD para equipos de desarrollo más pequeños que utilizan Azure DevOps con el alojamiento de SmarterASP.NET? Es una forma económica de ayudar a mejorar la colaboración, agilizar los procesos de desarrollo y proporcionar la escalabilidad y seguridad necesarias para alojar aplicaciones .NET en empresas emergentes, pequeñas y medianas empresas, así como en proyectos personales.

No todos pueden afrontar el alto costo de implementar CI/CD en la nube de Azure o AWS. Por eso, ofrezco esta buena alternativa basada en mis experiencias pasadas.

Inicio de la guía

Te motrare la guía concisa sobre cómo llevar a cabo este proceso en el siguiente pdf. En algunos pasos, te proporcionaré enlaces a videos que pueden ayudarte a cumplir con ciertos requisitos previos antes de iniciar la guía propiamente dicha.

Paso 0: Crear una cuenta, organización y proyecto en Azure DevOps

Del minuto 1:05 al 6:10 es suficiente

Paso 1: Crear una cuenta en el hosting SmarterASP.Net

Paso 2: Como crear una base de datos en SmarterASP.NET (opcional)

Paso 3: Para esta implementación, necesitaremos un proyecto API .Net. Puedes utilizar uno existente que hayas creado anteriormente o aprender a crear uno y obtener información adicional en el siguiente artículo que he creado: [enlace al artículo]. En él, encontrarás instrucciones detalladas sobre cómo crear un proyecto API .Net y otros conceptos interesantes relacionados.

https://bit.ly/42XOucN Para el resto del artículo, usaré el repositorio al final del artículo del enlace.

Paso 3.1: Verificación rápida

Verifiquemos si tiene las siguientes dos líneas de código en su proyecto .Net api

Paso 3.2: Verifique si su documentación swagger está disponible para todos los entornos.

Listo, todo fue verificado.

Paso 4: Necesitamos crear un nuevo sitio web en nuestro alojamiento SmarterASP

Paso 5: Necesitamos activar el sitio web creado antes en el paso 4.

Paso 5.1: Escriba estos datos porque los necesitará en la pipeline de CD. ServiceUrl: URL Servicio, SiteName: Nombre sitio, UserName: Nombre usuario, Password: Contrasena.

Recomiendo por razones de seguridad cambiar la contraseña a una que siempre puedan recordar porque normalmente es la misma que la de inicio de sesión.

Paso 6: Necesitamos crear un repositorio de Azure para cargar nuestro proyecto .Net api.

Elegimos el Proyecto
Creamos un nuevo repositorio en Azure Dev Ops
Debe verse asi el repositorio creado.

Paso 7: Ahora necesitamos agregar nuestro código al nuevo repositorio de Azure creado.

click en el boton de clonar.

Paso 7.1: Ahora puedes usar tu herramienta favorita para hacer los siguientes pasos, en mi caso es git bash.

https://git-scm.com/downloads

Paso 7.2: Clone el repositorio en su máquina local utilizando las herramientas de línea de comandos de Git.

git clone https://your-project-url del paso 7

Recuerde sus credenciales de inicio de sesión en Azure Portal aquí.

Paso 7.3: Cambie su directorio de trabajo al repositorio local.

cd NombreRepositorio

Paso 7.4: Agregue sus archivos de código al repositorio usando el comando “git add .”

Paso 7.5: Confirma tus cambios en el repositorio usando el comando “git commit”.

git commit -m “Initial api version 2”

Paso 7.6: Envíe sus cambios al repositorio de Azure DevOps con el comando “git push”.

git push origin main
resultados

Paso 8: Es importante establecer que los Pull Requests serán la forma de fusionar los cambios en la rama principal en Azure Repositories (u cualquier repositorio de Git). Esta práctica es fundamental por diversas razones, como la revisión de código, la colaboración entre el equipo, el control de cambios y el control de versiones. Al utilizar Pull Requests, se fomenta una revisión exhaustiva del código, se permite la colaboración efectiva entre los miembros del equipo y se asegura un control adecuado sobre los cambios realizados en el proyecto.

click en repositorios
Click en more options .
Se configuran las politicas del pull request.

Esa fue la configuración básica para hacerlo.

Creación integración continua — CI

Paso 9: Vamos a crear nuestra primera canalización (pipeline). Para hacer esto, sigue los siguientes pasos:

Paso 9.1: Navega a la sección “Pipelines” en la barra de menú de navegación izquierda.

Paso 9.2: Haz clic en el botón “Crear pipelines”.

Paso 10: Seleccione el editor clásico para crear su primera canalización (pipeline).

Paso 11: Necesitamos seleccionar una fuente de nuestro repositorio, en nuestro caso, usamos Azure Repos Git.

aca selecionamos el repositorio creado en el paso 6

Paso 12: Necesitamos elegir una plantilla que construya el tipo de aplicación, en nuestro caso es un proyecto ASP.NET Core API.

Paso 13: Haz una configuración similar en los siguientes campos y parametros:

En Azure DevOps

Paso 13.1: Haz una configuración similar en los siguientes campos:

utiliza el nombre acorde a su proyecto.

Paso 13.2: Especificación del agente*: elija “ventanas” ya que vamos a compilar y publicar el proyecto en una plataforma Windows.

Para esta guia utilizamos windows.

Paso 13.3: Proyecto(s) para restaurar y construir, por favor sea específico

En este caso busquen el .csproj de su proyecto.
resultado

Paso 14: Necesitamos abrir el panel “Publicar”, desmarcar el proyecto publicado en Zip.

Paso 15: Si necesita agregar, actualizar o eliminar variables, puedes usar la pestaña Variables, puede actualizar las configuraciones según lo necesite, la configuración predeterminada es suficiente para publicar una aplicación central estándar de asp.net.

Recuerda que las variables son útiles para almacenar información sensible, como claves de API o contraseñas, y también para configurar valores específicos de la canalización.

Paso 16: Para habilitar la integración continua en Azure DevOps, sigue estos pasos:

Paso 16.1: Navega a la página de “Activadores” (Triggers) en la configuración de tu canalización.

Paso 16.2: Busca la opción de “Integración continua” (Continuous Integration) y marca la casilla para habilitarla.

Paso 16.3: Al habilitar la integración continua, cada vez que se realice una confirmación en la rama principal de tu repositorio, se construirá automáticamente tu canalización de proyecto.

de esta forma

Paso 17: Necesitamos guardar y poner en cola la canalización.

Paso 18: Después de guardar y ejecutar, la página navegará automáticamente al panel resumen. Puedes consultar el estado del trabajo y nuestros resultados publicados.

Paso 19: Necesitamos verificar el artefacto sobre los archivos producidos por el proyecto publicado, recuerda escribir la ruta “drop\src”, necesitaremos usarlo más adelante en la canalización del CD.

SourcePath, esta será la ruta publicada de su canalización (pipeline), el valor predeterminado es “drop\src”

Creación de entrega continua — CD

Paso 20: Para crear nuestra segunda canalización, sigue estos pasos:

Paso 20.1: Navega a la pestaña “Lanzamientos” en Azure DevOps.

Paso 20.2: Haz clic en el botón “Crear pipeline de lanzamiento” para comenzar a crear una nueva canalización de lanzamiento

Paso 21: Necesitamos seleccionar una plantilla de “Trabajo vacío”

Necesitamos definir el nombre de nuestro primer entorno, en mi caso será “Desarrollo”.

Paso 22: Necesitamos agregar nuestro artefacto, creado anteriormente.

Paso 23: Necesitamos elegir la fuente (construir pipeline) NO actualice el campo Alias de origen *.

Paso 24: Necesitamos habilitar el disparador de implementación continua, esto ejecutará los trabajos de etapa subsiguientes cuando se construya un pipeline.

Paso 25: Necesitamos agregar una tarea para la implementación.

Paso 26: Necesitamos hacer las siguientes configuraciones.

Paso 26.1: Abra el panel de trabajo del Agente, en el grupo de Agentes, elija Hosted Windows 2019 con VS2019.

Paso 26.2: Asegúrese de que la descarga de Artifact esté configurada con la canalización de compilación coincidente.

Paso 26.3: Agregue una tarea de PowerShell.

Paso 26.4: Necesitamos abrir la tarea de script de powerShell: A-Cambiar tipo ha en línea , B-Copie y pegue el siguiente script en el campo Script*. No necesita actualizar nada en el script.

$sourcePath = Join-Path -Path "$($Env:AGENT_RELEASEDIRECTOR
Y)\$($Env:RELEASE_PRIMARYARTIFACTSOURCEALIAS)" -ChildPath $
Env:SourcePath
# Deploy project using Web Deploy
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.ex
e" -verb:sync -source:contentPath=$sourcePath -dest:content
Path=$Env:SiteName,computerName=$Env:ServiceUrl,userName=$E
nv:UserName,password=$Env:Password,authtype="Basic",include
Acls="False" -allowUntrusted -disableLink:AppPoolExtension
-disableLink:ContentExtension -disableLink:CertificateExten
sion -enableRule:AppOffline -verbose

O puedes utilizar el siguiente script con reintentos, este es mi favorito para ser honesto.

$sourcePath = Join-Path -Path "$($Env:AGENT_RELEASEDIRECTORY)\$($Env:RELEASE_PRIMAR
YARTIFACTSOURCEALIAS)" -ChildPath $Env:SourcePath
$maxRetries = 5
$retryCount = 0
while ($retryCount -lt $maxRetries) {
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:contentPath=$s
ourcePath -dest:contentPath=$Env:SiteName,computerName=$Env:ServiceUrl,userName=$Env:User
Name,password=$Env:Password,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:A
ppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -enableRule:AppOffli
ne -verbose
# Check if the deployment succeeded
if ($LASTEXITCODE -eq 0) {
Write-Output "Deployment succeeded after $($retryCount + 1) retries"
break
}
# Wait for a few seconds before retrying
Start-Sleep -Seconds 10
$retryCount++
}
if ($retryCount -eq $maxRetries) {
Write-Output "Deployment failed after $maxRetries retries"
}

Paso 26.5: Expanda la pestaña “Variables de entorno” dentro de la tarea power shell creada anteriormente y agregue la siguiente información:

SourcePath, ServiceUrl, SiteName, UserName, Password

Paso 26.6: Puedes obtener estos datos de los pasos anteriores Paso 5, Paso 19.

Paso 27: Necesitamos hacer clic en las siguientes imágenes marcadas para completar la canalización (pipeline) de CD.

Click al boton OK , luego guardamos y por ultimo damos clic en crear release.
Click al boton crear.
Los click en las parte de amarillo marcadas.

Con estas dos canalizaciones (CI y CD) configuradas, estarás listo para desarrollar, probar e implementar tu aplicación de manera continua y automatizada en Azure DevOps y Smarter ASP.

Paso 28: Necesitamos verificar si su proyecto .Net Api se implementó con éxito en el lado de SmarterASP

https://www.smarterasp.net/
https://member5-3.smarterasp.net/account/loginform
podemos ver el api desplegada.

Después de completar la implementación, este será tu paso frecuente.

Una vez que hayas completado la implementación inicial de tu aplicación utilizando las canalizaciones de CI/CD, este proceso se volverá frecuente en tu flujo de trabajo. A medida que realices cambios en tu código o realices actualizaciones en tu proyecto, seguirás utilizando las canalizaciones de CI/CD para compilar, probar y desplegar tus cambios de forma automática y continua.

Paso 29: Hagamos otra prueba, solo para estar seguros de si todo este esfuerzo para crear este flujo de CI/CD está funcionando como se esperaba.

A- Vamos a crear otra rama de git con el nombre que prefieras

git checkout -b myTestBrach

B- Abra su proyecto .net api con VS y realice cualquier cambio en su interfaz de usuario swagger

C- Vamos guardar, agregar y enviar el cambio al repositorio de Azure.

git add .
git commit -m “Initial api version 3”
git push origin myTestBrach: myTestBrach

D- Necesitaremos crear el pull request en el repositorio de azure.

E- Automáticamente, después de completar la solicitud de extracción, se activará la canalización de CI.

F- Automáticamente después de completar la canalización de CI, se activará la canalización de CD.

Eso es todo amigos, espero sus comentarios, ideas o consejos, no duden en hacerlo por favor, gracias.

--

--