[{"content":"Instrucciones de eliminación Si utilizaste Facebook Login u otro proveedor social para comentar, puedes solicitar la eliminación de todos tus datos personales en cualquier momento.\nDatos obtenidos mediante Facebook Login Dato Origen Finalidad Nombre Perfil de Facebook Mostrarlo en comentarios Correo Perfil de Facebook Identificar la cuenta URL del avatar Perfil de Facebook Mostrarlo en comentarios Comentarios Introducidos por ti Publicación Fecha de registro Generada internamente Auditoría y moderación No almacenamos contraseñas, tokens de acceso, listas de amigos, feed, mensajes, fotos ni otros datos de Facebook distintos del perfil público básico indicado.\nSolicitar la eliminación Escribe a blog@zocate.li con asunto Eliminación de datos - zocate.li. Indica el nombre y/o correo usados para iniciar sesión y el proveedor, por ejemplo Facebook. En 5 días hábiles recibirás un código de confirmación, por ejemplo DEL-2026-0001, y una URL para seguir el estado. Los datos se eliminarán permanentemente en 15 días hábiles desde la solicitud. Recibirás una confirmación final por correo. Se eliminarán tu cuenta de comentarios, todos tus comentarios y los datos del perfil almacenados localmente. La eliminación es irreversible. Si prefieres desactivar la cuenta sin borrar comentarios, indícalo.\nConsultar el estado Responde al correo de confirmación con el código o escribe a blog@zocate.li con asunto Estado de eliminación - [código]. Responderemos en 3 días hábiles.\nRevocar permisos de Facebook Accede a Configuración de Facebook: Apps y sitios web, busca blog-prd-comentario, elige Eliminar y selecciona la opción de borrar todos los datos de la aplicación.\nRevocar los permisos impide futuros inicios de sesión, pero no elimina automáticamente lo que ya está almacenado en este blog. Envía también la solicitud descrita.\nOtros proveedores Google. GitHub. GitLab. Twitter/X. Newsletter Utiliza el enlace de baja de cualquier correo o escribe a blog@zocate.li. La cancelación se procesa inmediatamente.\nContacto Correo: blog@zocate.li. Política de Privacidad. Términos de Uso. ","permalink":"https://zocate.li/es/data-deletion/","summary":"Instrucciones y plazos para eliminar tus datos.","title":"Eliminación de Datos del Usuario"},{"content":"Última actualización: 2 de noviembre de 2026. Traducción de la política en portugués.\n1. Visión general zocate.li es un blog personal sobre tecnología de la información mantenido por Lincoln Zocateli. Esta política describe los datos recopilados, su uso y tus derechos sobre esa información.\nAl usar el sitio, ya sea leyendo artículos, comentando, suscribiéndote a la newsletter o utilizando login social, aceptas las prácticas descritas en esta política.\n2. Datos recopilados 2.1. Comentarios (Comentario) Los comentarios utilizan Comentario, software open-source autoalojado. Al comentar se recopilan:\nNombre y correo electrónico, introducidos manualmente u obtenidos mediante login social. Texto del comentario. Dirección IP, para moderación y prevención de spam. Fecha y hora de publicación. Los datos se almacenan en PostgreSQL en la infraestructura propia de la VPS del blog. No se comparten datos con terceros para fines de comentarios.\n2.2. Login social (OAuth) El blog ofrece proveedores externos de autenticación para comentar:\nProveedor Datos obtenidos GitHub Nombre, correo, avatar GitLab Nombre, correo, avatar Google Nombre, correo, avatar Facebook Nombre, correo, avatar Twitter / X Nombre, identificador, avatar El login social verifica tu identidad, pero no da acceso al feed, mensajes, contactos ni a información distinta del perfil público básico. Cada plataforma administra sus credenciales; el blog nunca almacena tu contraseña.\n2.3. Newsletter (Listmonk) La newsletter utiliza Listmonk, software open-source autoalojado. Tu correo y nombre opcional se almacenan en la base de datos del blog. Recibirás novedades y nuevos artículos. No se comparten direcciones con servicios de marketing de terceros. Puedes darte de baja mediante el enlace de cualquier correo recibido.\n2.4. Cookies y almacenamiento local El blog utiliza cookies y localStorage de forma mínima:\nFinalidad Tipo Descripción Sesión de comentarios Cookie Mantiene la sesión autenticada de Comentario Preferencia de tema localStorage Recuerda Claro, Oscuro o Sistema (zocateli.theme); importa la elección anterior pref-theme Preferencia de idioma localStorage Recuerda una elección explícita (zocateli.language); la detección automática no se guarda como elección manual Preferencia de consentimiento localStorage Recuerda por separado tu decisión sobre Analytics Google Analytics 4 Cookie Mide sesiones y páginas visitadas Google AdSense Cookie Muestra anuncios contextuales cuando está habilitado Las preferencias de tema e idioma permanecen en tu navegador y no se envían como consentimiento de Analytics. Puedes borrarlas en la configuración del navegador o volver a la selección automática desde el menú de idioma.\n2.5. Google Analytics 4 y Google AdSense El blog utiliza servicios de Google LLC. Google Analytics 4 recopila estadísticas de páginas visitadas, origen del tráfico, dispositivos y duración de sesión, sin identificación personal directa por defecto. Google AdSense, cuando está habilitado, utiliza cookies de interés para personalizar anuncios.\nGoogle puede utilizar esta información según su Política de Privacidad. Puedes desactivar la personalización de anuncios o utilizar el complemento de exclusión de Google Analytics.\n2.6. Logs del servidor Los logs estándar de Nginx incluyen dirección IP, URL, método HTTP, código de respuesta, fecha y hora. Se utilizan exclusivamente para diagnóstico y seguridad. Los registros de más de 30 días se eliminan automáticamente.\n3. Uso de los datos Los datos se usan exclusivamente para publicar y administrar comentarios, enviar la newsletter a suscriptores, autenticar usuarios, diagnosticar problemas técnicos y prevenir abusos.\nNo vendemos, alquilamos ni compartimos tus datos con anunciantes o empresas de marketing.\n4. Almacenamiento y seguridad Los datos se almacenan en infraestructura propia de VPS en la nube, no en servicios de terceros. La comunicación utiliza HTTPS/TLS mediante Cloudflare. El acceso a la base de datos está restringido y protegido por contraseña. Se realizan copias de seguridad con control estricto de acceso.\n5. Tus derechos Según la Ley General de Protección de Datos de Brasil (LGPD, Ley 13.709/2018) y los Términos de la Plataforma Meta, puedes solicitar acceso, corrección, eliminación y portabilidad de tus datos personales. Puedes cancelar la newsletter en cualquier momento.\nPara eliminar datos, incluidos los obtenidos mediante Facebook, Google, GitHub, GitLab o Twitter/X, consulta Eliminación de Datos. Allí se describen plazos y revocación de permisos. Para otros derechos, utiliza los contactos siguientes.\n6. Enlaces externos El blog puede enlazar a sitios externos y no se responsabiliza de sus prácticas de privacidad. Lee la política de cada sitio que visites.\n7. Contacto Sitio: zocate.li GitHub: lzocateli 8. Cambios en esta política La política puede actualizarse periódicamente. Los cambios importantes se comunicarán mediante la newsletter a los suscriptores. La fecha superior identifica la versión vigente.\n","permalink":"https://zocate.li/es/privacy/","summary":"Cómo zocate.li trata tus datos personales.","title":"Política de Privacidad"},{"content":"Traducción de los términos en portugués, actualizados el 18 de febrero de 2026.\n1. Aceptación Al acceder a zocate.li, leer artículos, comentar o suscribirte a la newsletter, aceptas estos términos. Si no estás de acuerdo, no utilices el sitio.\n2. Sobre el blog Blog técnico personal de Lincoln Zocateli sobre desarrollo de software, DevOps, cloud, contenedores y tecnologías relacionadas. El contenido tiene fines educativos e informativos, sin vínculo con empresas u organizaciones.\n3. Propiedad intelectual Los artículos, textos, imágenes del autor y ejemplos de código originales pertenecen a Lincoln Zocateli. Todos los derechos reservados, salvo indicación explícita.\nPuedes leer, compartir y citar artículos con atribución y enlace al original. Puedes usar fragmentos de código en proyectos personales o profesionales bajo licencia MIT, salvo indicación contraria.\nNo puedes reproducir artículos completos sin autorización previa por escrito, utilizar contenido para entrenamiento de IA sin permiso ni eliminar o alterar la atribución.\n4. Comentarios Mantén un tono respetuoso, constructivo y relacionado con el artículo. No publiques contenido ofensivo, discriminatorio, difamatorio o ilegal, spam, publicidad ni enlaces no solicitados. No suplantes a otras personas.\nEl autor puede editar, ocultar o eliminar comentarios que infrinjan estas reglas sin aviso previo. Las infracciones repetidas pueden provocar el bloqueo del usuario. Las opiniones son responsabilidad exclusiva de sus autores; el blog no las respalda ni responde por comentarios de terceros.\n5. Newsletter La newsletter es un servicio opcional. Facilitas tu correo voluntariamente, puedes cancelar mediante el enlace de cualquier mensaje y no se compartirá tu dirección con terceros.\n6. Enlaces externos Los recursos, herramientas y proyectos externos se enlazan como referencia. El blog no responde por su contenido, disponibilidad o prácticas.\n7. Exención de responsabilidad El contenido se ofrece tal cual, con fines educativos e informativos. El autor realiza esfuerzos razonables para mantenerlo correcto, pero no garantiza ausencia de errores ni actualización y no responde por problemas derivados de instrucciones o código publicados.\nRevisa y prueba configuraciones o código antes de aplicarlos en producción. Utilizas la información bajo tu propia responsabilidad.\n8. Disponibilidad El mantenimiento, las actualizaciones y los problemas técnicos pueden interrumpir temporalmente el sitio. No se garantiza disponibilidad continua.\n9. Legislación aplicable Los términos se rigen por las leyes de la República Federativa de Brasil, especialmente:\nLey General de Protección de Datos (13.709/2018). Marco Civil de Internet (12.965/2014). Código Civil de Brasil (10.406/2002). 10. Contacto Sitio: zocate.li GitHub: lzocateli 11. Cambios Los términos pueden actualizarse en cualquier momento. La fecha identifica la versión vigente. El uso continuado tras los cambios implica aceptación de los nuevos términos.\n","permalink":"https://zocate.li/es/terms/","summary":"Condiciones para leer e interactuar con zocate.li.","title":"Términos de Uso"},{"content":"Quién soy Me llamo Lincoln Zocateli y soy Arquitecto de Soluciones con más de 25 años de experiencia en tecnología de la información. A lo largo de esta trayectoria he diseñado, construido y evolucionado sistemas de distintas escalas, desde aplicaciones empresariales hasta plataformas distribuidas en la nube.\nA qué me dedico Mi trabajo se centra en diseñar soluciones robustas, seguras y escalables, combinando arquitectura de software con prácticas modernas de infraestructura y entrega continua. En mi día a día utilizo:\nPlataforma .NET: .NET Core / .NET 8+, C#, APIs RESTful y microservicios. Contenedores y orquestación: Docker, Podman rootless, Kubernetes (AKS), imágenes optimizadas y cargas de trabajo en contenedores. Linux: administración, shell scripting y entornos de producción. DevOps y CI/CD: pipelines automatizados con GitHub Actions y Azure DevOps, despliegue continuo y entrega fiable. Infraestructura como Código: Terraform, Ansible, aprovisionamiento y configuración automatizados. Azure Cloud: PaaS/IaaS, App Services, AKS, Azure Functions, Storage y Service Bus. Seguridad e identidad: JWT, OAuth 2.0, OpenID Connect, autenticación y autorización en APIs y aplicaciones distribuidas. Sobre el blog Este blog es mi espacio para compartir conocimientos, experiencias prácticas y opiniones sobre desarrollo de software, DevOps, cloud y arquitectura de soluciones. Documento lo que aprendo en mi trabajo diario y espero ayudar a otros profesionales en el camino.\nFuera del teclado Soy padre orgulloso de Thaís y me apasionan los pastores alemanes, compañeros leales que me recuerdan que la vida va mucho más allá del código y los despliegues.\nContacto GitHub: lzocateli LinkedIn: lzocateli Correo electrónico: blog [at] zocate.li ","permalink":"https://zocate.li/es/about/","summary":"\u003ch2 id=\"quién-soy\"\u003eQuién soy\u003c/h2\u003e\n\u003cimg src=\"/images/lincoln.jpg\" alt=\"Lincoln Zocateli\" class=\"author-photo\" /\u003e\n\u003cp\u003eMe llamo \u003cstrong\u003eLincoln Zocateli\u003c/strong\u003e y soy \u003cstrong\u003eArquitecto de Soluciones\u003c/strong\u003e con más de \u003cstrong\u003e25 años de experiencia\u003c/strong\u003e en tecnología de la información. A lo largo de esta trayectoria he diseñado, construido y evolucionado sistemas de distintas escalas, desde aplicaciones empresariales hasta plataformas distribuidas en la nube.\u003c/p\u003e\n\u003ch2 id=\"a-qué-me-dedico\"\u003eA qué me dedico\u003c/h2\u003e\n\u003cp\u003eMi trabajo se centra en diseñar soluciones robustas, seguras y escalables, combinando arquitectura de software con prácticas modernas de infraestructura y entrega continua. En mi día a día utilizo:\u003c/p\u003e","title":"Sobre Lincoln Zocateli, Arquitecto de Soluciones"},{"content":"Introducción Un script que funciona en el terminal de un servidor puede fallar en un pipeline CI/CD porque el entorno de ejecución es distinto. El agente puede utilizar otra cuenta, un shell diferente, un PATH restringido, otro directorio de trabajo o credenciales distintas. Una ejecución interactiva correcta no demuestra que el script funcione sin intervención humana.\nCuando investigo este problema, comparo ambos contextos antes de cambiar la lógica del script. Un binario ausente, un directorio inesperado o una solicitud de autenticación pueden explicar un fallo aparentemente misterioso. El objetivo es declarar el entorno necesario en lugar de depender de la configuración personal de quien realizó la prueba.\nEste artículo explica qué cambia entre un terminal Linux y un pipeline de Azure DevOps: usuario, variables, permisos, red y estado efímero. Incluyo ejemplos, una lista de diagnóstico y un punto de partida en Bash. Los principios también se aplican a otros sistemas CI/CD.\nEstá dirigido a desarrolladores, ingenieros DevOps y administradores que necesitan automatizaciones repetibles. El artículo sobre automatización con Makefile ofrece contexto relacionado en portugués. La meta práctica es reducir las suposiciones para ejecutar scripts tanto localmente como en jobs sin una persona disponible para responder preguntas.\nNo supongo que todos los pipelines dispongan de los mismos permisos o herramientas. Los agentes hosted y self-hosted tienen contratos distintos. Un diagnóstico útil identifica la cuenta real, la imagen y la configuración de la tarea, y después verifica las dependencias que el script utiliza.\nQué cambia entre terminal y pipeline Aspecto Terminal del servidor Pipeline Usuario/sesión Tu cuenta interactiva Cuenta del agente o servicio, normalmente no interactiva Shell Shell y perfil del usuario Shell de la tarea; carga de perfiles distinta Entorno Variables locales y PATH personalizado Variables controladas y otro PATH Directorio Directorio abierto en el terminal Workspace del agente o directorio configurado Permisos Permisos personales y posiblemente TTY Permisos del agente, normalmente sin TTY interactivo Dependencias Herramientas y versiones del servidor Herramientas de la imagen o agente seleccionados Interacción Puedes responder preguntas Los prompts pueden bloquear o fallar Red Rutas, proxy y certificados del servidor Red y restricciones de salida del agente Archivos Rutas persistentes del servidor Repositorio y artefactos del pipeline Recursos Límites del host Timeouts, cuotas y concurrencia del job Logs Historial y archivos locales Logs centralizados, enmascaramiento y retención Estado Máquina persistente Agentes hosted normalmente efímeros Información: Utiliza la tabla para encontrar diferencias concretas. El pipeline no es simplemente tu terminal abierto a distancia: necesita su propia cuenta, directorio y contrato de dependencias.\nPor qué importa el contexto de ejecución Usuario y TTY En el terminal, los comandos utilizan tu usuario y un dispositivo de terminal. Las herramientas pueden detectar el TTY y activar preguntas, colores o autenticación interactiva. El agente normalmente funciona sin una persona presente. Una instrucción read, una contraseña de sudo o un asistente de login pueden bloquear el job.\nLa documentación de agentes describe su función. Comprueba la identidad del servicio y cómo se inicia, en lugar de suponer que hereda la identidad de quien lanzó el pipeline.\nEntorno y PATH Tu perfil puede añadir /usr/local/bin, versiones específicas de Node/.NET/Java, alias y funciones de shell. Estas comodidades no deben darse por supuestas en el agente. Una herramienta puede faltar, estar en otra ruta o tener otra versión. Cambiar la versión de Node, por ejemplo, puede modificar el comportamiento de dependencias aunque el script sea idéntico.\nLos perfiles se cargan de manera diferente en shells interactivos, de login y no interactivos. No trates .bashrc y .profile como equivalentes ni asumas que una tarea carga ambos. Inicializa explícitamente el entorno que necesita la automatización.\nDirectorios y rutas relativas Los scripts que interpretan . como un directorio fijo o dependen de un cd anterior son frágiles. En Azure Pipelines, el código suele estar bajo $(Build.SourcesDirectory) y los artefactos pueden escribirse en $(Build.ArtifactStagingDirectory). Una tarea también puede configurar su directorio.\nAtención: No supongas que el directorio actual coincide con el terminal. Configura el directorio de la tarea y usa rutas explícitas para los archivos necesarios.\nPermisos y políticas de seguridad Tu usuario puede tener acceso sudo que la cuenta del agente no posee. ACLs, SELinux y AppArmor también afectan al acceso. Una cuenta de servicio sin permiso para leer una configuración o reiniciar un servicio no queda autorizada porque la operación funcionó en tu sesión.\nVerifica los permisos de la identidad real del agente. No desactives controles de seguridad para ocultar diferencias. Un agente hosted de compilación y un servidor de producción son máquinas con responsabilidades distintas.\nDependencias y versiones El éxito local puede depender de paquetes instalados meses antes. Los agentes hosted utilizan imágenes predefinidas; los self-hosted dependen de tu mantenimiento. Si los entornos no están alineados deliberadamente, espera diferencias. Fija versiones críticas y declara dependencias para que una ausencia produzca un error útil.\nRed, credenciales y estado Los registries y APIs pueden necesitar proxy, certificados corporativos o rutas permitidas. Archivos bajo el home personal, como ~/.aws/credentials o ~/.npmrc, pueden no existir para el agente. Utiliza los mecanismos de secretos del pipeline, no copias de credenciales personales.\nLos agentes efímeros invalidan suposiciones sobre archivos de ejecuciones anteriores. Usa artefactos administrados y caché de pipeline cuando los datos deban sobrevivir al job. Un archivo temporal local no constituye un contrato de persistencia.\nEjemplos prácticos Sudo sin terminal interactivo Este comando puede solicitar una contraseña y fallar en un job desatendido:\n1 sudo systemctl restart myservice El ejemplo original permite una operación concreta a la cuenta del agente:\n1 vsts ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myservice Requiere revisión administrativa; no justifica conceder sudo sin restricciones. Las operaciones sobre servicios del host corresponden a un entorno self-hosted adecuado de despliegue, no a una máquina hosted ajena de compilación.\nHerramienta disponible solo en tu PATH 1 jq \u0026#39;.version\u0026#39; package.json Si jq solo está en tu servidor, el agente necesita una instalación declarada o un contenedor de job que lo incluya. El ejemplo original instala el paquete en Ubuntu antes de ejecutar:\n1 2 3 4 5 6 7 steps: - script: | sudo apt-get update \u0026amp;\u0026amp; sudo apt-get install -y jq displayName: \u0026#39;Instalar jq\u0026#39; - script: | jq \u0026#39;.version\u0026#39; package.json displayName: \u0026#39;Ejecutar script con jq\u0026#39; No apliques este paso a cualquier agente indiscriminadamente: requiere un gestor de paquetes compatible y los privilegios correspondientes. Una imagen fijada es otra forma de declarar esa dependencia de manera reproducible.\nPregunta invisible 1 read -p \u0026#34;¿Continuar? (y/n) \u0026#34; ans Un job desatendido no puede contestar. Usa un modo no interactivo explícito y parámetros del pipeline. El ejemplo original conserva una pregunta opcional para el terminal:\n1 2 3 4 5 SKIP_CONFIRM=\u0026#34;${SKIP_CONFIRM:-1}\u0026#34; if [[ \u0026#34;$SKIP_CONFIRM\u0026#34; != \u0026#34;1\u0026#34; ]]; then read -p \u0026#34;¿Continuar? (y/n) \u0026#34; ans [[ \u0026#34;$ans\u0026#34; != \u0026#34;y\u0026#34; ]] \u0026amp;\u0026amp; exit 0 fi Consejo: Separa la comodidad interactiva de la ejecución automática. Un modo explícito hace visible el contrato, pero las operaciones destructivas siguen necesitando autorización adecuada fuera del prompt.\nConsideraciones de Azure DevOps Los agentes hosted ofrecen un entorno efímero administrado por Microsoft con herramientas predefinidas. Los self-hosted permiten controlar sistema operativo, versiones y dependencias. Elegir la máquina puede mejorar la paridad, pero también implica mantenimiento y aislamiento.\nPara Bash, utiliza Bash@3 y configura workingDirectory cuando corresponda. Evita depender de .bashrc: inicializa el entorno en la tarea o el script.\nEntrega credenciales mediante variables secretas o service connections compatibles. La autenticación debe ser no interactiva y limitada a la operación. El artículo de autenticación y autorización ofrece contexto en portugués.\nConfigura timeoutInMinutes para evitar jobs bloqueados indefinidamente. Utiliza reintentos acotados con backoff para fallos externos realmente transitorios. Aumentar el timeout no corrige permisos insuficientes ni dependencias ausentes.\nLista de diagnóstico Identidad: revisa id -u -n, whoami, shell y presencia de TTY. Entorno: compara PATH y locale; inspecciona solo variables no sensibles. No vuelques secretos en los logs. Directorio: revisa pwd, rutas de archivos y directorio de la tarea. Herramientas: usa command -v y comprueba versiones críticas. Permisos: verifica el acceso de la cuenta de servicio. No ejecutes acciones destructivas solo para probar permisos. Red: comprueba endpoint, proxy y certificados sin imprimir credenciales. Logs: compara errores de aplicación y job, no únicamente el código final. Estado: identifica archivos que necesitan persistencia, caché o artefactos. Un diagnóstico breve puede detectar versiones incompatibles antes del trabajo principal. Limita la salida: el logging detallado y el tracing del shell pueden exponer credenciales aunque el pipeline enmascare algunos secretos registrados.\nConsejos y buenas prácticas Estandariza el entorno. Usa una imagen fijada o un agente mantenido deliberadamente. El código idéntico no basta si cambia el runtime. Declara dependencias. Comprueba binarios y versiones antes de actuar. La ausencia debe provocar un fallo comprensible, no un error secundario después. Evita interacción. Utiliza flags compatibles y parámetros explícitos. No dejes read, menús ni asistentes de autenticación en jobs desatendidos. Gestiona credenciales con seguridad. Prefiere variables secretas y service connections. Evita depender del home personal. Usa rutas explícitas. Configura el directorio y resuelve entradas desde una ubicación conocida. Así eliminas una causa habitual de éxito solo local. Busca idempotencia. Repetir el script debe converger, no romper un estado ya correcto. Comprueba antes de modificar. Haz visibles los errores. set -euo pipefail ayuda, pero no reemplaza el manejo deliberado. Usa tracing solo cuando no exponga datos sensibles. Plantilla Bash La plantilla original ilustra normalización del entorno, comprobación de dependencias y reintentos acotados. Es un punto de partida, no una política de despliegue lista para producción. Revisa permisos, logs y endpoint antes de utilizarla.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/env bash set -euo pipefail [[ \u0026#34;${DEBUG:-0}\u0026#34; == \u0026#34;1\u0026#34; ]] \u0026amp;\u0026amp; set -x export PATH=\u0026#34;/usr/local/bin:/usr/bin:/bin:$PATH\u0026#34; WORKDIR=\u0026#34;${WORKDIR:-$(pwd)}\u0026#34; cd \u0026#34;$WORKDIR\u0026#34; need() { command -v \u0026#34;$1\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { echo \u0026#34;ERROR: Falta \u0026#39;$1\u0026#39; en PATH. Instálalo primero.\u0026#34; exit 127 } } need jq need awk NON_INTERACTIVE=\u0026#34;${NON_INTERACTIVE:-1}\u0026#34; retry() { local n=0 until \u0026#34;$@\u0026#34;; do n=$((n + 1)) [[ $n -ge 3 ]] \u0026amp;\u0026amp; { echo \u0026#34;ERROR: Fallo tras 3 intentos: $*\u0026#34;; exit 1; } echo \u0026#34;Intento $n falló. Esperando $((n * 2))s...\u0026#34; sleep $((n * 2)) done } El original continúa pasando un token a curl. No actives tracing alrededor de llamadas con secretos ni incluyas argumentos que contienen tokens en los mensajes de error. Estas partes necesitan hardening antes de usar credenciales reales.\nResumen Objetivo Contexto de ejecución incluye cuenta, shell, directorio, dependencias y red, y puede explicar diferencias sin un error de lógica. Jobs no interactivos necesitan un contrato desatendido explícito y no pueden depender de preguntas. PATH y versiones deben declararse o verificarse, no heredarse de perfiles personales. Agentes efímeros requieren artefactos o cachés administradas para el estado persistente. Seguridad exige credenciales acotadas, permisos revisados y logs sin secretos. Lee También Automatización de tareas con Makefile (portugués). Autenticación y autorización: JWT, OAuth2 y OpenID Connect (portugués). Seguridad BFF para SPAs (portugués). Referencias Qué es Azure Pipelines: servicio CI/CD. Agentes de Azure Pipelines: ejecución hosted y self-hosted. Variables secretas: gestión de secretos. Caché de pipeline: comportamiento de cachés administradas. Bash Reference Manual: comportamiento del shell y errores. SELinux: control de acceso obligatorio en Linux. ","permalink":"https://zocate.li/es/posts/2025/diferenca-executar-script-terminal-pipeline/","summary":"El contexto explica las diferencias entre terminal y pipeline: usuario, permisos, PATH, credenciales y agentes efímeros.","title":"Terminal vs Pipeline: diferencias al ejecutar scripts"},{"content":"Proyectos Nuuvify.CommonPack Colección de bibliotecas .NET open-source para aplicaciones robustas, escalables y de alto rendimiento. El proyecto incluye más de 20 paquetes NuGet que cubren:\nPersistencia de datos: Unit of Work, Repository Pattern, AutoHistory y filtros dinámicos avanzados con tipos complejos y navegación anidada (Customer.Address.City). Seguridad: autenticación JWT con refresh tokens, autenticación Azure AD y cifrado de datos sensibles. Infraestructura cloud: integración con Azure Service Bus, Azure Storage y Background Services con diagnóstico avanzado. Comunicación: cliente HTTP con reintentos y resiliencia (Polly), y envío SMTP con MailKit. Middleware y APIs: middleware personalizado para ASP.NET Core, OpenAPI/Swagger y Health Checks. Observabilidad: logging estructurado, health checks personalizados y tracing distribuido. Stack: C#, .NET 8+, Entity Framework Core, SQL Server, PostgreSQL, Oracle, Azure Service Bus y Docker.\nLicencia: MIT.\nag-server-grid Grid de datos Angular open-source con paginación server-side, su principal diferencia frente a los grids convencionales. Está pensado para aplicaciones empresariales con grandes volúmenes de datos sin cargar todo en el cliente.\nPaginación server-side: consume una API paginada y controla página actual, total de registros y registros por página. CRUD integrado: botones Editar y Eliminar con selección de una o varias filas (Ctrl+Click y Ctrl+Shift+Click). Exportación CSV: exporta los datos visibles a un archivo CSV. Internacionalización: traducción dinámica de encabezados mediante ngx-translate. Ordenación y redimensionamiento: ordenación por columna y control de ancho (minWidth/maxWidth). Formato automático de fechas: detección de campos de fecha. Botones personalizables: botones en celdas con iconos, clases CSS y eventos personalizados. Paginación local: alternativa para conjuntos de datos pequeños. Comprobable: ejemplos de pruebas unitarias para encabezados y cuerpo de la tabla. Stack: Angular, TypeScript y npm.\nLicencia: Apache-2.0.\n","permalink":"https://zocate.li/es/projects/","summary":"\u003ch2 id=\"proyectos\"\u003eProyectos\u003c/h2\u003e\n\u003ch3 id=\"nuuvifycommonpack\"\u003e\u003ca href=\"https://github.com/nuuvify/Nuuvify.CommonPack\"\u003eNuuvify.CommonPack\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eColección de bibliotecas .NET open-source para aplicaciones robustas, escalables y de alto rendimiento. El proyecto incluye más de 20 paquetes NuGet que cubren:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePersistencia de datos\u003c/strong\u003e: Unit of Work, Repository Pattern, AutoHistory y filtros dinámicos avanzados con tipos complejos y navegación anidada (\u003ccode\u003eCustomer.Address.City\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSeguridad\u003c/strong\u003e: autenticación JWT con refresh tokens, autenticación Azure AD y cifrado de datos sensibles.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInfraestructura cloud\u003c/strong\u003e: integración con Azure Service Bus, Azure Storage y Background Services con diagnóstico avanzado.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eComunicación\u003c/strong\u003e: cliente HTTP con reintentos y resiliencia (Polly), y envío SMTP con MailKit.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMiddleware y APIs\u003c/strong\u003e: middleware personalizado para ASP.NET Core, OpenAPI/Swagger y Health Checks.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eObservabilidad\u003c/strong\u003e: logging estructurado, health checks personalizados y tracing distribuido.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eStack:\u003c/strong\u003e C#, .NET 8+, Entity Framework Core, SQL Server, PostgreSQL, Oracle, Azure Service Bus y Docker.\u003c/p\u003e","title":"Proyectos y Contribuciones Open-Source"}]