When xmllint is not in PATH, the grep fallback in read_pom() captured
both <artifactId> and <version> in a single multi-line string and
returned it for every call. Concatenating it with ':' produced an
invalid Docker tag like:
test-quarkus\n1.0.0-SNAPSHOT:test-quarkus\n1.0.0-SNAPSHOT
causing 'docker build' to fail with 'invalid reference format'.
Add a third 'tag' argument to read_pom() so the fallback extracts
only the requested element, and pass 'artifactId' / 'version' from
the call sites.
Also enrich pom.xml with <name> and <description> for Maven/IDE
metadata, without changing the image identity.
Tests cover the no-xmllint path explicitly (PATH stripped to
reproduce the vm-compilador environment) and the override path.
resolve_ssh_alias() used a case statement that only matched
'HostName' (capital N), but OpenSSH treats config directives
as case-insensitive: 'Hostname', 'HostName', 'HOSTNAME' and
'hostname' are all equivalent. A config like
Host retailpos-hites-qa
Hostname 10.60.16.35
User retailpos
IdentityFile ~/.ssh/retailpos-key
produced 'has no HostName' even though one was present.
Enable 'shopt -s nocasematch' around the parsing loop so the
case branches match any casing. nocasematch was chosen over
${var,,} because the latter requires bash 4+, and macOS still
ships bash 3.2.57 as /bin/bash.
The 'Host' pattern itself remains case-sensitive, matching
ssh's own behavior.
Verified against: tabbed/spaced/mixed indentation, lowercase,
uppercase, mixed-casing directives, the user's exact config,
and the previous regression cases.
resolve_ssh_alias() now extracts tokens with 'read -r', which
collapses tabs and spaces uniformly. Two bugs were at play:
1. The previous parser split on literal spaces
(key="${line%% *}") and used '${line#Host }' to drop the
Host directive, so configs that used tab indentation
(e.g. '\tHostName 10.60.16.35') ended up with key being the
whole line and never matching the case branches. Result:
'has no HostName in ~/.ssh/config' even when one was present.
2. The script's global IFS is $'\n\t' (no space), which made
'read' unable to split on spaces at all. Fixed by restoring
space-aware IFS locally inside the loop.
Verified against tabbed, spaced, mixed, indented-comment and
Host\tname configs; behavior with the original space-separated
configs is unchanged.
scripts/build-and-push.sh now parses ~/.ssh/config (or --ssh-config)
when --remote is a bare alias like 'prod'. It extracts HostName,
User, Port and IdentityFile from the matching Host block, falls back
to the current user / port 22, and uses the config IdentityFile when
--ssh-key is not given. --ssh-key always wins. The resolved target
is shown in the logs before any docker/pussh call, and is the form
passed to docker pussh and the verification ssh.
Wildcards, Include and Match directives are intentionally not handled:
ssh itself resolves them when the alias is passed through, but the
script logs the expanded target first for visibility.
- Resolve PROJECT_DIR from the script's own location by default
(works with absolute, relative and symlinked invocations)
- Allow override via --project-dir flag or PROJECT_DIR env var
- Improve error message for invalid --project-dir paths
- Update usage and README accordingly
scripts/build-and-push.sh builds the native image with the Mandrel
Dockerfile and pushes it to a remote Docker host via docker-pussh
(unregistry), transferring only missing layers over SSH.
- Name and tag default to pom.xml artifactId/version (overridable)
- Builds for linux/amd64; --skip-build to pussh only
- Verifies image presence on the remote after push and prints
a ready-to-use docker run hint
README updated with a 'Building and deploying natively' section.
- Add Dockerfile using Mandrel jdk-21 builder and quarkus-micro-image:2.0 runtime
- Run as non-root user 1001, expose 8080, set TZ=America/Santiago
- Bind http host to 0.0.0.0 for container networking
- Remove obsolete Quarkus-generated Dockerfiles (jvm, legacy-jar, native, native-micro)
- Tighten .dockerignore to ship only build inputs (mvnw, .mvn, pom.xml, src)
- Add api.http with /status and /q/health request samples
- Scaffold Quarkus 3.39.2 (Java 21, Maven) with rest-jackson and smallrye-health
- Add GET /status returning application uptime, version and JVM metrics
- Add ApplicationHealthCheck (@Readiness) exposing /q/health/ready
- Configure application name, version and health root path
- Cover endpoints with StatusResourceTest (@QuarkusTest + rest-assured)