diff --git a/README.md b/README.md index 9fa9291..632be15 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ To push every service in one project, pass that project's list file to `./scripts/deploy-services.sh`. It runs `build-and-push.sh` once per path and reports any failures at the end. See `scripts/README.md` for the list format. -The script uses the last directory of the service location as the image name +The script uses the last directory of the service location, lowercased, as the image name and reads `version` from `pom.xml` for the local build tag (`1.0.0-SNAPSHOT` if there is no pom). It builds for `linux/amd64` and verifies the deploy on the remote. diff --git a/scripts/README.md b/scripts/README.md index 911e5b7..e59d2b7 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -8,7 +8,7 @@ Construye la imagen nativa de Quarkus y la envía al daemon Docker de un host re ### Qué hace el flujo -1. Toma el nombre de la imagen de la última carpeta de la ubicación del servicio y lee `version` de [`pom.xml`](../pom.xml) para el tag, salvo que uses `--name` o `--tag`. Si no hay `pom.xml`, el tag es `1.0.0-SNAPSHOT`. +1. Toma el nombre de la imagen de la última carpeta de la ubicación del servicio, en minúsculas, y lee `version` de [`pom.xml`](../pom.xml) para el tag, salvo que uses `--name` o `--tag`. Si no hay `pom.xml`, el tag es `1.0.0-SNAPSHOT`. `--name` también se pasa a minúsculas. 2. Ejecuta `docker build` para la plataforma fija `linux/amd64` (útil si construyes desde un Mac arm64). Con `--type java` (el valor por defecto) usa [`src/main/docker/Dockerfile`](../src/main/docker/Dockerfile). Con `--type web` usa `Dockerfile` en la raíz del servicio. 3. Ejecuta `docker pussh` hacia el destino SSH indicado. 4. Comprueba por SSH que la imagen existe en el remoto (salvo `--no-verify`). @@ -60,18 +60,18 @@ Ayuda integrada (en inglés): |--------|-------------| | `--remote TARGET` | Destino SSH: `usuario@host[:puerto]` o un alias definido en `~/.ssh/config` (sin `@`). | -**Identidad de la imagen** (el nombre es la última carpeta del servicio; el tag sale de `pom.xml` si existe) +**Identidad de la imagen** (el nombre es la última carpeta del servicio, en minúsculas; el tag sale de `pom.xml` si existe) | Opción | Descripción | |--------|-------------| -| `--name NAME` | Nombre del repositorio de la imagen. | +| `--name NAME` | Nombre del repositorio de la imagen. Se guarda en minúsculas. | | `--tag TAG` | Tag de la imagen. | **Directorio de trabajo** | Opción | Descripción | |--------|-------------| -| `--project-dir PATH` | Raíz del servicio. El nombre de la imagen es su última carpeta. | +| `--project-dir PATH` | Raíz del servicio. El nombre de la imagen es su última carpeta, en minúsculas. | | `PROJECT_DIR` | Misma función vía entorno. | **Build** @@ -169,7 +169,7 @@ ssh deploy@prod.example.com \ "docker run -d --name --restart unless-stopped -p 8080:8080 :" ``` -Sustituye `` por la última carpeta de la ubicación del servicio (o el valor de `--name`) y `` por el tag del build (el de `pom.xml`, `1.0.0-SNAPSHOT` si no hay POM, o el de `--tag`). +Sustituye `` por la última carpeta de la ubicación del servicio en minúsculas (o el valor de `--name`, también en minúsculas) y `` por el tag del build (el de `pom.xml`, `1.0.0-SNAPSHOT` si no hay POM, o el de `--tag`). ### Solución de problemas @@ -219,7 +219,7 @@ Formato del archivo: una ruta por línea y, si hace falta, un segundo campo `jav ./portal web ``` -`java` usa `src/main/docker/Dockerfile`. `web` usa `Dockerfile` en la raíz del servicio. El nombre de la imagen es la última carpeta de esa ruta. El tag sale de `pom.xml` si existe; si no, es `1.0.0-SNAPSHOT`. +`java` usa `src/main/docker/Dockerfile`. `web` usa `Dockerfile` en la raíz del servicio. El nombre de la imagen es la última carpeta de esa ruta, en minúsculas. El tag sale de `pom.xml` si existe; si no, es `1.0.0-SNAPSHOT`. Se reenvían a cada servicio: `--ssh-key`, `--ssh-config`, `--skip-build`, `--no-verify` y `--cleanup`, más el `--type` de esa línea. No se aceptan `--name`, `--tag`, `--project-dir` ni `--type`. diff --git a/scripts/build-and-push.sh b/scripts/build-and-push.sh index 2261cb0..5cc3b67 100755 --- a/scripts/build-and-push.sh +++ b/scripts/build-and-push.sh @@ -67,14 +67,14 @@ Required: Image identity: --name NAME Image repository name (default: last directory of - the service location) + the service location, lowercased) --tag TAG Local build tag (pom.xml version by default, or 1.0.0-SNAPSHOT if there is no pom.xml). On the remote only :latest and vYYYY.MM.DD-HH.MM (UTC). Working directory (defaults to the parent of the script's directory): - --project-dir PATH Service root. The image name is its last directory - (override with env PROJECT_DIR) + --project-dir PATH Service root. The image name is its last directory, + lowercased (override with env PROJECT_DIR) Build options: --type java|web Dockerfile location. java (default): @@ -142,6 +142,11 @@ resolve_dockerfile() { esac } +# Docker repository names must be lowercase. ${var,,} needs bash 4+. +lowercase() { + printf '%s' "$1" | tr '[:upper:]' '[:lower:]' +} + # Last directory of the service location (cwd must already be that directory). image_name_from_location() { local dir @@ -149,7 +154,7 @@ image_name_from_location() { dir="${dir%/}" [[ -n "$dir" && "$dir" != "/" ]] \ || die "Cannot derive image name from project directory." - printf '%s' "${dir##*/}" + lowercase "${dir##*/}" } require() { @@ -408,7 +413,7 @@ push_via_registry_tunnel() { while [[ $# -gt 0 ]]; do case "$1" in --remote) REMOTE="$2"; shift 2 ;; - --name) IMAGE_NAME="$2"; shift 2 ;; + --name) IMAGE_NAME="$(lowercase "$2")"; shift 2 ;; --tag) IMAGE_TAG="$2"; shift 2 ;; --ssh-key) SSH_KEY="$2"; shift 2 ;; --ssh-config) SSH_CONFIG="$2"; shift 2 ;;