<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>devops | Webmago Dev</title>
	<atom:link href="https://webmago.dev/category/devops/feed/" rel="self" type="application/rss+xml" />
	<link>https://webmago.dev</link>
	<description>Creando codigo desde 1990</description>
	<lastBuildDate>Mon, 28 Jul 2025 19:45:31 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>🚀 ¿Tu equipo aún gestiona versiones con Excel o mensajes sueltos en Archivos de Texto? Es momento de evolucionar</title>
		<link>https://webmago.dev/%f0%9f%9a%80-tu-equipo-aun-gestiona-versiones-con-excel-o-mensajes-sueltos-en-archivos-de-texto-es-momento-de-evolucionar/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Mon, 28 Jul 2025 18:38:50 +0000</pubDate>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[wintercms]]></category>
		<category><![CDATA[ambientes]]></category>
		<category><![CDATA[atlasversion]]></category>
		<category><![CDATA[gestion]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=5925</guid>
					<description><![CDATA[<p>La gestión de versiones y despliegues es un reto real para startups y empresas de software en crecimiento. Entornos múltiples, cambios constantes, auditorías, errores humanos… todo se vuelve más complejo sin una herramienta que lo centralice todo. &#160; 🎯 AtlasVersion es la solución mexicana creada pensando en los desafíos reales que enfrentan los equipos de [&#8230;]</p>
The post <a href="https://webmago.dev/%f0%9f%9a%80-tu-equipo-aun-gestiona-versiones-con-excel-o-mensajes-sueltos-en-archivos-de-texto-es-momento-de-evolucionar/">🚀 ¿Tu equipo aún gestiona versiones con Excel o mensajes sueltos en Archivos de Texto? Es momento de evolucionar</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<div>La gestión de versiones y despliegues es un reto real para startups y empresas de software en crecimiento. Entornos múltiples, cambios constantes, auditorías, errores humanos… todo se vuelve más complejo sin una herramienta que lo centralice todo.</div>
<p>&nbsp;</p>
<div>🎯 AtlasVersion es la solución mexicana creada pensando en los desafíos reales que enfrentan los equipos de desarrollo locales. Con trazabilidad completa, alertas automáticas por Slack o correo, exportación de reportes para auditoría, e integración con tus pipelines CI/CD, AtlasVersion convierte el caos en control.</div>
<p>&nbsp;</p>
<div>¿Lo mejor? No necesitas cambiar tu stack. AtlasVersion se adapta a tu flujo y no al revés.</div>
<p>&nbsp;</p>
<div>👨‍💻 Desde CTOs hasta DevOps, quienes ya lo usan saben que es más que una herramienta: es un aliado estratégico para liberar versiones de forma segura, ordenada y sin dolores de cabeza.</div>
<p>&nbsp;</p>
<div>📌 Porque nadie conoce mejor tu realidad que una solución hecha en México para empresas mexicanas.</div>
<p>&nbsp;</p>
<div>👉 Agenda tu demo sin costo y conoce cómo AtlasVersion puede transformar tu gestión de versiones:</div>
<div>🔗<a title="Agendar una demo" href="https://www.atlasversion.dev" target="_blank" rel="noopener"> www.atlasversion.dev</a></div>The post <a href="https://webmago.dev/%f0%9f%9a%80-tu-equipo-aun-gestiona-versiones-con-excel-o-mensajes-sueltos-en-archivos-de-texto-es-momento-de-evolucionar/">🚀 ¿Tu equipo aún gestiona versiones con Excel o mensajes sueltos en Archivos de Texto? Es momento de evolucionar</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</title>
		<link>https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:09:56 +0000</pubDate>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[digital ocean]]></category>
		<category><![CDATA[gcp]]></category>
		<category><![CDATA[pulumi]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[IaC]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=5921</guid>
					<description><![CDATA[<p>En el mundo moderno de la infraestructura cloud, Infrastructure as Code (IaC) se ha convertido en un pilar fundamental para equipos de DevOps, ingenieros de infraestructura y startups SaaS. Entre las herramientas disponibles, Pulumi destaca por su flexibilidad, soporte multi-cloud y capacidad de utilizar lenguajes de programación tradicionales como Python, TypeScript y Go. En este artículo, exploraremos las mejores prácticas [&#8230;]</p>
The post <a href="https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/">Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p class="ds-markdown-paragraph">En el mundo moderno de la infraestructura cloud, <strong>Infrastructure as Code (IaC)</strong> se ha convertido en un pilar fundamental para equipos de DevOps, ingenieros de infraestructura y startups SaaS. Entre las herramientas disponibles, <strong>Pulumi</strong> destaca por su flexibilidad, soporte multi-cloud y capacidad de utilizar lenguajes de programación tradicionales como Python, TypeScript y Go.</p>
<p class="ds-markdown-paragraph">En este artículo, exploraremos las <strong>mejores prácticas para implementar IaC con Pulumi</strong>, con ejemplos prácticos en <strong>GCP, AWS y DigitalOcean</strong>, estrategias avanzadas para <strong>Kubernetes</strong> y consideraciones clave en <strong>Disaster Recovery Planning (DRP)</strong>.</p>
<hr />
<h2><strong>1. ¿Por qué Pulumi para IaC?</strong></h2>
<p class="ds-markdown-paragraph">Pulumi ofrece ventajas únicas frente a alternativas como Terraform o CloudFormation:</p>
<p class="ds-markdown-paragraph">✅ <strong>Lenguajes familiares</strong> (Python, TypeScript, Go) en lugar de DSLs propietarios.<br />
✅ <strong>Soporte multi-cloud</strong> (AWS, GCP, Azure, DigitalOcean, Kubernetes).<br />
✅ <strong>Estado de infraestructura gestionado</strong> (Pulumi Service, S3, etc.).<br />
✅ <strong>Integración con CI/CD</strong> nativa.<br />
✅ <strong>Reutilización de código</strong> mediante componentes y librerías.</p>
<h3><strong>Ejemplo: Desplegando un cluster Kubernetes en DigitalOcean con Pulumi (Python)</strong></h3>
<pre><code class="language-python">import pulumi
import pulumi_digitalocean as do
# Crear un cluster Kubernetes en DigitalOcean
cluster = do.KubernetesCluster(
    &quot;saas-cluster&quot;,
    region=&quot;nyc1&quot;,
    version=&quot;1.25.4-do.0&quot;,
    node_pool={
        &quot;name&quot;: &quot;default-pool&quot;,
        &quot;size&quot;: &quot;s-2vcpu-4gb&quot;,
        &quot;node_count&quot;: 3,
    }
)
# Exportar el kubeconfig
pulumi.export(&quot;kubeconfig&quot;, cluster.kube_configs[0].raw_config)</code>

</pre>
<p class="ds-markdown-paragraph">Este código despliega un cluster gestionado en DigitalOcean con tres nodos, listo para integrarse en un pipeline de CI/CD.</p>
<hr />
<h2><strong>2. Mejores Prácticas para IaC con Pulumi</strong></h2>
<h3><strong>🔹 Modularización y Reutilización</strong></h3>
<p class="ds-markdown-paragraph">Evitar scripts monolíticos. En su lugar, estructurar el código en <strong>componentes reutilizables</strong>:</p>
<pre><code class="language-python"># Ejemplo: Módulo para un bucket S3 con políticas de acceso
class SecureBucket(pulumi.ComponentResource):
    def __init__(self, name, **kwargs):
        super().__init__(&quot;custom:SecureBucket&quot;, name, **kwargs)
        
        self.bucket = aws.s3.Bucket(name)
        aws.s3.BucketPolicy(
            f&quot;{name}-policy&quot;,
            bucket=self.bucket.id,
            policy=json.dumps({
                &quot;Version&quot;: &quot;2012-10-17&quot;,
                &quot;Statement&quot;: [{
                    &quot;Effect&quot;: &quot;Deny&quot;,
                    &quot;Principal&quot;: &quot;*&quot;,
                    &quot;Action&quot;: &quot;s3:*&quot;,
                    &quot;Resource&quot;: [self.bucket.arn, f&quot;{self.bucket.arn}/*&quot;],
                    &quot;Condition&quot;: {&quot;Bool&quot;: {&quot;aws:SecureTransport&quot;: False}}
                }]
            })
        )
# Uso del módulo
bucket = SecureBucket(&quot;prod-data-lake&quot;)</code></pre>
<p>&nbsp;</p>
<h3><strong>🔹 Gestión de Estado (State Management)</strong></h3>
<p class="ds-markdown-paragraph">Pulumi guarda el estado de la infraestructura. Opciones recomendadas:</p>
<ul>
<li>
<p class="ds-markdown-paragraph"><strong>Pulumi Service</strong> (gratis para proyectos pequeños).</p>
</li>
<li>
<p class="ds-markdown-paragraph"><strong>Amazon S3 / Google Cloud Storage</strong> (para mayor control).</p>
</li>
</ul>
<p>&nbsp;</p>
<pre><code class="language-bash"># Inicializar un proyecto con backend en S3
pulumi login s3://my-pulumi-state-bucket</code></pre>
<h3><strong>🔹 CI/CD Integrado</strong></h3>
<p class="ds-markdown-paragraph">Ejemplo con GitHub Actions:</p>
<pre><code class="language-bash">name: Deploy Infrastructure
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: pulumi/actions@v3
        with:
          command: up
          stack-name: prod
        env:
          PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}</code></pre>
<p>&nbsp;</p>
<h2><strong>3. Kubernetes con Pulumi: Gestión Eficiente</strong></h2>
<p class="ds-markdown-paragraph">Pulumi permite gestionar <strong>Kubernetes de forma declarativa</strong> sin necesidad de <code>kubectl</code> manual.</p>
<h3><strong>Ejemplo: Despliegue de una App en Kubernetes</strong></h3>
<pre><code class="language-python">import pulumi_kubernetes as k8s
# Crear un Namespace
app_ns = k8s.core.v1.Namespace(&quot;app-ns&quot;)
# Desplegar una aplicación
app = k8s.apps.v1.Deployment(
    &quot;app-deployment&quot;,
    metadata={&quot;namespace&quot;: app_ns.metadata[&quot;name&quot;]},
    spec={
        &quot;replicas&quot;: 3,
        &quot;selector&quot;: {&quot;match_labels&quot;: {&quot;app&quot;: &quot;my-saas&quot;}},
        &quot;template&quot;: {
            &quot;metadata&quot;: {&quot;labels&quot;: {&quot;app&quot;: &quot;my-saas&quot;}},
            &quot;spec&quot;: {
                &quot;containers&quot;: [{
                    &quot;name&quot;: &quot;app&quot;,
                    &quot;image&quot;: &quot;my-registry/my-saas-app:latest&quot;,
                    &quot;ports&quot;: [{&quot;container_port&quot;: 8080}]
                }]
            }
        }
    }
)
# Exponer el servicio
service = k8s.core.v1.Service(
    &quot;app-service&quot;,
    metadata={&quot;namespace&quot;: app_ns.metadata[&quot;name&quot;]},
    spec={
        &quot;selector&quot;: {&quot;app&quot;: &quot;my-saas&quot;},
        &quot;ports&quot;: [{&quot;port&quot;: 80, &quot;target_port&quot;: 8080}],
        &quot;type&quot;: &quot;LoadBalancer&quot;
    }
)
pulumi.export(&quot;service_url&quot;, service.status[&quot;load_balancer&quot;][&quot;ingress&quot;][0][&quot;hostname&quot;])</code></pre>
<p>&nbsp;</p>
<hr />
<h2><strong>4. Disaster Recovery Planning (DRP) con Pulumi</strong></h2>
<p class="ds-markdown-paragraph">Un buen DRP define <strong>RTO (Recovery Time Objective)</strong> y <strong>RPO (Recovery Point Objective)</strong>.</p>
<h3><strong>Visualización de RTO/RPO</strong></h3>
<p class="ds-markdown-paragraph">(Imagen conceptual: Tabla comparando estrategias de backup y replicación)</p>
<div class="markdown-table-wrapper">
<table>
<thead>
<tr>
<th>Estrategia</th>
<th>RTO (Tiempo de recuperación)</th>
<th>RPO (Pérdida de datos máxima)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Backup Diario</td>
<td>Horas</td>
<td>24 horas</td>
</tr>
<tr>
<td>Replicación en Caliente</td>
<td>Minutos</td>
<td>Segundos</td>
</tr>
<tr>
<td>Multi-Región AWS</td>
<td>Minutos</td>
<td>Casi cero</td>
</tr>
</tbody>
</table>
</div>
<h3><strong>Ejemplo: Configuración de DRP en AWS</strong></h3>
<pre><code class="language-python">import pulumi_aws as aws
# Replicación de buckets S3 entre regiones
primary_bucket = aws.s3.Bucket(&quot;primary-bucket&quot;, acl=&quot;private&quot;)
replica_bucket = aws.s3.Bucket(&quot;replica-bucket&quot;, acl=&quot;private&quot;)
aws.s3.BucketReplication(
    &quot;replication&quot;,
    bucket=primary_bucket.id,
    role=replication_role.arn,
    rules=[{
        &quot;status&quot;: &quot;Enabled&quot;,
        &quot;destination&quot;: {
            &quot;bucket&quot;: replica_bucket.arn,
            &quot;storage_class&quot;: &quot;STANDARD&quot;
        }
    }]
)</code></pre>
<h2><strong>5. Conclusión</strong></h2>
<p class="ds-markdown-paragraph">Pulumi es una herramienta poderosa para <strong>automatizar infraestructura cloud</strong> con código real, mejorando la productividad de equipos DevOps y startups SaaS.</p>
<p class="ds-markdown-paragraph">🔹 <strong>Mejores prácticas clave:</strong></p>
<ul>
<li>
<p class="ds-markdown-paragraph">Modularizar el código IaC.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Gestionar el estado de forma segura.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Integrar con CI/CD.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Planificar Disaster Recovery (RTO/RPO).</p>
</li>
</ul>
<p class="ds-markdown-paragraph">¿Listo para probar Pulumi? Comienza con su <a href="https://www.pulumi.com/docs/" target="_blank" rel="noopener noreferrer">documentación oficial</a>.</p>
<hr />
<p class="ds-markdown-paragraph">📢 <strong>¿Quieres más detalles sobre algún tema?</strong> ¡<a title="Contactame" href="https://webmago.dev/#contact" target="_blank" rel="noopener">Contactame</a>!</p>
<p class="ds-markdown-paragraph">#DevOps #InfrastructureAsCode #Pulumi #Kubernetes #CloudComputing #SaaS #DisasterRecovery</p>
<p>&nbsp;</p>The post <a href="https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/">Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automatizando el despliegue de artefactos Java: Mi experiencia con Cloud Build, Bash y Archiva en VMs</title>
		<link>https://webmago.dev/automatizando-el-despliegue-de-artefactos-java-mi-experiencia-con-cloud-build-bash-y-archiva-en-vms/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Thu, 15 May 2025 19:51:37 +0000</pubDate>
				<category><![CDATA[cloudbuild]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[gcp]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[cicd]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=5910</guid>
					<description><![CDATA[<p>Introducción En el mundo del desarrollo de software, la implementación de una pipeline de CI/CD robusta y eficiente es fundamental para mantener la agilidad y calidad del producto. Como desarrollador, me he enfrentado al reto de automatizar el despliegue de artefactos Java en múltiples entornos. En este artículo, compartiré mi experiencia implementando pipelines con Google [&#8230;]</p>
The post <a href="https://webmago.dev/automatizando-el-despliegue-de-artefactos-java-mi-experiencia-con-cloud-build-bash-y-archiva-en-vms/">Automatizando el despliegue de artefactos Java: Mi experiencia con Cloud Build, Bash y Archiva en VMs</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Introducción</h2>
<p class="whitespace-normal">En el mundo del desarrollo de software, la implementación de una pipeline de CI/CD robusta y eficiente es fundamental para mantener la agilidad y calidad del producto. Como desarrollador, me he enfrentado al reto de automatizar el despliegue de artefactos Java en múltiples entornos. En este artículo, compartiré mi experiencia implementando pipelines con Google Cloud Build, scripts Bash y el repositorio de artefactos Archiva para gestionar despliegues en máquinas virtuales.</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">El problema inicial</h2>
<p class="whitespace-normal">Antes de implementar nuestra solución automatizada, nos enfrentábamos a varios desafíos:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Despliegues manuales propensos a errores</li>
<li class="whitespace-normal break-words">Falta de consistencia entre entornos</li>
<li class="whitespace-normal break-words">Tiempos de entrega prolongados</li>
<li class="whitespace-normal break-words">Dificultad para rastrear qué versión estaba desplegada en cada entorno</li>
<li class="whitespace-normal break-words">Complejidad para gestionar dependencias y artefactos Java</li>
</ul>
<p class="whitespace-normal">Necesitábamos una solución que pudiera gestionar el ciclo completo: desde la compilación del código fuente hasta el despliegue en nuestras máquinas virtuales, manteniendo un registro central de los artefactos generados.</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Componentes de la solución</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Google Cloud Build</h3>
<p class="whitespace-normal">Elegimos Cloud Build como el motor principal de nuestra pipeline de CI/CD por varias razones:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Integración nativa con Google Cloud Platform</li>
<li class="whitespace-normal break-words">Escalabilidad automática según las necesidades</li>
<li class="whitespace-normal break-words">Facilidad para definir pasos de construcción mediante archivos YAML</li>
<li class="whitespace-normal break-words">Capacidad para utilizar imágenes Docker personalizadas</li>
<li class="whitespace-normal break-words">API robusta para la integración con otros servicios</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">SonarQube</h3>
<p class="whitespace-normal">Implementamos SonarQube como parte esencial de nuestra pipeline para garantizar la calidad del código:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Análisis estático para detectar bugs y vulnerabilidades</li>
<li class="whitespace-normal break-words">Medición de cobertura de pruebas</li>
<li class="whitespace-normal break-words">Evaluación continua de la deuda técnica</li>
<li class="whitespace-normal break-words">Verificación del cumplimiento de estándares de codificación</li>
<li class="whitespace-normal break-words">Integración perfecta con el flujo de CI/CD</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Apache Archiva</h3>
<p class="whitespace-normal">Para la gestión de artefactos, implementamos Apache Archiva, un repositorio de artefactos que nos permitió:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Almacenar y versionar nuestros JAR, WAR y otros artefactos Java</li>
<li class="whitespace-normal break-words">Gestionar dependencias de manera centralizada</li>
<li class="whitespace-normal break-words">Establecer políticas de retención de artefactos</li>
<li class="whitespace-normal break-words">Controlar el acceso a los diferentes repositorios</li>
<li class="whitespace-normal break-words">Rastrear metadatos de los artefactos</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Scripts Bash</h3>
<p class="whitespace-normal">El pegamento que unía todo nuestro sistema eran los scripts Bash, que nos proporcionaron:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Flexibilidad para adaptarnos a casos específicos</li>
<li class="whitespace-normal break-words">Capacidad para interactuar con APIs y servicios externos</li>
<li class="whitespace-normal break-words">Manejo de errores y reintentos personalizados</li>
<li class="whitespace-normal break-words">Despliegue en máquinas virtuales mediante SSH</li>
</ul>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Arquitectura de la pipeline</h2>
<p class="whitespace-normal">Nuestra pipeline de CI/CD sigue este proceso:</p>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7">
<li class="whitespace-normal break-words"><strong>Trigger</strong>: Un push a una rama específica o la creación de una tag desencadena la pipeline</li>
<li class="whitespace-normal break-words"><strong>Build</strong>: Cloud Build compila el código Java utilizando Maven o Gradle</li>
<li class="whitespace-normal break-words"><strong>Test</strong>: Se ejecutan pruebas unitarias e integración</li>
<li class="whitespace-normal break-words"><strong>Análisis de calidad</strong>: SonarQube realiza un análisis estático y evaluación de calidad del código</li>
<li class="whitespace-normal break-words"><strong>Empaquetado</strong>: Se generan los artefactos (JAR, WAR)</li>
<li class="whitespace-normal break-words"><strong>Publicación</strong>: Los artefactos se suben a Apache Archiva</li>
<li class="whitespace-normal break-words"><strong>Despliegue</strong>: Scripts Bash se conectan por SSH a las VMs y despliegan los artefactos</li>
</ol>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Implementación estratégica</h2>
<p class="whitespace-normal">La implementación de nuestra pipeline requirió un enfoque meticuloso para integrar correctamente todos los componentes. La configuración de Cloud Build con los pasos adecuados fue fundamental, así como la integración de SonarQube para garantizar que solo el código que cumpliera con los estándares de calidad pudiera pasar a producción.</p>
<p class="whitespace-normal">Desarrollamos scripts personalizados para manejar la comunicación entre los diferentes sistemas y establecimos puertas de calidad (quality gates) en cada etapa del proceso. El diseño modular nos permitió tener un sistema fácilmente adaptable a diferentes proyectos y entornos.</p>
<p class="whitespace-normal">La integración entre SonarQube, Archiva y nuestros scripts de despliegue fue uno de los aspectos más desafiantes, pero también uno de los más gratificantes una vez implementado correctamente. Cada componente tenía un papel bien definido en la cadena de CI/CD, lo que permitía identificar rápidamente cualquier problema y solucionarlo sin afectar al resto del sistema.</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Configuración de SonarQube</h3>
<p class="whitespace-normal">La integración de SonarQube fue crucial para mantener la calidad del código:</p>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Establecimos Quality Gates con umbrales estrictos:
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Cobertura de código mínima del 80%</li>
<li class="whitespace-normal break-words">Cero vulnerabilidades críticas</li>
<li class="whitespace-normal break-words">Menos de 5% de código duplicado</li>
</ul>
</li>
<li class="whitespace-normal break-words">Configuramos reglas personalizadas según los estándares de nuestra organización</li>
<li class="whitespace-normal break-words">Implementamos webhooks para notificar al equipo sobre problemas detectados</li>
<li class="whitespace-normal break-words">Integramos los resultados del análisis como un paso bloqueante en nuestra pipeline</li>
</ol>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Configuración de Archiva</h3>
<p class="whitespace-normal">Para Archiva, creamos un repositorio interno y configuramos las políticas de seguridad:</p>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Creamos usuarios específicos para despliegue con permisos limitados</li>
<li class="whitespace-normal break-words">Configuramos la retención de snapshots y releases</li>
<li class="whitespace-normal break-words">Establecimos políticas de proxy para dependencias externas</li>
<li class="whitespace-normal break-words">Configuramos índices para búsquedas eficientes</li>
</ol>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Lecciones aprendidas</h2>
<p class="whitespace-normal">Durante la implementación de esta solución, aprendí varias lecciones valiosas:</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Calidad como prioridad</h3>
<p class="whitespace-normal">La integración de SonarQube desde el principio nos ahorró innumerables horas de depuración y problemas en producción:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">El análisis continuo permite detectar problemas temprano en el ciclo de desarrollo</li>
<li class="whitespace-normal break-words">Los desarrolladores mejoraron sus prácticas al recibir retroalimentación inmediata</li>
<li class="whitespace-normal break-words">La visualización de métricas de calidad motivó al equipo a mejorar constantemente</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Gestión de secretos</h3>
<p class="whitespace-normal">Implementamos un sistema robusto para la gestión de credenciales:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Secretos almacenados en Secret Manager de GCP</li>
<li class="whitespace-normal break-words">Variables de entorno seguras en Cloud Build</li>
<li class="whitespace-normal break-words">Cuentas de servicio con privilegios mínimos</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Tolerancia a fallos</h3>
<p class="whitespace-normal">Los despliegues a veces fallaban por problemas de red o recursos. Mejoramos la resiliencia con:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Reintentos automáticos con backoff exponencial</li>
<li class="whitespace-normal break-words">Validaciones de estado tras el despliegue</li>
<li class="whitespace-normal break-words">Capacidad de rollback automático</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Paralelización</h3>
<p class="whitespace-normal">Para reducir los tiempos de despliegue en entornos con muchas VMs, implementamos:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Despliegues paralelos con control de concurrencia</li>
<li class="whitespace-normal break-words">Caché de artefactos entre pasos de la pipeline</li>
<li class="whitespace-normal break-words">Optimización de la compilación con compilación incremental</li>
</ul>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Resultados</h2>
<p class="whitespace-normal">La implementación de esta pipeline nos proporcionó beneficios significativos:</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words"><strong>Reducción del tiempo de despliegue</strong>: de 45 minutos a menos de 5 minutos</li>
<li class="whitespace-normal break-words"><strong>Eliminación de errores humanos</strong>: gracias a la automatización completa</li>
<li class="whitespace-normal break-words"><strong>Mejora en la calidad del código</strong>: las métricas de SonarQube mostraron una reducción del 40% en la deuda técnica</li>
<li class="whitespace-normal break-words"><strong>Mayor trazabilidad</strong>: registro completo de qué versión está en cada entorno</li>
<li class="whitespace-normal break-words"><strong>Mejora de la colaboración</strong>: el equipo puede concentrarse en desarrollo en lugar de operaciones</li>
<li class="whitespace-normal break-words"><strong>Escalabilidad</strong>: añadir nuevos entornos o servidores es trivial</li>
</ul>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">Conclusión</h2>
<p class="whitespace-normal">La combinación de Cloud Build, SonarQube, scripts Bash y Apache Archiva nos ha permitido crear una solución robusta para el despliegue de aplicaciones Java. Si bien he compartido algunos aspectos de nuestra implementación, las soluciones específicas para cada organización requieren un análisis detallado de su infraestructura, procesos y necesidades particulares.</p>
<p class="whitespace-normal">Esta arquitectura nos permitió no solo automatizar despliegues, sino también elevar significativamente la calidad del software entregado, reduciendo incidentes en producción y acelerando el ciclo de desarrollo.</p>
<p class="whitespace-normal">Para equipos que enfrentan retos similares, recomiendo un enfoque incremental y personalizado. Cada organización tiene necesidades únicas que deben ser cuidadosamente analizadas para implementar la solución óptima.</p>
<hr />
<p class="whitespace-normal"><em>¿Necesitas implementar una solución similar en tu organización? En <a href="https://webmago.dev/" target="_blank" rel="noopener">webmago.dev</a> ofrecemos consultoría especializada en la implementación de pipelines de CI/CD para entornos Java. <a title="Contactanos" href="https://webmago.dev/#contact" target="_blank" rel="noopener">Contáctanos</a> para explorar cómo podemos ayudarte a optimizar tus procesos de desarrollo y despliegue.</em></p>The post <a href="https://webmago.dev/automatizando-el-despliegue-de-artefactos-java-mi-experiencia-con-cloud-build-bash-y-archiva-en-vms/">Automatizando el despliegue de artefactos Java: Mi experiencia con Cloud Build, Bash y Archiva en VMs</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mi Experiencia con Google Cloud Functions: Validación y Procesamiento Seguro de Archivos</title>
		<link>https://webmago.dev/mi-experiencia-con-google-cloud-functions-validacion-y-procesamiento-seguro-de-archivos/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Fri, 09 May 2025 16:12:08 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[gcp]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=5903</guid>
					<description><![CDATA[<p>En este post, compartiré mi experiencia desarrollando una solución en Google Cloud Platform (GCP) que automatiza la validación y procesamiento de archivos utilizando Cloud Functions, Cloud Storage y validación de firmas digitales. 🔹 El Problema: Procesamiento Seguro de Archivos Un cliente necesitaba un sistema donde: Al subir un archivo cifrado y comprimido a un bucket de Cloud Storage, [&#8230;]</p>
The post <a href="https://webmago.dev/mi-experiencia-con-google-cloud-functions-validacion-y-procesamiento-seguro-de-archivos/">Mi Experiencia con Google Cloud Functions: Validación y Procesamiento Seguro de Archivos</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p class="ds-markdown-paragraph">En este post, compartiré mi experiencia desarrollando una solución en <strong>Google Cloud Platform (GCP)</strong> que automatiza la validación y procesamiento de archivos utilizando <strong>Cloud Functions, Cloud Storage y validación de firmas digitales</strong>.</p>
<h2><strong>🔹 El Problema: Procesamiento Seguro de Archivos</strong></h2>
<p class="ds-markdown-paragraph">Un cliente necesitaba un sistema donde:</p>
<ol start="1">
<li>
<p class="ds-markdown-paragraph"><strong>Al subir un archivo cifrado y comprimido a un bucket de Cloud Storage</strong>, se validara su autenticidad mediante una <strong>firma compartida</strong> entre emisor y receptor.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Si el archivo era válido, se <strong>descomprimía</strong> y se verificaba la integridad de los archivos internos usando <strong>SHA-256</strong>.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Solo los archivos que pasaran todas las validaciones serían procesados.</p>
</li>
</ol>
<h2><strong>⚡ La Solución: Automatización con Cloud Functions</strong></h2>
<h3><strong>1️⃣ Trigger por Eventos de Cloud Storage</strong></h3>
<p class="ds-markdown-paragraph">Configuré una <strong>Cloud Function</strong> activada por eventos de Cloud Storage (<code>google.storage.object.finalize</code>), lo que permite ejecutar código cada vez que se sube un archivo.</p>
<h3><strong>Validación de Firma Compartida</strong></h3>
<p class="ds-markdown-paragraph">El archivo ZIP incluía un archivo <code>.signature</code> con una firma generada mediante un <strong>secreto compartido</strong>. Usé <strong>HMAC-SHA256</strong> para asegurar que el archivo no fuera alterado.</p>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="efa13877">
<div class="ds-button ds-button--secondary ds-button--borderless ds-button--rect ds-button--s _7db3914" tabindex="0" role="button"></div>
</div>
</div>
</div>
</div>
</div>
<pre><code class="language-python">import hmac
import hashlib
def validate_signature(secret_key, file_content, received_signature):
    generated_signature = hmac.new(secret_key.encode(), file_content, hashlib.sha256).hexdigest()
    return hmac.compare_digest(generated_signature, received_signature)</code></pre>
</div>
<h3><strong>3️⃣ Descompresión y Validación SHA-256</strong></h3>
<p class="ds-markdown-paragraph">Una vez validada la firma, el sistema descomprimía el archivo y verificaba cada archivo interno contra un hash predefinido.</p>
<div class="md-code-block md-code-block-light">
<pre><code class="language-python">import zipfile
import hashlib
def check_file_hash(file_path, expected_hash):
    with open(file_path, &quot;rb&quot;) as f:
        file_data = f.read()
        computed_hash = hashlib.sha256(file_data).hexdigest()
        return computed_hash == expected_hash</code></pre>
</div>
<h3><strong>4️⃣ Notificación y Manejo de Errores</strong></h3>
<p class="ds-markdown-paragraph">Si alguna validación fallaba, el sistema enviaba una alerta por <strong>Pub/Sub</strong> o <strong>Correo Electrónico</strong> para notificar al administrador.</p>
<h2><strong>📊 Resultados</strong></h2>
<p class="ds-markdown-paragraph">✅ <strong>Procesamiento automatizado y seguro</strong> sin intervención manual o humana.<br />
✅ <strong>Reducción de errores</strong> por archivos corruptos o no autorizados.<br />
✅ <strong>Escalabilidad</strong> gracias a Cloud Functions (pago por uso).</p>
<h2><strong>🚀 ¿Necesitas una Solución Similar?</strong></h2>
<p class="ds-markdown-paragraph">Si buscas automatizar procesos en la nube con <strong>GCP, AWS o Azure</strong>, puedo ayudarte a diseñar e implementar una solución robusta y segura.</p>
<p class="ds-markdown-paragraph">📩 <a href="https://webmago.dev/#contact"><strong>¡Contáctame y hablemos de tu proyecto!</strong></a></p>The post <a href="https://webmago.dev/mi-experiencia-con-google-cloud-functions-validacion-y-procesamiento-seguro-de-archivos/">Mi Experiencia con Google Cloud Functions: Validación y Procesamiento Seguro de Archivos</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Administrando Droplets con Pulumi</title>
		<link>https://webmago.dev/administrando-droplets-con-pulumi/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Fri, 05 Mar 2021 16:41:44 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[digital ocean]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[infraestructura]]></category>
		<category><![CDATA[pulumi]]></category>
		<category><![CDATA[IaC]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=788</guid>
					<description><![CDATA[<p>Un Droplet es el nombre que Digital Ocean le da a sus maquinas virtuales, es muy probable que algunas aplicaciones requieran de un arquitectura que involucre 1 o mas Droplets y que estos se encuentren balanceados. &#160; Usando código en Typescript trabaje en un PoC para vincular 3 Droplets y balancear sus cargas, para ello [&#8230;]</p>
The post <a href="https://webmago.dev/administrando-droplets-con-pulumi/">Administrando Droplets con Pulumi</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Un Droplet es el nombre que <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a> le da a sus maquinas virtuales, es muy probable que algunas aplicaciones requieran de un arquitectura que involucre 1 o mas Droplets y que estos se encuentren balanceados.</p>
<p>&nbsp;</p>
<p>Usando código en Typescript trabaje en un PoC para vincular 3 Droplets y balancear sus cargas, para ello hice uso de <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> para generar la arquitectura en donde un balanceador de carga recibirá las peticiones y las dirigirá hacia los droplets, a su vez un firewall evitara accesos a puertos no solicitados.</p>
<p>&nbsp;</p>
<p>En un post <a title="Pulumi (IaC) con Digital Ocean" href="https://webmago.dev/pulumi-iac-con-digital-ocean/" target="_blank" rel="noopener noreferrer">previo</a> hable de <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> con <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a>, con el que trabaje en un PoC y Kubernetes. Para este PoC me base en este <a title="Pulumi DigitalOcean Droplets" href="https://github.com/pulumi/examples/tree/master/digitalocean-ts-loadbalanced-droplets" target="_blank" rel="noopener noreferrer">código</a>  al cual le hice algunas adecuaciones para instalar docker y ejecutar el contenedor de <a title="Codigo Simple Web en Python" href="https://github.com/yeasy/simple-web" target="_blank" rel="noopener noreferrer">Simple Web</a> y validar el balanceo a través de los 3 Droplets creados.</p>
<p>&nbsp;</p>
<p>En la primer creación del Load Balancer, el verificador de salud lo habia definido para revisar el protocolo TCP en el puerto 80, esto genero un fallo general debido al uso del contenedor con python, por lo que procedí a ajustarlo para revisar el protocolo HTTP en el codigo de Typescript en lugar de hacerlo en el panel administrativo de Digital Ocean obteniendo así el estado de salud satisfactorio.</p>
<p>Cabe señalar que existen algunos glitches que <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> deberá resolver como en el caso de actualizar el Userdata de los Droplets se generan errores en el recurso del Firewall y Load Balancer.</p>
<p>&nbsp;</p>
<p>Les dejo a continuación unas capturas del PoC.</p>
<div id="attachment_790" style="width: 1034px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-790" class="size-large wp-image-790" src="https://webmago.dev/buvytsan/2021/03/pulumi-up-1024x865.png" alt="Pulumi Stack" width="1024" height="865" srcset="https://webmago.dev/buvytsan/2021/03/pulumi-up-1024x865.png 1024w, https://webmago.dev/buvytsan/2021/03/pulumi-up-300x253.png 300w, https://webmago.dev/buvytsan/2021/03/pulumi-up-768x649.png 768w, https://webmago.dev/buvytsan/2021/03/pulumi-up-1536x1298.png 1536w, https://webmago.dev/buvytsan/2021/03/pulumi-up.png 1664w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-790" class="wp-caption-text">Pulumi Stack</p></div>
<p>&nbsp;</p>
<div id="attachment_793" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-793" class="size-large wp-image-793" src="https://webmago.dev/buvytsan/2021/03/do-vpc-1024x455.png" alt="DO VPC creado" width="1024" height="455" srcset="https://webmago.dev/buvytsan/2021/03/do-vpc-1024x455.png 1024w, https://webmago.dev/buvytsan/2021/03/do-vpc-300x133.png 300w, https://webmago.dev/buvytsan/2021/03/do-vpc-768x341.png 768w, https://webmago.dev/buvytsan/2021/03/do-vpc-1536x682.png 1536w, https://webmago.dev/buvytsan/2021/03/do-vpc-2048x910.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-793" class="wp-caption-text">DO VPC creado</p></div>
<p>&nbsp;</p>
<div id="attachment_792" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-792" class="size-large wp-image-792" src="https://webmago.dev/buvytsan/2021/03/do-droplets-1024x332.png" alt="DO DROPLETS creados" width="1024" height="332" srcset="https://webmago.dev/buvytsan/2021/03/do-droplets-1024x332.png 1024w, https://webmago.dev/buvytsan/2021/03/do-droplets-300x97.png 300w, https://webmago.dev/buvytsan/2021/03/do-droplets-768x249.png 768w, https://webmago.dev/buvytsan/2021/03/do-droplets-1536x498.png 1536w, https://webmago.dev/buvytsan/2021/03/do-droplets-2048x664.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-792" class="wp-caption-text">DO DROPLETS creados</p></div>
<p>&nbsp;</p>
<div id="attachment_791" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-791" class="size-large wp-image-791" src="https://webmago.dev/buvytsan/2021/03/do-lb-1024x329.png" alt="DO LB creados" width="1024" height="329" srcset="https://webmago.dev/buvytsan/2021/03/do-lb-1024x329.png 1024w, https://webmago.dev/buvytsan/2021/03/do-lb-300x96.png 300w, https://webmago.dev/buvytsan/2021/03/do-lb-768x246.png 768w, https://webmago.dev/buvytsan/2021/03/do-lb-1536x493.png 1536w, https://webmago.dev/buvytsan/2021/03/do-lb-2048x657.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-791" class="wp-caption-text">DO LB creado</p></div>
<p>&nbsp;</p>
<div id="attachment_789" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-789" class="size-large wp-image-789" src="https://webmago.dev/buvytsan/2021/03/do-fw-1024x333.png" alt="DO FW creado" width="1024" height="333" srcset="https://webmago.dev/buvytsan/2021/03/do-fw-1024x333.png 1024w, https://webmago.dev/buvytsan/2021/03/do-fw-300x97.png 300w, https://webmago.dev/buvytsan/2021/03/do-fw-768x250.png 768w, https://webmago.dev/buvytsan/2021/03/do-fw-1536x499.png 1536w, https://webmago.dev/buvytsan/2021/03/do-fw-2048x665.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-789" class="wp-caption-text">DO FW creado</p></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="style-80 style-local-23-m39 position-relative" data-colibri-id="14-m39">
<div class="h-global-transition-all colibri-post-content">
<div class="style-80 style-local-23-m39 position-relative" data-colibri-id="14-m39">
<div class="h-global-transition-all colibri-post-content">
<p>Si requieres de mi ayuda para administrar tu infraestructura <a href="https://webmago.dev/#contact">contáctame</a>.</p>
</div>
</div>
</div>
</div>The post <a href="https://webmago.dev/administrando-droplets-con-pulumi/">Administrando Droplets con Pulumi</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pulumi (IaC) con Digital Ocean</title>
		<link>https://webmago.dev/pulumi-iac-con-digital-ocean/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Thu, 04 Mar 2021 03:41:00 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[infraestructura]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[pulumi]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[digital ocean]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=778</guid>
					<description><![CDATA[<p>La administración de la infraestructura puede ser manejada a partir de generar código, es decir, Infraestructura como Código también conocida como IaC en ingles. &#160; Puedes usar una gran variedad de software para llevarlo a cabo, lo que implica en algunos casos aprender un nuevo lenguaje, algo que Pulumi ha tomado en cuenta para su [&#8230;]</p>
The post <a href="https://webmago.dev/pulumi-iac-con-digital-ocean/">Pulumi (IaC) con Digital Ocean</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>La administración de la infraestructura puede ser manejada a partir de generar código, es decir, Infraestructura como Código también conocida como IaC en ingles.</p>
<p>&nbsp;</p>
<p>Puedes usar una gran variedad de software para llevarlo a cabo, lo que implica en algunos casos aprender un nuevo lenguaje, algo que <a title="Pulumi" href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer">Pulumi</a> ha tomado en cuenta para su rápida adopción, por lo que si sabes Typescript, Go, Python, Javascript o .Net reducirás enormemente la curvatura de aprendizaje.</p>
<p>&nbsp;</p>
<p>Había escuchado de <a title="Pulumi" href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer">Pulumi</a> hace un año, hace unas semanas tome dos webinars  y las dudas que tenia sobre su uso, escenarios me animo a probarlo con una <a title="Promo Digital Ocean" href="https://m.do.co/c/82e9086ec3ae" target="_blank" rel="noopener noreferrer">promo</a> que obtuve en <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a> por lo que inicie con la creación de un cluster <a title="Kubernetes" href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer">Kuberntes</a> usando Typescript. <a title="Pulumi" href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer">Pulumi</a> te ofrece una version <a title="Pricing" href="https://www.pulumi.com/pricing/" target="_blank" rel="noopener noreferrer">gratuita</a> si únicamente tú usas el entorno.</p>
<p>&nbsp;</p>
<p>La ventaja de esto que puedes ir haciéndolo poco a poco y esta es la lista ordenada de lo que fui administrando con mi código.</p>
<p>&nbsp;</p>
<ol>
<li>Creación del Cluster Kubernetes.</li>
<li>Creación de algunos namespaces, ex: staging, website</li>
<li>Creación de un primer Deployment con nginx en el namespace de staging.</li>
<li>Creación de un ClusterIP Service para el Deployment creado en el punto 3.</li>
<li>Una gran pausa para instalar Istio (muy complicado y tomaría mas horas) o nginx como Ingress</li>
<li>Después de decidirme en el punto 5 por nginx, procedí a crear el código para instalarlo como Ingress, con su namespace usando el <a title="Hlem" href="https://helm.sh/" target="_blank" rel="noopener noreferrer">Helm v3</a> Chart; esto me genero un LoadBalancer en <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a> a su vez asignándome la IP Publica.</li>
<li>Creación de un Service Ingress para dirigir el tráfico del ingress-nginx creado en el punto 6 hacia el ClusterIP creado en el punto 4, puedes verlo en <a title="do.webmago.dev" href="http://do.webmago.dev" target="_blank" rel="noopener noreferrer">do.webmago.dev</a> (puede no estar disponible en el futuro).</li>
</ol>
<div id="attachment_785" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-785" class="size-large wp-image-785" src="https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1-1024x265.png" alt="Ejecucion Paso 1 Pulumi" width="1024" height="265" srcset="https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1-1024x265.png 1024w, https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1-300x78.png 300w, https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1-768x199.png 768w, https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1-1536x397.png 1536w, https://webmago.dev/buvytsan/2021/03/pulumi-do-step-1.png 1894w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-785" class="wp-caption-text">Ejecucion Paso 1 Pulumi</p></div>
<p>&nbsp;</p>
<div id="attachment_784" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-784" class="size-large wp-image-784" src="https://webmago.dev/buvytsan/2021/03/do-step-1-1024x595.png" alt="Revision Dashboard Digital Ocean" width="1024" height="595" srcset="https://webmago.dev/buvytsan/2021/03/do-step-1-1024x595.png 1024w, https://webmago.dev/buvytsan/2021/03/do-step-1-300x174.png 300w, https://webmago.dev/buvytsan/2021/03/do-step-1-768x446.png 768w, https://webmago.dev/buvytsan/2021/03/do-step-1-1536x893.png 1536w, https://webmago.dev/buvytsan/2021/03/do-step-1-2048x1191.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-784" class="wp-caption-text">Revision Dashboard Digital Ocean</p></div>
<p>&nbsp;</p>
<div id="attachment_786" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-786" class="size-large wp-image-786" src="https://webmago.dev/buvytsan/2021/03/pulumi-step-1-1024x597.png" alt="Dashboard Pulumi paso 1" width="1024" height="597" srcset="https://webmago.dev/buvytsan/2021/03/pulumi-step-1-1024x597.png 1024w, https://webmago.dev/buvytsan/2021/03/pulumi-step-1-300x175.png 300w, https://webmago.dev/buvytsan/2021/03/pulumi-step-1-768x448.png 768w, https://webmago.dev/buvytsan/2021/03/pulumi-step-1-1536x896.png 1536w, https://webmago.dev/buvytsan/2021/03/pulumi-step-1-2048x1195.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-786" class="wp-caption-text">Dashboard Pulumi paso 1</p></div>
<p>&nbsp;</p>
<p>Cabe señalar que para mantener mi entorno aislado y no interferir con mis configuraciones de mi equipo trabaje desde un contenedor de <a title="Docker" href="https://docker.com" target="_blank" rel="noopener noreferrer">docker</a>.</p>
<p>&nbsp;</p>
<p>Tengo que aclarar que tuve algunos glitches con Pulumi al aplicar/actualizar cambios y al parecer es un comportamiento algo raro que tiene <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a>, por lo que recibía errores y tenia que volver a ejecutar la actualización de cambios.</p>
<p>&nbsp;</p>
<p>En mi experiencia, puedo decir que <a title="Pulumi" href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer">Pulumi</a> reduce considerablemente su curvatura de aprendizaje y adopción permitiéndote administrar tu Infraestructura como Código con los lenguajes antes mencionados.</p>
<p>&nbsp;</p>
<div class="style-80 style-local-23-m39 position-relative" data-colibri-id="14-m39">
<div class="h-global-transition-all colibri-post-content">
<p>Si requieres de mi ayuda para administrar tu infraestructura <a href="https://webmago.dev/#contact">contáctame</a>.</p>
</div>
</div>The post <a href="https://webmago.dev/pulumi-iac-con-digital-ocean/">Pulumi (IaC) con Digital Ocean</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Weavescope metricas, administracion, visualizacion en tiempo real</title>
		<link>https://webmago.dev/weavescope-metricas-administracion-visualizacion-en-tiempo-real/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Tue, 16 Feb 2021 21:13:01 +0000</pubDate>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[loggin]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[weavescope]]></category>
		<category><![CDATA[weaveworks]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=758</guid>
					<description><![CDATA[<p>Actualmente administro Clusters Kubernetes y algunos VPS con Docker con sitios web, parte de trabajar como DevOps es  observar cómo los micro-servicios consumen recursos tales como CPU o Memoria; y me ha tocado que fuera de horario de oficina tengo que acceder y monitorear recursos cuando se espera un consumo basado en noticias de impacto; [&#8230;]</p>
The post <a href="https://webmago.dev/weavescope-metricas-administracion-visualizacion-en-tiempo-real/">Weavescope metricas, administracion, visualizacion en tiempo real</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Actualmente administro Clusters Kubernetes y algunos VPS con Docker con sitios web, parte de trabajar como DevOps es  observar cómo los micro-servicios consumen recursos tales como CPU o Memoria; y me ha tocado que fuera de horario de oficina tengo que acceder y monitorear recursos cuando se espera un consumo basado en noticias de impacto; por lo que debo cargar en todo momento un dispositivo movil.</p>
<p>&nbsp;</p>
<p>Para los clusters Kubernetes me auxilio de &#8220;Monitoring&#8221; (antes Stackdriver) en GCP o CloudWatch en AWS, o incluso Prometheus con Grafana.</p>
<p>&nbsp;</p>
<p>Lo que hace de <a href="https://www.weave.works/oss/scope/" target="_blank" rel="noopener noreferrer">Weavescope</a> un software Open Source tan peculiar no solo es ver métricas, sino pausar, detener, reiniciar un contenedor o acceder a la terminal del mismo para hacer algunas operaciones tal como si fuera una terminal remota.</p>
<p>&nbsp;</p>
<p>Esta versatilidad de <a href="https://www.weave.works/oss/scope/" target="_blank" rel="noopener noreferrer">Weavescope</a> me permite visualizar y hacer operaciones cuando solo cuento con un dispositivo móvil como una tableta o un iPad.</p>
<p>&nbsp;</p>
<p><a href="https://www.weave.works/oss/scope/" target="_blank" rel="noopener noreferrer">Weavescope</a> ofrece varias alternativas de ser <a href="https://www.weave.works/docs/scope/latest/installing/" target="_blank" rel="noopener noreferrer">instalado</a>, en mi caso donde uso VPS con docker-compose opte por esta version con algunos ajustes que no se mencionan en la version oficial, tal es el caso de la autenticacion, ya que de no contar con esto cualquiera que conozca la dirección de mi instalacion podria hacer un mal uso como detener o crear contenedores y vulnerar mi sistema.</p>
<p>&nbsp;</p>
<p><a href="https://www.weave.works/" target="_blank" rel="noopener noreferrer">Weaveworks</a> la compañia creadora de <a href="https://www.weave.works/oss/scope/" target="_blank" rel="noopener noreferrer">Weavescope</a> ofrece diferentes soluciones de automatizacion CI-CD, monitoreo y registros, una de las herramientas mas novedosas GitOps basado en Kubernetes.</p>
<p>&nbsp;</p>
<p>No olvides <a href="https://webmago.dev/#contact">contactarme</a> si requieres asistencia en tus proyectos.</p>
<p>&nbsp;</p>
<p>A continuacion dejo una serie de capturas de una de mis instalaciones de <a href="https://www.weave.works/oss/scope/" target="_blank" rel="noopener noreferrer">Weavescope</a>.</p>
<div id="attachment_760" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-760" class="size-large wp-image-760" src="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-1024x570.png" alt="Filtrando por Contenedor" width="1024" height="570" srcset="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-1024x570.png 1024w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-300x167.png 300w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-768x427.png 768w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-1536x854.png 1536w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.11.22-2048x1139.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-760" class="wp-caption-text">Filtrando los recursos por contenedor</p></div>
<p>&nbsp;</p>
<div id="attachment_761" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-761" class="wp-image-761 size-large" src="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.21.25-1024x571.png" alt="Accediendo al contenedor" width="1024" height="571" srcset="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.21.25-1024x571.png 1024w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.21.25-300x167.png 300w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.21.25-768x428.png 768w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.21.25.png 1431w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-761" class="wp-caption-text">En la ficha del contenedor se observan varios botones para efectuar operaciones tales como adjuntar, acceder a la terminal, refrescar, pausar, detener el contenedor.</p></div>
<p>&nbsp;</p>
<div id="attachment_762" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-762" class="size-large wp-image-762" src="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.29.47-1024x567.png" alt="Accediendo a la terminal." width="1024" height="567" srcset="https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.29.47-1024x567.png 1024w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.29.47-300x166.png 300w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.29.47-768x425.png 768w, https://webmago.dev/buvytsan/2021/02/Captura-de-Pantalla-2021-02-16-a-las-14.29.47.png 1432w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-762" class="wp-caption-text">Esta version grafica es un atajo a la instruccion &#8220;docker exec -it dbadmin bash&#8221;</p></div>The post <a href="https://webmago.dev/weavescope-metricas-administracion-visualizacion-en-tiempo-real/">Weavescope metricas, administracion, visualizacion en tiempo real</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Blue-Green Deployment con Codefresh</title>
		<link>https://webmago.dev/blue-green-deployment-con-codefresh/</link>
					<comments>https://webmago.dev/blue-green-deployment-con-codefresh/#respond</comments>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Fri, 11 Dec 2020 14:51:29 +0000</pubDate>
				<category><![CDATA[codefresh]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[blue-green]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[kuberntes]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=500</guid>
					<description><![CDATA[<p>Entre los tipos de Deployment existentes Red/Black Blue/Green Rollout Canary Me he inclinado por usar el segundo de la lista, el deploy Blue/Green, el cual te permite lanzar una nueva versión e ir redirigiendo tráfico de forma gradual a la nueva versión. Existe una gran variedad de plugins en Codefresh uno de ellos, hacer un [&#8230;]</p>
The post <a href="https://webmago.dev/blue-green-deployment-con-codefresh/">Blue-Green Deployment con Codefresh</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Entre los tipos de Deployment existentes</p>
<ul>
<li>Red/Black</li>
<li>Blue/Green</li>
<li>Rollout</li>
<li>Canary</li>
</ul>
<p>Me he inclinado por usar el segundo de la lista, el deploy <strong>Blue/Green</strong>, el cual te permite lanzar una nueva versión e ir redirigiendo tráfico de forma gradual a la nueva versión.</p>
<p>Existe una gran variedad de plugins en <a title="Codefresh" href="https://codefresh.io" target="_blank" rel="noopener noreferrer">Codefresh</a> uno de ellos, hacer un Deploy en tu entorno Kubernetes con Blue/Green, incluso hay un plugin y <a title="Howto" href="https://codefresh.io/kubernetes-tutorial/simple-canary-codefresh-k8s-2/" target="_blank" rel="noopener noreferrer">Howto</a> para hacer un Canary Deployment.</p>
<p>Una de las ventajas de este plugin es que en caso de existir algun timeout, o error en el despliegue de la nueva version, la version actual no se ve afectada debido a que la nueva version es eliminada del clúster.</p>
<p>En caso de ser exitoso el despliegue el plugin en automatico inicia el proceso de redireccion del trafico hacia la  nueva version de forma gradual.</p>
<p>La integracion de este plugin en mis pipelines me ha permitido hacer despliegues sin caídas en entornos de producción de alto tráfico.</p>The post <a href="https://webmago.dev/blue-green-deployment-con-codefresh/">Blue-Green Deployment con Codefresh</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
					<wfw:commentRss>https://webmago.dev/blue-green-deployment-con-codefresh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integrando SonarQube en pipelines CI/CD de Codefresh</title>
		<link>https://webmago.dev/integrando-sonarqube-en-pipelines-ci-cd-de-codefresh/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Tue, 08 Dec 2020 01:21:05 +0000</pubDate>
				<category><![CDATA[codefresh]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[sonarqube]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=689</guid>
					<description><![CDATA[<p>Hace unos días vi un twit de Codefresh, donde incluso retuitee que la versión usada para su demostración era la de Pago SonarCloud y no SonarQube, por lo que retuitee que si se exponía la instalación gratuita de SonarQube tendría el mismo resultado. Code analysis made easy with the Codefresh&#8217;s @SonarQube integration &#8212; view the [&#8230;]</p>
The post <a href="https://webmago.dev/integrando-sonarqube-en-pipelines-ci-cd-de-codefresh/">Integrando SonarQube en pipelines CI/CD de Codefresh</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Hace unos días vi un twit de <a title="Codefresh" href="https://codefresh.io" target="_blank" rel="noopener noreferrer">Codefresh</a>, donde incluso retuitee que la versión usada para su demostración era la de Pago <a title="SonarCloud" href="https://sonarcloud.io/" target="_blank" rel="noopener noreferrer">SonarCloud</a> y no <a title="SonarQube" href="https://www.sonarqube.org/" target="_blank" rel="noopener noreferrer">SonarQube</a>, por lo que retuitee que si se exponía la instalación gratuita de SonarQube tendría el mismo resultado.</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="en">Code analysis made easy with the Codefresh&#8217;s <a href="https://twitter.com/SonarQube?ref_src=twsrc%5Etfw">@SonarQube</a> integration &#8212; view the analysis report after every build ? <a href="https://t.co/lg3VW2hFZO">https://t.co/lg3VW2hFZO</a><a href="https://twitter.com/hashtag/DevOps?src=hash&amp;ref_src=twsrc%5Etfw">#DevOps</a> <a href="https://twitter.com/hashtag/codeanalysis?src=hash&amp;ref_src=twsrc%5Etfw">#codeanalysis</a> <a href="https://twitter.com/hashtag/testing?src=hash&amp;ref_src=twsrc%5Etfw">#testing</a> <a href="https://twitter.com/urlichsanais?ref_src=twsrc%5Etfw">@urlichsanais</a> <a href="https://t.co/SkWJab3mKD">pic.twitter.com/SkWJab3mKD</a></p>
<p>— Codefresh (@codefresh) <a href="https://twitter.com/codefresh/status/1334180752267890694?ref_src=twsrc%5Etfw">December 2, 2020</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Así que me dí a la tarea de integrar el escaneo de código de uno de los proyectos asignados para confirmar la integración sugerida.</p>
<p>El documento en inglés de Codefresh puedes encontrarlo en <a title="Continuous Code Analysis with SonarQube and Codefresh" href="https://codefresh.io/howtos/sonarqube/" target="_blank" rel="noopener noreferrer">Continuous Code Analysis with SonarQube and Codefresh</a>, lo revise y por supuesto que tiene algunos detalles por resolver, en este <a title="La importancia de la calidad del código" href="https://webmago.dev/la-importancia-de-la-calidad-del-codigo/" target="_blank" rel="noopener noreferrer">artículo</a> describí que implemente SonarQube para escanear el código de los proyectos que me son asignados y que había implementado un Script en Bash para hacer el escaneo, algo manual por supuesto, por lo que hacer esto en el pipeline dejaría sin efecto a mi Bash Script, algo que ansiaba hacer en el corto plazo.</p>
<p>Por lo que describiré aquí cómo fue que lo implemente.</p>
<p>&nbsp;</p>
<h3><strong>Creando el proyecto en SonarQube.</strong></h3>
<p>Si aún no has instalado SonarQube, te recuerdo que puedes hacerlo usando Docker, mas información en <a title="Install the Server" href="https://docs.sonarqube.org/latest/setup/install-server/" target="_blank" rel="noopener noreferrer">Install the Server</a>.</p>
<ol>
<li>Para evitar &#8220;conflictos&#8221; y evitar &#8220;mirones&#8221; genere un nuevo Grupo y le asigne permisos únicamente para que el Administrador o Usuario indicado pueda ver este proyecto.</li>
<li>Genere el proyecto siguiendo el asistente de SonarQube y le asigne un Token para que desde Codefresh pueda usarlo.</li>
</ol>
<div id="attachment_696" style="width: 1034px" class="wp-caption alignnone"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-696" class="size-large wp-image-696" src="https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube-1024x499.png" alt="Creando Proyecto en Sonarqube" width="1024" height="499" srcset="https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube-1024x499.png 1024w, https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube-300x146.png 300w, https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube-768x374.png 768w, https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube-1536x748.png 1536w, https://webmago.dev/buvytsan/2020/12/CreandoProyectoSonarqube.png 1572w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-696" class="wp-caption-text">Creando Proyecto en Sonarqube</p></div>
<p>&nbsp;</p>
<div id="attachment_702" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-702" class="wp-image-702 size-large" src="https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-1024x578.png" alt="Proyecto Creado SonarQube" width="1024" height="578" srcset="https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-1024x578.png 1024w, https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-300x169.png 300w, https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-768x434.png 768w, https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-1536x868.png 1536w, https://webmago.dev/buvytsan/2020/12/Proyecto-Creado-SonarQube-1-2048x1157.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-702" class="wp-caption-text">Proyecto Creado SonarQube</p></div>
<p>&nbsp;</p>
<h3><strong>Integrando el Plugin al Pipeline del proyecto en Codefresh.</strong></h3>
<p>Este fue uno de los pasos de mayor atención, ya que mis pipelines toman las configuraciones de un repositorio adicional, por  lo que tuve que adicionar un Plugin solo para copiar el archivo <code>sonar-project.properties</code> en la raíz del proyecto.</p>
<div id="attachment_704" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-704" class="size-large wp-image-704" src="https://webmago.dev/buvytsan/2020/12/Integracion-Plugin-Pipeline-Codefresh-1024x663.png" alt="Integración Plugin Pipeline Codefresh" width="1024" height="663" srcset="https://webmago.dev/buvytsan/2020/12/Integracion-Plugin-Pipeline-Codefresh-1024x663.png 1024w, https://webmago.dev/buvytsan/2020/12/Integracion-Plugin-Pipeline-Codefresh-300x194.png 300w, https://webmago.dev/buvytsan/2020/12/Integracion-Plugin-Pipeline-Codefresh-768x497.png 768w, https://webmago.dev/buvytsan/2020/12/Integracion-Plugin-Pipeline-Codefresh.png 1519w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-704" class="wp-caption-text">Integración Plugin Pipeline Codefresh</p></div>
<p>&nbsp;</p>
<h3><strong>La hora de la verdad, ejecutando el pipeline manualmente.</strong></h3>
<p>Aquí es donde veremos si realmente funciona la teoría, claro que la ejecución final tuvo como antecesores varias pruebas para darnos cuenta que debido a la configuración que tomamos por separado no obtenía la propiedad <code>sonar.projectKey</code> necesaria para identificar al proyecto en nuestro SonarQube.</p>
<p>En la imagen podemos ver la ejecución exitosa de nuestro pipeline, en el log del paso <strong><em>QUALITY</em></strong> podemos ver el ID de la Tarea (Task) la cual es <code>AXY_dPYDfvCgCTUgh8X4</code> y debe coincidir con la tarea en el &#8220;fondo&#8221; (background) en nuestro escritorio, sección de tareas de SonarQube.</p>
<div id="attachment_707" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-707" class="size-large wp-image-707" src="https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh-1024x531.png" alt="Ejecución Pipeline SonarQube Codefresh" width="1024" height="531" srcset="https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh-1024x531.png 1024w, https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh-300x155.png 300w, https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh-768x398.png 768w, https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh-1536x796.png 1536w, https://webmago.dev/buvytsan/2020/12/Ejecucion-Pipeline-SonarQube-Codefresh.png 1912w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-707" class="wp-caption-text">Ejecución Pipeline SonarQube Codefresh</p></div>
<p>&nbsp;</p>
<h3><strong>Comprando en la cola de SonarQube la tarea de escaneo.</strong></h3>
<p>Como lo anticipe en mi <a title="The document mention SonarCloud (payment) instead Sonarqube (Free), I think I you expose your Sonarqube you can do the same with @codefresh pipeline." href="https://twitter.com/WebMago/status/1334187107028520969">retuit</a>, mencionando que usaban SonarCloud y que si exponían su instalación de SonarQube se podría hacer lo mismo que se indica en el Howto.</p>
<p>Así que vayamos a ver el Dashboard de SonarQube, he puesto en rojo el ID de la Tarea (Task) en la imagen para su rápida identificación.</p>
<div id="attachment_709" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-709" class="size-large wp-image-709" src="https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-1024x359.png" alt="Tareas en Background SonarQube" width="1024" height="359" srcset="https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-1024x359.png 1024w, https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-300x105.png 300w, https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-768x269.png 768w, https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-1536x538.png 1536w, https://webmago.dev/buvytsan/2020/12/Tareas-en-Background-SonarQube-2048x717.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-709" class="wp-caption-text">Tareas en Background SonarQube</p></div>
<p>Efectivamente podemos ver que la tarea del análisis lanzada desde Codefresh se esta ejecutando en mi instancia de SonarQube y al finalizar puedo revisar la calidad del código del proyecto.</p>
<div id="attachment_710" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-710" class="size-large wp-image-710" src="https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-1024x597.png" alt="Escritorio Proyecto SonarQube" width="1024" height="597" srcset="https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-1024x597.png 1024w, https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-300x175.png 300w, https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-768x447.png 768w, https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-1536x895.png 1536w, https://webmago.dev/buvytsan/2020/12/Escritorio-Proyecto-SonarQube-2048x1193.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-710" class="wp-caption-text">Escritorio Proyecto SonarQube</p></div>
<p>Con esto comprobamos la integración del escaneo de código usando SonarQube lanzado desde un pipeline en Codefresh.</p>
<p>Si necesitas ayuda puedes contactarme en este <a title="Formulario de Contacto" href="https://webmago.dev/#contact" target="_blank" rel="noopener noreferrer">enlace</a>.</p>The post <a href="https://webmago.dev/integrando-sonarqube-en-pipelines-ci-cd-de-codefresh/">Integrando SonarQube en pipelines CI/CD de Codefresh</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kubernetes 1.20, no tengas pánico Docker seguirá disponible</title>
		<link>https://webmago.dev/kubernetes-1-20-no-tengas-panico-docker-seguira-disponible/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Fri, 04 Dec 2020 17:25:21 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[dockershim]]></category>
		<category><![CDATA[upgrades]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=655</guid>
					<description><![CDATA[<p>Hace unos días leí en Twitter un hilo sobre los cambios que se vienen en Kubernetes 1.20 y la depreciación de Docker como runtime de los contenedores entrando en su lugar Containerd, varios colegas mostraron su preocupación al respecto. So, Kubernetes is deprecating Docker support and you&#8217;re either nervous or confused. That&#8217;s okay! I would [&#8230;]</p>
The post <a href="https://webmago.dev/kubernetes-1-20-no-tengas-panico-docker-seguira-disponible/">Kubernetes 1.20, no tengas pánico Docker seguirá disponible</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Hace unos días leí en Twitter un hilo sobre los cambios que se vienen en Kubernetes 1.20 y la depreciación de Docker como runtime de los contenedores entrando en su lugar <a href="https://containerd.io/" target="_blank" rel="noopener noreferrer">Containerd,</a> varios colegas mostraron su preocupación al respecto.</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="en">So, Kubernetes is deprecating Docker support and you&#8217;re either nervous or confused. That&#8217;s okay! I would like to help you understand what&#8217;s happening. A thread! 1/10</p>
<p>— Kat Cosgrove, but ✨festive✨ (@Dixie3Flatline) <a href="https://twitter.com/Dixie3Flatline/status/1334188913724850177?ref_src=twsrc%5Etfw">December 2, 2020</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Quienes trabajamos con Kubernetes o en Desarrollo de Software hemos usado Docker para desarrollar y generar las imágenes que finalmente usaremos en nuestro clúster, por supuesto que existen mas proveedores compatibles con <a href="https://opencontainers.org/" target="_blank" rel="noopener noreferrer">OCI</a> (Open Container Initiative) y esto quiere decir que las imágenes que generamos en Docker cumplen con esta normativa.</p>
<p>Ayer 3 de Noviembre 2020, Docker publico un articulo (en inglés) detallando quá sucederá con este cambio dándonos una tranquilidad a toda la comunidad que usa la tecnología de contenedores.</p>
<blockquote><p><strong><a href="https://www.docker.com/blog/what-developers-need-to-know-about-docker-docker-engine-and-kubernetes-v1-20/" target="_blank" rel="noopener noreferrer">What developers need to know about Docker, Docker Engine, and Kubernetes v1.20</a></strong></p></blockquote>
<p>En si, lo que se eliminará probablemente en un año será <a href="https://kubernetes.io/blog/2020/12/02/dockershim-faq/" target="_blank" rel="noopener noreferrer">dockershim</a>, por lo tanto, las imágenes que generes con Docker seguirán funcionando en tu clúster Kubernetes, el cambio es mas para los operadores y administradores de Kubernetes donde el acceso a la inspección de los contenedores usando comandos de Docker no podrán ser usados.</p>
<p>Así que mantén la calma y sigue usando Docker.</p>The post <a href="https://webmago.dev/kubernetes-1-20-no-tengas-panico-docker-seguira-disponible/">Kubernetes 1.20, no tengas pánico Docker seguirá disponible</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
