Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c47a39579 | ||
|
|
3ee7171178 | ||
|
|
81c0f99e00 | ||
|
|
38722b97a8 | ||
|
|
5fc86e6ef4 | ||
|
|
93f071c175 | ||
|
|
0c1076eda0 | ||
|
|
80d99f9f3f | ||
|
|
81f01c7ade | ||
|
|
27a1e75a4c | ||
|
|
45312fc189 | ||
|
|
1bcae76102 |
@@ -1,5 +1,11 @@
|
|||||||
name: Build and Push Medusa
|
name: Build and Push Medusa
|
||||||
|
|
||||||
|
# Retrigger: el run 107 (con la remediacion de CVEs ya mergeada) fue
|
||||||
|
# cancelado a mitad de camino porque el stack de Gitea (gitea +
|
||||||
|
# gitea-runner) se reinicio solo durante el build -- no por el
|
||||||
|
# contenido del pipeline. Ver hallazgo de contencion de recursos en
|
||||||
|
# docs/playbooks.
|
||||||
|
|
||||||
# Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de
|
# Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de
|
||||||
# workflows de Gitea Actions no los resuelve en el bloque "on:" y
|
# workflows de Gitea Actions no los resuelve en el bloque "on:" y
|
||||||
# descarta el archivo completo con "unknown on type". Las dos listas de
|
# descarta el archivo completo con "unknown on type". Las dos listas de
|
||||||
@@ -211,6 +217,19 @@ jobs:
|
|||||||
|
|
||||||
# CRITICAL bloquea el pipeline: no se sube una imagen con una CVE
|
# CRITICAL bloquea el pipeline: no se sube una imagen con una CVE
|
||||||
# crítica conocida y con fix disponible.
|
# crítica conocida y con fix disponible.
|
||||||
|
# --timeout 15m0s: el default de Trivy (5m) no alcanza para esta
|
||||||
|
# imagen -- a diferencia del frontend, commerce-backend arrastra
|
||||||
|
# el node_modules completo de Medusa v2 (framework + admin-sdk +
|
||||||
|
# cli), muchos más archivos que escanear tanto para vulnerabilidades
|
||||||
|
# como para el escaneo de secretos que Trivy corre por default
|
||||||
|
# dentro de la imagen. Visto en vivo: "context deadline exceeded"
|
||||||
|
# a los 4m52s con el timeout default, en un run donde el host
|
||||||
|
# venía de terminar el docker build (ver hallazgo de rendimiento
|
||||||
|
# de Gitea/runner en docs/playbooks).
|
||||||
|
# --ignorefile: excepciones puntuales y documentadas (ver
|
||||||
|
# workloads/commerce-backend/.trivyignore) para CVEs sin fix de
|
||||||
|
# bajo riesgo disponible hoy. No debilita el gate en general --
|
||||||
|
# cualquier otra CRITICAL sigue bloqueando igual.
|
||||||
- name: Escanear imagen (Trivy) — CRITICAL bloquea
|
- name: Escanear imagen (Trivy) — CRITICAL bloquea
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -219,6 +238,8 @@ jobs:
|
|||||||
--severity CRITICAL \
|
--severity CRITICAL \
|
||||||
--exit-code 1 \
|
--exit-code 1 \
|
||||||
--ignore-unfixed \
|
--ignore-unfixed \
|
||||||
|
--timeout 15m0s \
|
||||||
|
--ignorefile "${APP_DIR}/.trivyignore" \
|
||||||
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
# HIGH solo informa por ahora — mismo criterio que el frontend.
|
# HIGH solo informa por ahora — mismo criterio que el frontend.
|
||||||
@@ -230,6 +251,7 @@ jobs:
|
|||||||
--severity HIGH \
|
--severity HIGH \
|
||||||
--exit-code 0 \
|
--exit-code 0 \
|
||||||
--ignore-unfixed \
|
--ignore-unfixed \
|
||||||
|
--timeout 15m0s \
|
||||||
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
- name: Instalar Syft
|
- name: Instalar Syft
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
name: Build and Push Docs Portal
|
name: Build and Push Docs Portal
|
||||||
|
|
||||||
|
# Sin anchors/aliases de YAML (&x / *x) a propósito -- el parser de
|
||||||
|
# workflows de Gitea Actions no los resuelve en el bloque "on:" y
|
||||||
|
# descarta el archivo completo con "unknown on type". Las dos listas de
|
||||||
|
# paths quedan duplicadas literalmente (mismo criterio que build.yaml).
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -10,14 +14,71 @@ on:
|
|||||||
- 'workloads/docs-portal/requirements.txt'
|
- 'workloads/docs-portal/requirements.txt'
|
||||||
- 'workloads/docs-portal/Dockerfile'
|
- 'workloads/docs-portal/Dockerfile'
|
||||||
- '.gitea/workflows/deploy-docs.yaml'
|
- '.gitea/workflows/deploy-docs.yaml'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'workloads/docs-portal/docs/**'
|
||||||
|
- 'workloads/docs-portal/mkdocs.yml'
|
||||||
|
- 'workloads/docs-portal/requirements.txt'
|
||||||
|
- 'workloads/docs-portal/Dockerfile'
|
||||||
|
- '.gitea/workflows/deploy-docs.yaml'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
packages: write
|
packages: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# Corre en push y en pull_request, siempre antes que build. Mismo
|
||||||
|
# criterio que el frontend: si hay un secreto commiteado, el job build
|
||||||
|
# nunca arranca (needs: gitleaks).
|
||||||
|
gitleaks:
|
||||||
|
name: Escaneo de Secretos (Gitleaks)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout del código
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Instalar Gitleaks
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
GITLEAKS_VERSION="8.21.2"
|
||||||
|
curl -sSfL \
|
||||||
|
"https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \
|
||||||
|
-o /tmp/gitleaks.tar.gz
|
||||||
|
tar -xzf /tmp/gitleaks.tar.gz -C /tmp gitleaks
|
||||||
|
chmod +x /tmp/gitleaks
|
||||||
|
/tmp/gitleaks version
|
||||||
|
|
||||||
|
- name: Escanear secretos en el árbol de archivos
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/gitleaks detect \
|
||||||
|
--source=workloads/docs-portal \
|
||||||
|
--no-git \
|
||||||
|
--redact \
|
||||||
|
--report-format=json \
|
||||||
|
--report-path=gitleaks-report.json \
|
||||||
|
--exit-code=1
|
||||||
|
|
||||||
|
- name: Publicar reporte de Gitleaks
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: gitleaks-report
|
||||||
|
path: gitleaks-report.json
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: Construir y publicar Docs Portal
|
name: Construir y publicar Docs Portal
|
||||||
|
needs: gitleaks
|
||||||
|
if: github.event_name == 'push'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
|
|
||||||
@@ -56,6 +117,83 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- name: Instalar Trivy
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
TRIVY_VERSION="0.74.0"
|
||||||
|
curl -sSfL \
|
||||||
|
"https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz" \
|
||||||
|
-o /tmp/trivy.tar.gz
|
||||||
|
tar -xzf /tmp/trivy.tar.gz -C /tmp trivy
|
||||||
|
chmod +x /tmp/trivy
|
||||||
|
/tmp/trivy version
|
||||||
|
|
||||||
|
# Escanea todo el directorio de la app (Deployment, Service,
|
||||||
|
# Ingress y Dockerfile), no un único MANIFEST_FILE como el
|
||||||
|
# frontend -- docs-portal tiene varios manifiestos K8s separados
|
||||||
|
# (deployment.yaml, service.yaml, ingress.yaml) en vez de uno
|
||||||
|
# solo, así que un único archivo dejaría fuera la mayoría del
|
||||||
|
# directorio. Informativo por ahora, mismo criterio que el resto.
|
||||||
|
- name: Escanear manifiestos Kubernetes (Trivy IaC)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/trivy config \
|
||||||
|
--severity CRITICAL,HIGH,MEDIUM \
|
||||||
|
--exit-code 0 \
|
||||||
|
"${APP_DIR}"
|
||||||
|
|
||||||
|
# Mismo motivo que en build.yaml: sibling containers, no
|
||||||
|
# Docker-in-Docker -- Semgrep corre nativo en un venv.
|
||||||
|
- name: Instalar Semgrep
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
python3 -m venv /tmp/semgrep-venv
|
||||||
|
/tmp/semgrep-venv/bin/pip install --quiet "semgrep==1.173.0"
|
||||||
|
/tmp/semgrep-venv/bin/semgrep --version
|
||||||
|
|
||||||
|
# Ruleset adaptado: docs-portal no tiene código de aplicación
|
||||||
|
# propio (es contenido Markdown + configuración de MkDocs), así
|
||||||
|
# que ni p/typescript ni p/react/p/nextjs del frontend aplican
|
||||||
|
# acá. Se usa p/python -- el único código ejecutable real en este
|
||||||
|
# directorio sería un hook/plugin de Python de MkDocs, si algún
|
||||||
|
# día se agrega uno. Hoy no hay ningún archivo .py en
|
||||||
|
# workloads/docs-portal, así que 0 hallazgos es el resultado
|
||||||
|
# esperado, no un falso negativo -- se deja el stage para que
|
||||||
|
# detecte código nuevo el día que se agregue, sin tener que
|
||||||
|
# recordar volver a tocar el pipeline. Modo auditoría, igual que
|
||||||
|
# el resto: no bloquea.
|
||||||
|
- name: Escaneo SAST (Semgrep) — modo auditoría, no bloquea
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/semgrep-venv/bin/semgrep scan \
|
||||||
|
--config=p/python \
|
||||||
|
--config=p/security-audit \
|
||||||
|
--json \
|
||||||
|
--output=semgrep-report.json \
|
||||||
|
"${APP_DIR}"
|
||||||
|
|
||||||
|
echo "=== Resumen Semgrep ==="
|
||||||
|
/tmp/semgrep-venv/bin/python -c "
|
||||||
|
import json
|
||||||
|
data = json.load(open('semgrep-report.json'))
|
||||||
|
results = data.get('results', [])
|
||||||
|
print(f'Hallazgos: {len(results)}')
|
||||||
|
for r in results:
|
||||||
|
print(f\" [{r['extra']['severity']}] {r['check_id']} - {r['path']}:{r['start']['line']}\")
|
||||||
|
"
|
||||||
|
|
||||||
|
- name: Publicar reporte de Semgrep
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: semgrep-report
|
||||||
|
path: semgrep-report.json
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
- name: Login en Gitea Registry
|
- name: Login en Gitea Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
@@ -64,18 +202,129 @@ jobs:
|
|||||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
logout: true
|
logout: true
|
||||||
|
|
||||||
# mkdocs build --strict corre dentro del propio Dockerfile (stage de
|
# mkdocs build --strict corre dentro del propio Dockerfile (stage
|
||||||
# build), así que un nav/link roto rompe este paso antes de publicar.
|
# de build), así que un nav/link roto rompe este paso antes de
|
||||||
- name: Construir y subir imagen
|
# publicar. push: false / load: true -- igual que el frontend, la
|
||||||
|
# imagen queda cargada localmente para escanearla con Trivy antes
|
||||||
|
# de subirla.
|
||||||
|
- name: Construir Imagen
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
context: workloads/docs-portal/
|
context: ${{ env.APP_DIR }}/
|
||||||
file: workloads/docs-portal/Dockerfile
|
file: ${{ env.APP_DIR }}/Dockerfile
|
||||||
push: true
|
push: false
|
||||||
|
load: true
|
||||||
tags: |
|
tags: |
|
||||||
${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.VERSION }}
|
${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.VERSION }}
|
||||||
${{ env.IMAGE_NAME }}:latest
|
${{ env.IMAGE_NAME }}:latest
|
||||||
|
|
||||||
|
# CRITICAL bloquea el pipeline: no se sube una imagen con una CVE
|
||||||
|
# crítica conocida y con fix disponible.
|
||||||
|
# --timeout 15m0s: agregado preventivamente. Se vio en vivo, al
|
||||||
|
# correr este mismo comando sin el flag en commerce-backend, que
|
||||||
|
# el default de Trivy (5m) no alcanza en este host bajo carga
|
||||||
|
# ("context deadline exceeded" a los 4m52s) -- la imagen de
|
||||||
|
# docs-portal es chica, pero no cuesta nada blindar el mismo
|
||||||
|
# comando en los tres pipelines.
|
||||||
|
- name: Escanear imagen (Trivy) — CRITICAL bloquea
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/trivy image \
|
||||||
|
--severity CRITICAL \
|
||||||
|
--exit-code 1 \
|
||||||
|
--ignore-unfixed \
|
||||||
|
--timeout 15m0s \
|
||||||
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
|
# HIGH solo informa por ahora — mismo criterio que el resto.
|
||||||
|
- name: Escanear imagen (Trivy) — HIGH informativo
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/trivy image \
|
||||||
|
--severity HIGH \
|
||||||
|
--exit-code 0 \
|
||||||
|
--ignore-unfixed \
|
||||||
|
--timeout 15m0s \
|
||||||
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
|
- name: Instalar Syft
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
SYFT_VERSION="1.51.0"
|
||||||
|
curl -sSfL \
|
||||||
|
"https://github.com/anchore/syft/releases/download/v${SYFT_VERSION}/syft_${SYFT_VERSION}_linux_amd64.tar.gz" \
|
||||||
|
-o /tmp/syft.tar.gz
|
||||||
|
tar -xzf /tmp/syft.tar.gz -C /tmp syft
|
||||||
|
chmod +x /tmp/syft
|
||||||
|
/tmp/syft version
|
||||||
|
|
||||||
|
- name: Generar SBOM (Syft)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/syft "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}" \
|
||||||
|
-o cyclonedx-json=sbom.cdx.json \
|
||||||
|
-o spdx-json=sbom.spdx.json
|
||||||
|
|
||||||
|
- name: Publicar SBOM
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: sbom-${{ steps.vars.outputs.VERSION }}
|
||||||
|
path: |
|
||||||
|
sbom.cdx.json
|
||||||
|
sbom.spdx.json
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
|
# Login ya se hizo arriba; recién acá se sube, después de que la
|
||||||
|
# imagen pasó el gate de CRITICAL.
|
||||||
|
- name: Subir Imagen al Registry
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
docker push "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
docker push "${IMAGE_NAME}:latest"
|
||||||
|
|
||||||
|
- name: Instalar Cosign
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
COSIGN_VERSION="3.1.3"
|
||||||
|
curl -sSfL \
|
||||||
|
"https://github.com/sigstore/cosign/releases/download/v${COSIGN_VERSION}/cosign-linux-amd64" \
|
||||||
|
-o /tmp/cosign
|
||||||
|
chmod +x /tmp/cosign
|
||||||
|
/tmp/cosign version
|
||||||
|
|
||||||
|
# Mismo par de llaves que el frontend y commerce-backend (secrets
|
||||||
|
# ya existentes a nivel de repo). Llave pública commiteada en
|
||||||
|
# workloads/docs-portal/cosign.pub.
|
||||||
|
- name: Firmar Imagen (Cosign)
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
|
||||||
|
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/cosign sign \
|
||||||
|
--key env://COSIGN_PRIVATE_KEY \
|
||||||
|
--use-signing-config=false \
|
||||||
|
--tlog-upload=false \
|
||||||
|
--yes \
|
||||||
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
|
- name: Verificar Firma (smoke test)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
/tmp/cosign verify \
|
||||||
|
--key "${APP_DIR}/cosign.pub" \
|
||||||
|
--insecure-ignore-tlog=true \
|
||||||
|
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
|
||||||
|
|
||||||
- name: Verificar promoción segura
|
- name: Verificar promoción segura
|
||||||
id: promotion
|
id: promotion
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -123,3 +372,14 @@ jobs:
|
|||||||
-m "chore(gitops): deploy Docs Portal ${VERSION} [skip ci]"
|
-m "chore(gitops): deploy Docs Portal ${VERSION} [skip ci]"
|
||||||
|
|
||||||
git push origin HEAD:main
|
git push origin HEAD:main
|
||||||
|
|
||||||
|
- name: Resumen del pipeline
|
||||||
|
if: always()
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "========================================"
|
||||||
|
echo "CruzCloud Lab Docs Portal"
|
||||||
|
echo "Versión: ${{ steps.vars.outputs.VERSION }}"
|
||||||
|
echo "Commit: ${{ github.sha }}"
|
||||||
|
echo "Promoción GitOps: ${{ steps.promotion.outputs.promote }}"
|
||||||
|
echo "========================================"
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# Excepciones documentadas al gate CRITICAL de Trivy (imagen) para
|
||||||
|
# commerce-backend. Cada entrada requiere justificación y fecha -- no
|
||||||
|
# es un mecanismo para silenciar hallazgos sin revisar.
|
||||||
|
#
|
||||||
|
# CVE-2024-24790 / CVE-2025-68121 (golang stdlib, gobinary):
|
||||||
|
# Van embebidas en el binario precompilado de esbuild
|
||||||
|
# (app/node_modules/@esbuild/linux-x64/bin/esbuild), traído
|
||||||
|
# transitivamente por [email protected], que a su vez lo trae
|
||||||
|
# @medusajs/admin-sdk para bundlear el panel de admin en build time.
|
||||||
|
# No es un binario que se ejecute en runtime del contenedor (el CMD
|
||||||
|
# corre "node .../medusa/cli start", nunca esbuild).
|
||||||
|
#
|
||||||
|
# Se intentó el fix real (bump de esbuild a una versión compilada con
|
||||||
|
# un Go toolchain más nuevo, override en package.json) y rompió el
|
||||||
|
# build del admin: [email protected] declara "esbuild: ^0.21.3" como
|
||||||
|
# dependencia directa (no rango amplio), y esbuild >=0.24 cambió el
|
||||||
|
# manejo de la lista de "target" de transpilación que vite 5 pasa
|
||||||
|
# internamente -- build.yaml falló con
|
||||||
|
# "Transforming destructuring... not supported yet" /
|
||||||
|
# PLUGIN_ERROR en vite:esbuild-transpile. No existe un patch dentro
|
||||||
|
# de la propia serie 0.21.x (0.21.5 ya es la última) que incluya un
|
||||||
|
# Go toolchain con estas CVEs corregidas.
|
||||||
|
#
|
||||||
|
# Domesticar esto de verdad requiere subir @medusajs/admin-sdk (y por
|
||||||
|
# lo tanto vite) a una versión que dependa de un esbuild más nuevo --
|
||||||
|
# fuera de alcance de este pipeline de seguridad, queda como TODO de
|
||||||
|
# dependencias en un cambio aparte, no bloqueado por CI mientras
|
||||||
|
# tanto.
|
||||||
|
#
|
||||||
|
# Documentado: 2026-08-15. Revisar en cada bump de @medusajs/* por si
|
||||||
|
# ya arrastra una versión de vite/esbuild más nueva y esta excepción
|
||||||
|
# deja de ser necesaria.
|
||||||
|
CVE-2024-24790
|
||||||
|
CVE-2025-68121
|
||||||
@@ -59,6 +59,26 @@ ENV NODE_ENV=production \
|
|||||||
PORT=9000 \
|
PORT=9000 \
|
||||||
NPM_CONFIG_UPDATE_NOTIFIER=false
|
NPM_CONFIG_UPDATE_NOTIFIER=false
|
||||||
|
|
||||||
|
#
|
||||||
|
# libgnutls30 en la base node:22.18.0-bookworm-slim trae dos CVE
|
||||||
|
# CRITICAL con fix ya publicado por Debian (CVE-2026-33845,
|
||||||
|
# CVE-2026-42010) -- detectado por el gate de Trivy imagen del
|
||||||
|
# pipeline (run 138). Solo se actualiza este paquete puntual, no toda
|
||||||
|
# la imagen, para minimizar el diff de superficie de la base.
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get upgrade -y libgnutls30 \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
#
|
||||||
|
# El CLI global de npm que trae la imagen base node:*-slim no se usa en
|
||||||
|
# runtime (el CMD invoca a Medusa directo con `node`, nunca `npm`) y
|
||||||
|
# arrastra su propia copia vendorizada de `tar` con un CVE CRITICAL
|
||||||
|
# (CVE-2026-59873, detectado por Trivy en
|
||||||
|
# usr/local/lib/node_modules/npm/node_modules/tar). Se elimina en vez
|
||||||
|
# de forzar una versión: no es una dependencia real de este proyecto,
|
||||||
|
# así que no hay nada que "actualizar" -- solo superficie sin uso.
|
||||||
|
RUN rm -rf /usr/local/lib/node_modules/npm
|
||||||
|
|
||||||
#
|
#
|
||||||
# Solo lo necesario para ejecutar Medusa
|
# Solo lo necesario para ejecutar Medusa
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -16,6 +16,14 @@ RUN mkdocs build --strict
|
|||||||
# --- Stage 2: sirve el sitio estático generado con nginx ---
|
# --- Stage 2: sirve el sitio estático generado con nginx ---
|
||||||
FROM nginx:1.27-alpine
|
FROM nginx:1.27-alpine
|
||||||
|
|
||||||
|
# libssl3/libcrypto3 de la base nginx:1.27-alpine traen un CVE CRITICAL
|
||||||
|
# con fix ya publicado por Alpine (CVE-2026-31789, heap buffer overflow
|
||||||
|
# en OpenSSL) -- detectado por el gate de Trivy imagen del pipeline
|
||||||
|
# (run 144). Solo se actualizan estos dos paquetes puntuales.
|
||||||
|
RUN apk update \
|
||||||
|
&& apk upgrade --no-cache libssl3 libcrypto3 \
|
||||||
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
COPY --from=build /site/site /usr/share/nginx/html
|
COPY --from=build /site/site /usr/share/nginx/html
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhjg9/nC0u+iEANiHkVJY8iN+LZo+
|
||||||
|
VFMF7XG/oC64W3/SfwrPgt+ZIqF6t+ceyrNuEgugajvUdpigz1PHEqQKLw==
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
@@ -52,7 +52,7 @@ spec:
|
|||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
|
|
||||||
- name: migrations
|
- name: migrations
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.92
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.108
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
command:
|
command:
|
||||||
- npx
|
- npx
|
||||||
@@ -73,7 +73,7 @@ spec:
|
|||||||
|
|
||||||
containers:
|
containers:
|
||||||
- name: medusa
|
- name: medusa
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.92
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.108
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
|
|||||||
Reference in New Issue
Block a user