Commit Graph
325 Commits
Author SHA1 Message Date
devops be3e5c2a4c docs(devsecops): documentar 4+1 hallazgos de infraestructura y TODOs de Cosign
5 playbooks nuevos en docs/playbooks/ del portal:
- SQLite en modo DELETE causando SQLITE_BUSY, por que WAL lo resuelve.
- Anchors YAML no soportados por el parser de Gitea Actions, incluido
  el diagnostico equivocado inicial (indentacion) que se corrigio
  despues -- documentado con honestidad como leccion de proceso.
- Docker-in-Docker vs sibling containers, y por que Semgrep corre
  nativo en un venv en vez de como container aparte.
- El SNI/realm HTTP del tunel rompiendo especificamente a Cosign
  (docker push funcionaba, cosign sign no), conectado con el
  incidente ya documentado del 504 -- misma capa de ingress, dos
  fallas distintas.
- Contencion de recursos entre Gitea y su runner: causa raiz real
  confirmada en vivo durante esta misma sesion (ambos contenedores
  reiniciados a mitad de un build, sin limites de CPU/memoria reales),
  con fix propuesto (ver rama fix/gitea-runner-resource-limits en
  scripts/) pendiente de aplicacion manual.

Se actualiza el playbook del 504 para linkear hacia el nuevo hallazgo
de contencion, cerrando el loop que habia quedado abierto ahi.

cosign.md: nueva seccion "Limitaciones conocidas y mejoras futuras"
con los dos TODO reales -- firma por tag en vez de digest (con el
warning real de Cosign visto en los logs) y transparency log de Rekor
deshabilitado, explicado en simple.

index.md: tabla resumen de los 3 pipelines (imagen + adaptacion de
Semgrep por stack), diagrama generalizado para reflejar que es el
mismo patron en los 3 workflows, y "que falta" actualizado.

Validado con mkdocs build --strict (0 errores, 0 warnings) antes de
commitear.
2026-08-15 15:17:43 -05:00
gitea-actions 826f199ebc chore(gitops): deploy Docs Portal v1.0.110 [skip ci] 2026-08-15 19:48:50 +00:00
devops 5c47a39579 fix(docs-portal): remediar CVE CRITICAL en libssl3/libcrypto3 (Alpine)
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 4m25s
Run 144 de deploy-docs.yaml encontro un CVE CRITICAL real
(CVE-2026-31789, heap buffer overflow en OpenSSL) en libssl3/libcrypto3
de la base nginx:1.27-alpine, con fix ya publicado por Alpine
(3.3.3-r0 -> 3.3.7-r0). Se agrega apk upgrade puntual de esos dos
paquetes en el Dockerfile. Verificado localmente: docker build OK +
Trivy real en exit 0 (0 vulnerabilidades).
2026-08-15 14:43:52 -05:00
devops 3ee7171178 Merge: incorporar promocion GitOps automatica de Medusa v1.0.108
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 1m27s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 4m56s
2026-08-15 14:30:52 -05:00
devops 81c0f99e00 Merge fix/devsecops-docs-portal: pipeline de seguridad para docs-portal 2026-08-15 14:30:37 -05:00
gitea-actions 38722b97a8 chore(gitops): deploy Medusa v1.0.108 [skip ci] 2026-08-15 19:28:44 +00:00
devops 5fc86e6ef4 chore: reintentar pipeline de commerce-backend (run 107 murio por reinicio de Gitea, no por el pipeline)
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 20s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 10m59s
2026-08-15 14:17:18 -05:00
devops 93f071c175 Merge fix/devsecops-medusa-cve-remediation: remediacion CVE + excepcion documentada
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 22m14s
2026-08-15 13:50:09 -05:00
devops 0c1076eda0 fix(commerce-backend): remediar 3/5 CVE CRITICAL, documentar excepcion para 2
Run 138 de build-medusa.yaml encontro 5 CVE CRITICAL reales (no falsos
positivos) al escanear la imagen con Trivy:

