# Soporte multi-arquitectura (amd64 + arm64) para vscode-server

## Contexto

La imagen `vscode-server` hoy solo se construye y publica para `linux/amd64` (ver
`.gitea/workflows/main-workflow.yml:85`). El usuario quiere consumir esta imagen nativamente
desde una Mac con chip Apple Silicon (arm64), y seguir publicándola en el registry de Gitea
(`gitea.p-lao.com/aleleba/vscode-server`).

La imagen base `gitea.p-lao.com/aleleba/vscode:latest` (repo
`aleleba/aleleba-vscode-dockerfile-configuration`) ya se publica multi-arch (confirmado: su
workflow construye con `platforms: linux/amd64,linux/arm64` y su Dockerfile usa
`$(dpkg --print-architecture)` para resolver rutas dependientes de arquitectura), así que es una
base válida para extender.

Al revisar `Dockerfile` completo se encontraron dos problemas que romperían o degradarían el
build en arm64, y ambos ya se resolvieron con el usuario:

1. **`JAVA_HOME` hardcodeado a `amd64`** (`Dockerfile:106`, y de nuevo en el `~/.bashrc` en
   `Dockerfile:160`) — en Debian/Ubuntu la ruta de `openjdk-17-jdk` es
   `/usr/lib/jvm/java-17-openjdk-<arch>`, así que en arm64 esa ruta no existiría y rompería
   cualquier comando que dependa de `$JAVA_HOME` (Android SDK, Gradle, etc.).
2. **`docker-compose` v1.21.2 descargado como binario fijo** (`Dockerfile:76-80`) desde
   `https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m)`
   — se confirmó por búsqueda web que esa versión (2018) nunca publicó binario para
   `aarch64`/`arm64`; el `RUN` fallaría al construir en esa plataforma.

Decisiones ya acordadas con el usuario:
- **docker-compose**: eliminar la descarga manual del binario v1 y confiar en el plugin Compose V2
  (`docker compose`, con espacio) que el script de `get.docker.com` ya instala automáticamente y
  que sí soporta ambas arquitecturas nativamente. Agregar un wrapper `/usr/local/bin/docker-compose`
  que delegue a `docker compose "$@"`, para no romper scripts existentes que usan el nombre con guion.
- **Android SDK** (`platform-tools`, `build-tools`, `emulator` instalados vía `sdkmanager`,
  `Dockerfile:130-131`): Google solo distribuye binarios nativos oficiales para Linux x86_64. El
  build en sí no falla en arm64 (`sdkmanager` solo descarga/descomprime, no ejecuta los binarios),
  pero en un Mac M corriendo la imagen arm64 nativa, `adb`/`aapt2`/`emulator` probablemente no
  ejecutarán. Se deja la instalación igual en ambas arquitecturas y se documenta la limitación en
  el README (mitigación: correr ese contenedor puntual con `--platform linux/amd64` cuando se
  necesite Android).

El resto de las instalaciones del Dockerfile (GitHub CLI, kubectl, Flux CLI, NVM/Node, Emscripten,
Claude Code, Conan) ya son multi-arch (usan `$(dpkg --print-architecture)`, scripts oficiales que
autodetectan arquitectura, o son artefactos JVM/Python agnósticos de arquitectura) — no requieren
cambios.

## Cambios

### 1. `Dockerfile`

- Justo antes de `ENV JAVA_HOME=...` (línea 106), declarar `ARG TARGETARCH` (buildx lo puebla
  automáticamente por plataforma; sus valores `amd64`/`arm64` coinciden con el naming de Debian) y
  cambiar la línea a:
  ```
  ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-${TARGETARCH}
  ```
- En el bloque de configuración de `~/.bashrc` (línea ~160), reemplazar el valor hardcodeado por la
  variable ya resuelta:
  ```
  RUN echo "export JAVA_HOME=$JAVA_HOME" | sudo tee -a ~/.bashrc
  ```
- Eliminar el bloque de instalación manual de `docker-compose` v1 (líneas 76-80).
- Después de instalar Docker (que ya trae `docker-compose-plugin`), agregar un wrapper de
  compatibilidad:
  ```
  RUN sudo printf '#!/bin/sh\nexec docker compose "$@"\n' | sudo tee /usr/local/bin/docker-compose > /dev/null \
      && sudo chmod +x /usr/local/bin/docker-compose
  ```

### 2. `.gitea/workflows/main-workflow.yml`

- Agregar el paso `docker/setup-qemu-action@v3` (antes de `docker/setup-buildx-action@v3`), para
  garantizar emulación arm64 en el runner de Gitea Actions aunque no traiga QEMU/binfmt
  preregistrado (a diferencia de runners hosteados de GitHub).
- Cambiar `platforms: linux/amd64` (línea 85) a `platforms: linux/amd64,linux/arm64`.

### 3. `README.md`

- Bump de versión siguiendo la convención existente del repo (cada commit incrementa la versión):
  `1.1.0` → `1.2.0`.
- Agregar una nota breve documentando la limitación de Android SDK en arm64 y la mitigación
  (`--platform linux/amd64` cuando se necesite `adb`/`aapt2`/`emulator` funcionales).

## Verificación

- Build local multi-plataforma sin push, solo para validar que ambos targets compilan:
  ```
  docker buildx build --platform linux/amd64,linux/arm64 -t vscode-server:test --output=type=cacheonly .
  ```
- Si hace falta cargar y probar arm64 localmente en una máquina x86 (requiere QEMU registrado,
  p.ej. `docker run --privileged --rm tonistiigi/binfmt --install all`):
  ```
  docker buildx build --platform linux/arm64 -t vscode-server:arm64 --load .
  docker run --rm --platform linux/arm64 vscode-server:arm64 bash -lc 'echo $JAVA_HOME && java -version && docker compose version && docker-compose version'
  ```
- Push a `master` (o `workflow_dispatch`) y confirmar en Gitea Actions que el job
  `build-and-push` termina en verde para ambas plataformas.
- Verificar el manifest multi-arch publicado:
  ```
  docker manifest inspect gitea.p-lao.com/aleleba/vscode-server:latest
  ```
  y confirmar que aparecen entradas para `linux/amd64` y `linux/arm64`.
