// Engineering Log
Desarrollo seguro: Parte 1 — CI/CD: de despliegue manual a despliegue automático
Publicado el 22.09.2026
// Ruta rapida
Este articulo pertenece al tema Despliegue y estabilidad.
CI/CD — es una práctica en la que cada cambio de código se compila, verifica y entrega al servidor de forma automática. En lugar de la secuencia manual «copiar archivos, reiniciar el servicio y comprobar que no se rompió nada», este trabajo lo hace un programa según una descripción que se guarda en el repositorio junto al código.
Con esto se abre el ciclo de desarrollo seguro. Todas las comprobaciones siguientes — búsqueda de secretos, análisis estático de código, verificación de dependencias y de imágenes de contenedores — se integran en el pipeline, por eso hay que empezar por él.
CI, CD y otra vez CD
- Integración continua (Continuous Integration). Tras cada
git pushel código se construye y pasa tests. Un error se detecta en minutos tras el commit, no el día del despliegue. - Entrega continua (Continuous Delivery). Cada build exitosa está lista para desplegarse, pero la orden de despliegue la da una persona.
- Despliegue continuo (Continuous Deployment). El build exitoso se envía al servidor automáticamente, sin intervención humana.
A los equipos pequeños suele convenir el segundo modelo: todo se comprueba automáticamente y el despliegue se lanza con un botón.
De qué consta el pipeline
- Archivo de descripción en el repositorio:
.gitlab-ci.yml,.github/workflows/*.yml,.gitea/workflows/*.yamloJenkinsfile. - Etapas y tareas. Las etapas se ejecutan en orden; las tareas de una etapa, en paralelo si hay suficientes ejecutores.
- Runner — programa que ejecuta las tareas. En GitLab.com y GitHub.com hay runners en la nube; en un servidor propio de GitLab o Gitea hay que instalar y registrar el runner manualmente.
- Variables y secretos se definen en la configuración del proyecto, no en el archivo del pipeline.
Herramientas
GitLab CI está integrado en GitLab — tanto en el GitLab.com en la nube como en la instalación en servidor propio. El pipeline se describe en el archivo .gitlab-ci.yml en la raíz del repositorio. En tu servidor GitLab las tareas empezarán a ejecutarse solo tras instalar y registrar GitLab Runner.
GitHub Actions está integrado en GitHub. Los archivos de pipeline se colocan en el directorio .github/workflows; para pasos típicos hay una gran librería de acciones listas para usar.
Gitea Actions aparecieron en Gitea 1.19 y desde la versión 1.21 están habilitadas por defecto. La sintaxis es en gran medida compatible con GitHub Actions, los archivos se colocan en .gitea/workflows/ y las tareas las ejecuta un programa separado, Gitea Runner. Es una opción ligera para una empresa que necesita un servidor Git propio con automatización integrada.
Jenkins es un servidor de automatización independiente: los pipelines se describen en Jenkinsfile y sus capacidades se amplían con plugins. Es muy flexible, pero el mantenimiento, las actualizaciones y la compatibilidad de plugins corren por tu cuenta. Normalmente se elige donde ya lleva tiempo funcionando.
Pipeline mínimo funcional
Ejemplo para GitLab CI: tests en cada cambio y despliegue solo desde la rama principal.
stages:
- test
- deploy
test:
stage: test
image: python:3.13-slim
script:
- pip install -r requirements.txt
- pytest
deploy:
stage: deploy
script:
- ./deploy.sh
environment: production
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manualLa tarea deploy aparece solo en la rama principal y espera lanzamiento manual — esto es entrega continua. Si se quita when: manual, se obtiene despliegue continuo.
Lo mismo para GitHub Actions — archivo .github/workflows/ci.yml:
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
container: python:3.13-slim
steps:
- uses: actions/checkout@v6
- run: pip install -r requirements.txt
- run: pytestPara Gitea Actions vale un archivo casi igual, solo que en el directorio .gitea/workflows/.
Dónde en el pipeline van las comprobaciones de seguridad
| Dónde | Qué se comprueba | Parte del ciclo |
|---|---|---|
| En el desarrollador, antes del commit y de la primera tarea del pipeline | Contraseñas y claves en el código | Parte 2 — secretos |
| Junto con los tests | Construcciones vulnerables en el propio código | Parte 3 — SAST |
| Junto con los tests | Vulnerabilidades conocidas y licencias de dependencias | Parte 4 — SCA |
| Construcción de la imagen | Reproducibilidad, caché, secretos en la construcción | Parte 5 — Dockerfile |
| Tras la construcción y al ejecutar | Vulnerabilidades de la imagen, privilegios del contenedor | Parte 6 — contenedores |
La comprobación aporta valor solo si puede detener el pipeline: las advertencias que no afectan a nada dejan de leerse. Un orden razonable es activar la comprobación en modo informe, analizar lo encontrado y luego hacerla obligatoria.
Secretos y accesos del pipeline
- Contraseñas y claves se almacenan en variables protegidas del proyecto (en GitLab — masked y protected, en GitHub — secrets), no en el archivo YAML.
- Para el despliegue se crea un usuario y una clave separados con permisos mínimos — solo lo necesario para el despliegue.
- El despliegue solo se permite desde la rama principal.
- Un runner en un servidor propio no debe ejecutar tareas de proyectos ajenos: la documentación de Gitea advierte directamente que no se deben usar runners no confiables ni proporcionar tus runners a instancias no confiables.
Para más detalles sobre la protección de secretos en GitLab CI, GitHub Actions y Gitea Actions, consulta Secretos y zero trust: Parte 7 — Secretos en CI/CD: GitLab, GitHub Actions y Gitea Actions.
GitOps
Para Kubernetes es común el enfoque GitOps: el estado deseado del clúster está descrito en Git y un agente especial en el clúster (Argo CD o Flux) hace que el clúster se ajuste a esa descripción. En ese caso el pipeline no despliega la aplicación directamente, solo actualiza los manifiestos en el repositorio. Para uno o dos servidores sin Kubernetes es una complejidad excesiva — basta un paso de despliegue normal.
Qué tener en cuenta en Rusia
- No se puede pagar las tarifas internacionales de GitHub y GitLab.com con tarjeta de un banco ruso: Visa y Mastercard, desde marzo de 2022, no funcionan fuera de Rusia.
- Independizarse de servicios externos se logra con un servidor Git propio — GitLab en tu servidor o Gitea con Gitea Actions — y runners en tus máquinas. Esa opción requiere administración, pero el código, las compilaciones y los secretos quedan bajo tu control.
Errores típicos
- Contraseñas en el archivo del pipeline. Acaban en el historial de Git y son visibles para cualquiera con acceso al repositorio.
- Comprobaciones que no detienen la build. Sus resultados no los mira nadie.
- Pipeline largo. Si la build dura media hora, los desarrolladores dejan de esperar resultados. Ayudan el caché de dependencias y tareas en paralelo.
- Despliegue desde cualquier rama. Código experimental llega al servidor productivo.
- Un solo runner con acceso a producción para todos los proyectos. Un fallo o una intrusión en un proyecto abre acceso al resto.
La configuración del pipeline para un proyecto concreto — desde los primeros tests hasta el despliegue en tus servidores — forma parte del servicio de configuración de CI/CD.
// Tarea parecida
Si estas resolviendo algo parecido
Este articulo pertenece a uno de los temas principales de trabajo. Puedes seguir leyendo sobre el tema, ir a la pagina principal para entender a que me dedico o abrir directamente los servicios.
Tema del articulo
Despliegue y estabilidad
Docker, CI/CD, despliegues, monitoreo, observabilidad y respuesta a incidentes.
Tareas frecuentes de esta tema
- Configurar despliegues sin trabajo manual ni caos
- Añadir monitoreo, alertas y observabilidad base
- Investigar incidentes y estabilizar produccion
// Siguiente paso
Si necesitas ayuda con este tema y no solo otro articulo, es mejor ir directo a la pagina del servicio. La pagina principal y la seleccion de materiales quedan como rutas secundarias.
Abrir servicios// Reviews
Reseñas relacionadas
Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más sencilla y económica. Al final ahorré dinero y tiempo. Mikhail — un verdadero experto que trabaja por el resultado del cliente, no por la factura. ¡Lo recomiendo!
Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más simple y económica. Al final ahorré presupuesto y tiempo. Mikhail es un …
Configuración de VPS, configuración del servidor
12.05.2026 · ★ 5/5
¡Excelente trabajo! Configuró el servidor muy rápido, instaló el panel y configuró la IP. ¡Sin duda lo recomiendo!
¡Excelente trabajo! Muy rápido configuró el servidor, instaló el panel y configuró la IP. ¡Sin duda lo recomiendo!
Configuración de VPS, configuración del servidor
19.04.2026 · ★ 5/5
Todo perfecto, ayudó de forma rápida y profesional, gracias, lo recomiendo a la comunidad
Todo perfecto, ayudó de forma rápida y profesional, gracias, lo recomiendo a la comunidad
Configuración de VPS, configuración del servidor
16.04.2026 · ★ 5/5
Hubo varios problemas, tanto en la parte técnica como en la comprensión general. Mijaíl respondió rápido a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos; por ello, muchas gracias. Estoy satisfecho con el resultado.
Hubo varios problemas relacionados tanto con la parte técnica como con la comprensión en general. Mijaíl respondió rápidamente a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos, por lo que le …
Configuración de VPS, configuración del servidor
18.02.2026 · ★ 5/5
Todo se hizo de manera rápida y precisa. Lo recomiendo.
Todo se hizo rápido y con precisión. Lo recomiendo.
Configuración de VPS, configuración del servidor
17.01.2026 · ★ 5/5
Todo salió bien, el profesional respondió rápidamente a las preguntas y ayudó a resolver el problema. ¡Gracias!
Todo fue bien, el profesional respondió rápidamente a las preguntas y ayudó a resolver el problema. ¡Gracias!
Configuración de VPS, configuración del servidor
16.12.2025 · ★ 5/5
// Contact
¿Necesitas ayuda?
Escríbeme y te ayudaré a resolver el problema
Respondo en un día laborable (03:00-13:00 GMT)
Или оставьте заявку здесь:
// Related