Remediados en el Dockerfile (verificado localmente con Trivy real,
exit 0):
- CVE-2026-33845 / CVE-2026-42010 (libgnutls30, base Debian): apt
  upgrade puntual del paquete.
- CVE-2026-59873 (tar vendorizado dentro del npm CLI global de la
  imagen base node:*-slim): se elimina /usr/local/lib/node_modules/npm
  completo -- no es una dependencia real del proyecto (el CMD nunca
  invoca npm en runtime), asi que no hay nada que "actualizar".

Documentados como excepcion en workloads/commerce-backend/.trivyignore
(con --ignorefile solo en este workflow, no afecta a build.yaml ni
deploy-docs.yaml):
- CVE-2024-24790 / CVE-2025-68121 (Go stdlib embebido en el binario de
  esbuild que trae [email protected], dependencia interna de
  @medusajs/admin-sdk). Se probo el fix real (override de esbuild a
  una version mas nueva) y rompio el build del admin panel --
  [email protected] fija "esbuild: ^0.21.3" como dependencia directa, y
  esbuild >=0.24 cambio el manejo de targets de transpilacion que vite
  5 espera. No existe un patch dentro de la serie 0.21.x con un Go
  toolchain mas nuevo. Requiere subir @medusajs/admin-sdk/vite en un
  cambio aparte, fuera de alcance de este pipeline de seguridad.
2026-08-15 13:49:51 -05:00
devops 80d99f9f3f Merge fix/devsecops-trivy-timeout: fix real tras primer intento fallido (run 136)
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 20s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 15m1s
2026-08-15 13:10:55 -05:00
devops 81f01c7ade fix(devsecops): timeout de 15m en Trivy imagen para commerce-backend
El run 136 (primer intento de este pipeline, recien mergeado a main)
fallo en el paso "Escanear imagen (Trivy) - CRITICAL bloquea" con
"context deadline exceeded" a los 4m52s -- no una CVE, un timeout de
herramienta. Causa: el default de Trivy (5m) no alcanza para escanear
(vuln + secret scan de la imagen completa) el node_modules de Medusa
v2, mas pesado que el del frontend. Se agrega --timeout 15m0s a ambos
escaneos de imagen (CRITICAL y HIGH).
2026-08-15 13:09:47 -05:00
devops 27a1e75a4c fix(devsecops): timeout de 15m en Trivy imagen para docs-portal
Preventivo: mismo comando que en commerce-backend, donde se vio en
vivo que el timeout default de Trivy (5m) no alcanza en este host bajo
carga ("context deadline exceeded" a los 4m52s, run 136). Ver
fix/devsecops-trivy-timeout para el fix real en commerce-backend.
2026-08-15 13:08:24 -05:00
devops 45312fc189 Merge fix/devsecops-commerce-backend: pipeline de seguridad para commerce-backend
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 42s
Build and Push Medusa / Construir y publicar Medusa (push) Failing after 9m31s
2026-08-15 12:51:41 -05:00
devops 1bcae76102 feat(devsecops): replicar pipeline de seguridad a docs-portal
Agrega a deploy-docs.yaml las mismas 6 etapas ya validadas en
build.yaml (run 134, frontend): Gitleaks, Trivy IaC, Semgrep (SAST),
Trivy imagen, Syft (SBOM) y Cosign (firma + verificación).

Adaptaciones de stack:
- Trivy IaC escanea todo workloads/docs-portal/ (varios manifiestos
  K8s separados: deployment/service/ingress), no un MANIFEST_FILE
  único como el frontend.
- Semgrep usa p/python + p/security-audit (no hay TypeScript/React
  acá) -- docs-portal no tiene código de aplicación propio hoy (solo
  Markdown + config de MkDocs), así que 0 hallazgos es el resultado
  esperado; el stage queda listo para el día que se agregue un
  hook/plugin en Python.

