Repository navigation
Expand file tree
/
Copy pathrelease.sh
More file actions
executable file
·202 lines (171 loc) · 6.26 KB
/
Copy pathrelease.sh
File metadata and controls
executable file
·202 lines (171 loc) · 6.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#!/bin/bash
#
# Compila y publica las imágenes Docker de FacturaScripts en Docker Hub.
#
# ./release.sh --stable 2026.5 --beta 2026.6
#
# Etiquetas que se publican:
# estable -> <version> + latest
# beta -> <version> + beta
#
set -euo pipefail
IMAGE="facturascripts/facturascripts"
PLATFORMS="linux/amd64,linux/arm64/v8,linux/arm/v7"
BUILDER="multiarch"
DOWNLOAD_URL="https://facturascripts.com/DownloadBuild/1"
STABLE=""
BETA=""
DRY_RUN=0
ASSUME_YES=0
BUMP=0
CWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
usage() {
cat <<EOF
Uso: $(basename "$0") [opciones]
Opciones:
-s, --stable VERSION Versión estable. Publica <VERSION> y latest.
-b, --beta VERSION Versión beta. Publica <VERSION> y beta.
-i, --image NOMBRE Repositorio de Docker Hub (por defecto: $IMAGE).
-p, --platforms LISTA Plataformas (por defecto: $PLATFORMS).
--builder NOMBRE Builder de buildx (por defecto: $BUILDER).
--bump Actualiza el ARG FS_VERSION del Dockerfile a la estable.
-n, --dry-run Muestra los comandos sin ejecutarlos.
-y, --yes No pide confirmación antes de publicar.
-h, --help Muestra esta ayuda.
Ejemplos:
$(basename "$0") --stable 2026.5 --beta 2026.6
$(basename "$0") --stable 2026.6 # solo estable
$(basename "$0") --beta 2026.7 --dry-run
EOF
}
die() { echo "Error: $*" >&2; exit 1; }
info() { echo ">> $*"; }
run() {
if [ "$DRY_RUN" -eq 1 ]; then
printf ' [dry-run]'; printf ' %q' "$@"; printf '\n'
else
"$@"
fi
}
while [ $# -gt 0 ]; do
case "$1" in
-s|--stable) [ $# -ge 2 ] || die "$1 necesita un valor"; STABLE="$2"; shift 2 ;;
-b|--beta) [ $# -ge 2 ] || die "$1 necesita un valor"; BETA="$2"; shift 2 ;;
-i|--image) [ $# -ge 2 ] || die "$1 necesita un valor"; IMAGE="$2"; shift 2 ;;
-p|--platforms) [ $# -ge 2 ] || die "$1 necesita un valor"; PLATFORMS="$2"; shift 2 ;;
--builder) [ $# -ge 2 ] || die "$1 necesita un valor"; BUILDER="$2"; shift 2 ;;
--bump) BUMP=1; shift ;;
-n|--dry-run) DRY_RUN=1; shift ;;
-y|--yes) ASSUME_YES=1; shift ;;
-h|--help) usage; exit 0 ;;
*) usage >&2; die "opción desconocida: $1" ;;
esac
done
[ -n "$STABLE" ] || [ -n "$BETA" ] || { usage >&2; die "indica al menos --stable o --beta"; }
[ -f "$CWD/Dockerfile" ] || die "no encuentro el Dockerfile en $CWD"
command -v docker >/dev/null || die "docker no está instalado"
docker buildx version >/dev/null 2>&1 || die "falta docker buildx (apt install docker-buildx)"
command -v curl >/dev/null || die "curl no está instalado"
# --- Comprobar que las versiones existen en facturascripts.com -----------------
verify_version() {
local version="$1" label="$2" result code type
result="$(curl -sIL --max-time 30 -o /dev/null -w '%{http_code} %{content_type}' \
"$DOWNLOAD_URL/$version" || true)"
code="${result%% *}"
type="${result#* }"
if [ "$code" != "200" ]; then
die "la versión $label '$version' no existe (HTTP $code en $DOWNLOAD_URL/$version)"
fi
case "$type" in
*zip*) ;;
*) die "la versión $label '$version' no devuelve un zip (Content-Type: $type)" ;;
esac
info "versión $label $version disponible"
}
[ -n "$STABLE" ] && verify_version "$STABLE" "estable"
[ -n "$BETA" ] && verify_version "$BETA" "beta"
# --- Planificar los builds ----------------------------------------------------
# Si la estable y la beta son la misma versión, se compila una sola vez con
# las cuatro etiquetas en lugar de subir la misma imagen dos veces.
PLAN_VERSIONS=()
PLAN_TAGS=()
if [ -n "$STABLE" ] && [ "$STABLE" = "${BETA:-}" ]; then
PLAN_VERSIONS+=("$STABLE")
PLAN_TAGS+=("$STABLE latest beta")
else
[ -n "$STABLE" ] && { PLAN_VERSIONS+=("$STABLE"); PLAN_TAGS+=("$STABLE latest"); }
[ -n "$BETA" ] && { PLAN_VERSIONS+=("$BETA"); PLAN_TAGS+=("$BETA beta"); }
fi
echo
echo "Se van a compilar y PUBLICAR en Docker Hub:"
for i in "${!PLAN_VERSIONS[@]}"; do
for tag in ${PLAN_TAGS[$i]}; do
echo " $IMAGE:$tag (FS_VERSION=${PLAN_VERSIONS[$i]})"
done
done
echo " plataformas: $PLATFORMS"
echo
if [ "$DRY_RUN" -eq 0 ] && [ "$ASSUME_YES" -eq 0 ]; then
read -r -p "¿Continuar? [s/N] " answer
case "$answer" in
s|S|y|Y|si|SI|Si|yes) ;;
*) echo "Cancelado."; exit 1 ;;
esac
fi
# --- Login en Docker Hub ------------------------------------------------------
if [ "$DRY_RUN" -eq 0 ]; then
if ! docker system info 2>/dev/null | grep -q '^ Username:'; then
info "no hay sesión en Docker Hub, ejecutando docker login"
docker login
fi
fi
# --- Preparar el builder multi-arquitectura -----------------------------------
if ! docker buildx inspect "$BUILDER" >/dev/null 2>&1; then
info "creando el builder '$BUILDER'"
run docker buildx create --name "$BUILDER" --driver docker-container
fi
info "arrancando el builder '$BUILDER'"
run docker buildx inspect --bootstrap "$BUILDER"
if [ "$DRY_RUN" -eq 0 ]; then
available="$(docker buildx inspect "$BUILDER" | grep -i '^Platforms:' || true)"
missing=""
IFS=',' read -ra wanted <<< "$PLATFORMS"
for platform in "${wanted[@]}"; do
# linux/arm64/v8 aparece como linux/arm64 en la lista del builder
short="$(echo "$platform" | cut -d/ -f1-2)"
case "$available" in
*"$short"*) ;;
*) missing="$missing $platform" ;;
esac
done
if [ -n "$missing" ]; then
echo "Error: el builder '$BUILDER' no soporta:$missing" >&2
echo "Instala los handlers de qemu, por ejemplo:" >&2
echo " docker run --privileged --rm tonistiigi/binfmt --install all" >&2
exit 1
fi
fi
# --- Compilar y publicar ------------------------------------------------------
for i in "${!PLAN_VERSIONS[@]}"; do
version="${PLAN_VERSIONS[$i]}"
build_args=(buildx build --builder "$BUILDER" --platform "$PLATFORMS" \
--build-arg "FS_VERSION=$version" --pull)
for tag in ${PLAN_TAGS[$i]}; do
build_args+=(-t "$IMAGE:$tag")
done
build_args+=(--push "$CWD")
echo
info "compilando y publicando $version -> ${PLAN_TAGS[$i]// /, }"
run docker "${build_args[@]}"
done
# --- Actualizar el Dockerfile -------------------------------------------------
if [ "$BUMP" -eq 1 ]; then
if [ -z "$STABLE" ]; then
echo "Aviso: --bump necesita --stable, no se toca el Dockerfile." >&2
else
info "actualizando ARG FS_VERSION del Dockerfile a $STABLE"
run sed -i -E "s|^ARG FS_VERSION=.*|ARG FS_VERSION=$STABLE|" "$CWD/Dockerfile"
fi
fi
echo
info "Terminado."