Mismos umbrales que el resto: Trivy bloquea en CRITICAL, Semgrep en
modo auditoría. Reutiliza el mismo par de llaves Cosign (secrets ya
existentes a nivel de repo); se agrega workloads/docs-portal/cosign.pub.
2026-08-15 12:47:43 -05:00
devops 8b49ac2bc5 feat(devsecops): replicar pipeline de seguridad a commerce-backend
Agrega a build-medusa.yaml las mismas 6 etapas ya validadas en
build.yaml (run 134, frontend): Gitleaks, Trivy IaC, Semgrep (SAST),
Trivy imagen, Syft (SBOM) y Cosign (firma + verificación).

Ruleset de Semgrep adaptado: p/typescript + p/security-audit +
p/owasp-top-ten, sin p/react/p/nextjs -- commerce-backend es la API de
Medusa v2 (Node/TypeScript), no una app con SSR. Mismos umbrales que
el frontend: Trivy bloquea en CRITICAL, Semgrep en modo auditoría
(no bloquea todavía).

Reutiliza el mismo par de llaves Cosign del frontend (secrets ya
existentes a nivel de repo); se agrega workloads/commerce-backend/cosign.pub
con la misma llave pública para que la verificación quede local a
este workflow.
2026-08-15 12:46:45 -05:00
devops c25877c700 chore: release v1.0.104 [skip ci] 2026-08-15 06:23:20 +00:00
devops 941c009c9c Merge pull request 'chore: retrigger real del pipeline (take 4)' (#25) from chore/retrigger-pipeline-take4 into main
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 7m26s
2026-08-15 06:15:09 +00:00
devops 5d3d578d36 chore: retrigger real del pipeline (comentario en build.yaml, path filtrado)
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (pull_request) Successful in 29s
Build and Push Frontend / Construir y Subir Imagen (pull_request) Skipped
2026-08-15 01:14:59 -05:00
devops ff1f1358a7 Merge pull request 'chore: reintentar disparo del pipeline (take 3)' (#24) from chore/retrigger-pipeline-take3 into main 2026-08-15 06:10:55 +00:00
devops f9a4b0a4ea chore: reintentar disparo del pipeline (take 3, runner reiniciado) 2026-08-15 01:10:42 -05:00
devops 69db467edd Merge pull request 'chore: reintentar disparo del pipeline (take 2)' (#23) from chore/retrigger-pipeline-take2 into main 2026-08-15 06:09:07 +00:00
devops 63de0b4ed3 chore: reintentar disparo del pipeline (la corrida anterior coincidió con inestabilidad transitoria del túnel) 2026-08-15 01:08:56 -05:00
devops 9418fb4d1a Merge pull request 'chore: re-disparar pipeline tras fix del tunel Cloudflare' (#22) from chore/retrigger-pipeline-cosign-fix into main 2026-08-15 06:03:47 +00:00
devops c492269740 chore: re-disparar pipeline tras arreglar el realm https del túnel Cloudflare→NPM
El fix fue en infraestructura (regla de ingress de cloudflared para
gitea.cruzcloud.net -> HTTPS con Origin Server Name correcto), no en
este repo -- este commit vacío es solo para generar un push nuevo y
validar el pipeline completo (incluida la firma de Cosign) de punta
a punta con las credenciales reales.
2026-08-15 01:03:33 -05:00
devops 1f467f2b8f Merge pull request 'fix(ci): correr Semgrep nativo (venv) en vez de docker run anidado' (#21) from fix/build-yaml-anchor-not-supported into main
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 17s
Build and Push Frontend / Construir y Subir Imagen (push) Failing after 11m59s
2026-08-15 04:50:41 +00:00
devops e3ab3f7fc0 fix(ci): correr Semgrep nativo (venv) en vez de docker run anidado
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (pull_request) Successful in 22s
Build and Push Frontend / Construir y Subir Imagen (pull_request) Skipped
El runner de Gitea ejecuta cada job dentro de un contenedor propio que
habla con el daemon Docker del host (sibling containers) -- un
`docker run -v "\${{ github.workspace }}:/src"` desde ahí intenta
montar una ruta que solo existe DENTRO del contenedor del job, no en
el host real: "mkdir /workspace: read-only file system". Confirmado en
el run real (job 128, task_id 128) tras el fix del anchor.

Se valida localmente contra docker.gitea.com/runner-images:ubuntu-latest
(la misma imagen del runner real) que python3/pip3 están disponibles.
pip3 install directo falla por paquetes de apt sin metadata compatible
(PyJWT, "RECORD file not found") -- se usa un venv aislado en su lugar,
validado end-to-end con los dos steps extraídos del YAML real.
2026-08-14 23:50:23 -05:00
devops 1df1c3a3c1 Merge pull request 'fix(ci): quitar anchors/aliases YAML de build.yaml' (#20) from fix/build-yaml-anchor-not-supported into main
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 25s
Build and Push Frontend / Construir y Subir Imagen (push) Failing after 42s
2026-08-15 04:25:51 +00:00
devops 6773a8085d fix(ci): quitar anchors/aliases YAML de build.yaml, no soportados por Gitea Actions
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (pull_request) Successful in 39s
Build and Push Frontend / Construir y Subir Imagen (pull_request) Skipped
Gitea descartaba el workflow completo en TODOS los eventos (push y
pull_request), desde el primer commit de gitleaks: "unknown on type:
&yaml.Node{...Value:"frontend_paths"...}". El YAML era válido (pyyaml
lo parsea sin problema, resolviendo el alias como cualquier parser
estándar) pero el parser propio de Gitea Actions para el bloque "on:"
no resuelve &anchor/*alias antes de inspeccionar el tipo de nodo.

Confirmado en vivo: tras mergear #19 a main, deploy-docs.yaml corrió
normal (sin anchors) pero build.yaml no generó ningún action_run.

Fix: paths duplicados literalmente entre push: y pull_request:, sin
anchor. Válido con parser YAML + bash -n en los 20 steps.
2026-08-14 23:24:31 -05:00
gitea-actions ea7d5e7f47 chore(gitops): deploy Docs Portal v1.0.98 [skip ci] 2026-08-15 04:15:42 +00:00
devops 98096ab69f Merge pull request 'feat(devsecops): Gitleaks + Trivy + Semgrep + Syft + Cosign en el frontend' (#19) from fix/frontend-gitleaks-ci into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 1m36s
2026-08-15 04:14:08 +00:00
devops 2438a6ba0f fix(ci): corregir indentación YAML rota en el step de Semgrep
El python3 -c "..." embebido dentro del run: | tenía el código pegado
a columna 0, por debajo de la indentación del bloque YAML -- eso corta
el block scalar ahí mismo y Gitea terminaba ignorando el workflow
completo ("could not find expected ':'"), silenciosamente, desde el
commit de Semgrep.

Validado con un parser YAML real (no solo con builds de Docker) y
bash -n sobre los 20 steps del archivo.
2026-08-14 22:59:31 -05:00
devops 96be5b4b03 chore: trigger CI re-check after Gitea SQLite WAL fix 2026-08-14 22:28:22 -05:00
devops 7dc50b83e0 docs(devsecops): agregar página resumen con diagrama del pipeline
docs/devsecops/index.md documenta el pipeline completo (job gitleaks +
job build) con un diagrama Mermaid del orden real de ejecución, tabla
de qué bloquea vs qué solo informa, y qué pasa si cada herramienta
falla. Nav actualizado: "Resumen" como landing page de la sección
DevSecOps.

Con esto quedan las 5 herramientas de la Fase 2 (Gitleaks, Trivy,
Semgrep, Syft, Cosign) integradas y documentadas para
workloads/ecommerce, listas para replicar a commerce-backend y
docs-portal en una próxima vuelta.
2026-08-14 21:59:58 -05:00
devops c1b5f72a68 feat(devsecops): firmar la imagen del frontend con Cosign
Firma la imagen (solo el tag versionado, no :latest) después del push
exitoso, usando la llave privada desde secrets de Gitea Actions
(COSIGN_PRIVATE_KEY/COSIGN_PASSWORD, nunca en el repo ni en disco).
Verifica la firma como smoke test en el mismo pipeline contra
workloads/ecommerce/cosign.pub (pública, commiteada a propósito).

Firma solo con el par de llaves propio, sin publicar en el
transparency log público de Sigstore (--use-signing-config=false
--tlog-upload=false / --insecure-ignore-tlog=true) — registry privado,
no tiene sentido esa fuga de metadata.

Par de llaves generado y validado end-to-end (firma + verificación,
incluyendo que verificar con la llave incorrecta falla como se espera)
contra un registry local descartable antes de tocar nada real. Docs en
docs/devsecops/cosign.md, incluyendo qué falta para que un admission
controller verifique esto en el cluster (no implementado todavía).
2026-08-14 21:55:03 -05:00
devops b6038e06ca feat(devsecops): generar SBOM (Syft) de la imagen del frontend
Corre después del gate de CRITICAL de Trivy, sobre la imagen ya
construida. Genera CycloneDX y SPDX, publicados como artifact
sbom-v1.0.X en cada build.

Validado contra la imagen real: 3528 componentes CycloneDX / 228
paquetes SPDX. Documenta en docs/devsecops/sbom.md el propósito
(trazabilidad tipo "log4shell"), diferencia entre formatos, y un
hallazgo real (yarn empaquetado sin usarse, mismo patrón que el npm
sacado en el fix de Trivy).
2026-08-14 21:14:00 -05:00
devops 4aed9f6c5c feat(devsecops): agregar Semgrep SAST en modo auditoría al pipeline
Escanea workloads/ecommerce con rulesets públicos del registro de
Semgrep (p/typescript, p/react, p/nextjs, p/security-audit) vía la
imagen oficial semgrep/semgrep:1.173.0. Sin --error a propósito: siempre
termina en exit 0, solo reporta — primera vuelta para revisar juntos qué
reglas deberían pasar a bloquear más adelante.

Validado contra el código real: 0 hallazgos en 91 reglas / 72 archivos.
Documenta la herramienta en docs/devsecops/sast.md, incluyendo la
diferencia con gitleaks/trivy y qué significa (y qué no) un scan limpio.
2026-08-14 21:07:05 -05:00
devops df13233a29 feat(devsecops): agregar Trivy (imagen + IaC) al pipeline del frontend
trivy config sobre frontend.yaml (CRITICAL/HIGH/MEDIUM, informativo) y
trivy image sobre la imagen recién construida (CRITICAL bloquea con
--ignore-unfixed, HIGH solo informa), entre build (push:false, load:true)
y el push real al registry.

Fix real encontrado al validar contra la imagen real: el stage runner
heredaba npm/npx/corepack completos de la imagen base de Node sin
necesitarlos en runtime, trayendo CVE-2026-59873 (CRITICAL, node-tar
empaquetado en npm). Sacarlos del stage final baja CRITICAL de 1 a 0 y
HIGH fixable de 21 a 15 (las que quedan son de la propia app, ej. next
desactualizado, documentadas como pendiente sin bloquear).

Documenta ambos scans en docs/devsecops/trivy.md con los hallazgos
reales de este repo.
2026-08-14 20:43:09 -05:00
devops 422e9d257d feat(devsecops): agregar Gitleaks al pipeline del frontend
Corre en push y pull_request, antes del job build (needs: gitleaks).
Si detecta un secreto, exit-code=1 detiene el pipeline antes de
construir la imagen. Scan histórico completo del repo (249 commits)
confirmado limpio, corrido aparte de forma manual.

Documenta el step en docs/devsecops/gitleaks.md: qué es secret
scanning, por qué corre antes del build, cómo leer un hallazgo y
cómo manejar falsos positivos con allowlist.
2026-08-14 19:48:44 -05:00
gitea-actions 66c44a7dad chore(gitops): deploy Docs Portal v1.0.97 [skip ci] 2026-08-14 04:10:07 +00:00
devops ef0093a406 Merge pull request 'fix(docs-portal): deshabilitar git-revision-date-localized (rompe --strict)' (#18) from fix/docs-portal-deshabilitar-plugin-fechas into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 10m7s
2026-08-14 03:29:21 +00:00
devops 0234c20463 fix(docs-portal): deshabilitar git-revision-date-localized (rompe --strict)
mkdocs build --strict aborta ante CUALQUIER WARNING, no solo ante links
rotos. El plugin, al no tener .git real en el contexto de build
(workloads/docs-portal/, sin .git de la raíz del repo), cae siempre en
fallback_to_build_date y emite un WARNING por página — suficiente para
tumbar el build bajo --strict (confirmado en run 96, job 108: 33
warnings, todos de este plugin, cero links rotos).

Se deshabilita el plugin (comentado en mkdocs.yml y requirements.txt,
con TODO fase 2: mover el build a la raíz del repo + fetch-depth:0 para
darle historial real) y se revierte la instalación de git en el
Dockerfile, que ya no hace falta. index.md actualizado para no prometer
fechas reales que hoy no se muestran.
2026-08-13 22:27:56 -05:00
devops 9ec40370bf Merge pull request 'fix(docs-portal): corregir anchor roto en playbook de crashloop de Medusa' (#17) from fix/docs-portal-anchor-roto into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 2m11s
2026-08-14 03:20:51 +00:00
devops 22534d65f3 fix(docs-portal): corregir anchor roto en playbook de crashloop de Medusa
mkdocs build --strict (run 95, job 107) falló: el link a '#deuda-técnica-pendiente'
no coincide con el anchor real que genera mkdocs, porque el slugify por
defecto de Python-Markdown normaliza tildes (NFKD + strip de combining marks)
antes de generar el id del heading. El heading '## Deuda técnica pendiente'
genera 'deuda-tecnica-pendiente' (sin tilde), no 'deuda-técnica-pendiente'.
2026-08-13 22:10:36 -05:00
devops 45924f9df2 Merge pull request 'fix(docs-portal): instalar git en la imagen de build para mkdocs-git-revision-date-localized-plugin' (#16) from fix/docs-portal-dockerfile-git-binario into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 9m50s
2026-08-14 02:57:10 +00:00
devops bb1249fd58 fix(docs-portal): instalar git en la imagen de build para mkdocs-git-revision-date-localized-plugin
El plugin depende de GitPython, que necesita el binario git para
importarse (no solo para leer fechas) — sin él, mkdocs build --strict
falla en el import del plugin antes de llegar al fallback_to_build_date
configurado en mkdocs.yml.

Detectado en el primer intento real de build en Gitea Actions (run 94,
job 106).
2026-08-13 21:56:11 -05:00
devops 10556758b2 Merge pull request 'docs(docs-portal): documentar que el pipeline de build/deploy quedó operativo' (#15) from fix/docs-portal-estado-pipeline-vivo into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 7m46s
2026-08-14 02:42:04 +00:00
devops e8712327a2 docs(docs-portal): documentar que el pipeline de build/deploy quedó operativo
Dispara el primer build real del portal via .gitea/workflows/deploy-docs.yaml
ahora que el Deployment, Service, Ingress y el secret de registry ya existen
en el namespace docs-portal.
2026-08-13 21:41:50 -05:00
devops d5c80c98e7 Merge pull request 'feat(docs-portal): pipeline GitOps y manifiestos K8s para el portal MkDocs' (#14) from fix/docs-portal-pipeline-manifests into main
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Failing after 1m21s
2026-08-14 02:33:53 +00:00
devops fb5cf8bc98 feat(docs-portal): pipeline GitOps y manifiestos K8s para el portal MkDocs
Agrega lo que faltaba para desplegar workloads/docs-portal/ (ya existente
sin commitear): deployment/service/ingress + kustomization siguiendo el
patrón de workloads/nginx, Applications de workload y gobernanza
separadas, y el workflow de Gitea Actions (build+push a Gitea Registry,
bump de versión en el manifiesto) siguiendo el mismo patrón que
build.yaml/build-medusa.yaml.
2026-08-13 21:08:04 -05:00
devops 11737ba109 Merge pull request 'docs(playbooks): documentar incidentes túnel/precios/imágenes' (#13) from fix/docs-incidentes-tunel-precios-imagenes into main 2026-08-13 23:39:17 +00:00